• THE TOP FILE(top文件详解)


    INTRODUCTION

    (1)top能实现一组机器部署不同业务环境,达到相互协调配合的工作。
    (2)top文件包含了计算机之间的映射关系以及配置文件角色的文件。
    (3)默认top文件被命名为top.sls,总是存在于包含state文件的目录层顶部,这种目录结构被称为目录树。


    A BASIC EXAMPLE

    Top文件包含3个组件:
      Environment:包含一组状态文件的状态树目录配置系统
      Target:一组机器将有一组状态适用于他们。
      State files:应用于target匹配机器的一组state文件列表,
    上面3个组件之间的关系;
      Environment包含Target,Target包含state files
    示例场景:
      base: #从定义好的base环境的根目录里面加载sls文件
       'web*': #从所有minion里面匹配到minion_id以web开头的minion
        - apache #应用apache.sls文件里面定义的状态配置


    ENVIRONMENTS

    包含一组sls文件的目录结构,通常只使用一个base环境,如果你需要使用多个版本的状态树的话建议你使用多环境


    GETTING STARTED WITH TOP FILES

    开始使用top文件,每一个environment环境被定义在file_roots这个配置项里面
    示例:

    1 file_roots:
    2   base:
    3     - /srv/salt
    4 top文件内容定义:
    5 base:
    6   '*':
    7     - core
    8     - edit
    View Code

    top文件定义的路径在/srv/salt下面,core和edit也应当位于该目录下


    MULTIPLE ENVIRONMENTS

    在一些生产环境中,它需要不同版本的state状态文件,实现分级部署,譬如测试,预发布,线上等
    示例:

    file_roots:

    1   dev:
    2     - /srv/salt/dev
    3   qa:
    4     - /srv/salt/qa
    5   prod:
    6     - /srv/salt/prod
    View Code

    top文件内容示例:

     1 dev:
     2   'webserver*':
     3     - webserver
     4   'db*':
     5     - db
     6 qa:
     7   'webserver*':
     8     - webserver
     9   'db*':
    10     - db
    11 prod:
    12   'webserver*':
    13     - webserver
    14   'db*':
    15     - db
    View Code

    在上面的例子中,每一个environment都需要配置一个目录,里面都包含一个top文件,里面配置有target与sls的映射关系。
    如果需要从dev环境逐步配置到prod环境,只需要将sls文件逐级进行拷贝到对应的环境目录中即可。


    CHOOSING AN ENVIRONMENT TO TARGET

    为environment指定匹配一个或一组有效的minion,设置合理的match规则,确保指定的minion应用指定的sls配置,使用state.show_top可以查看minion上的environment适配情况
    在salt, salt-call or salt-ssh命令行中,可以在运行时指定salt environment,利用saltenv参数来指定,如果只是在单一环境中运行可以使用这样的运行方式:salt '*' state.highstate saltenv=prod。
    注意:不是所有的函数都接收saltenv作为参数


    SHORTHAND

    如果在一组target中只分配了一个sls文件,可以使用如下简洁的配置方法

     1 base:
     2   '*': global
     3 dev:
     4   'webserver*': webserver
     5   'db*':        db
     6 qa:
     7   'webserver*': webserver
     8   'db*':        db
     9 prod:
    10   'webserver*': webserver
    11   'db*':        db
    View Code

    ADVANCED MINION TARGETING

    minion target进阶使用
    上面的例子中minion的匹配上是使用glob的,top文件中默认的匹配是复合类型匹配的,大多数情况下二者是不可区分的,但有一种minion ID中包含空格的时候,由于复合表达式是逐字进行匹配的,所以会匹配异常,这种情况下需要声明glob
    示例:

    1 base:
    2   'minion 1':
    3     - match: glob
    4     - foo  
    View Code

    以下是target可设置的匹配类型:
      glob 通配符,glob表示式匹配一个或多个minion,根据minion ID匹配,例如minion123或minion*。
      pcre perl正则表达式匹配,例如web[0-3].domain.com
      grain 匹配grains变量,使用通配符的方式,例如kernel:Linux or kernel:*BSD
      grain_pcre 使用pcre的方式匹配grains变量,kernel:(Free|Open)BSD
      list 使用逗号分隔的minion列表清单,minion1,minion2,minion3
      pillar 使用通配符的方式匹配pillar变量,role:webserver or role:web*
      pillar_pcre 使用pcre的方式匹配pillar变量,role:web(server|proxy
      pillar_exact不使用pcre和通配的方式匹配pillar,例如:role:webserver
      ipcidr 根据子网或IP地址进行匹配,例如172.17.0.0/16 or 10.2.9.80
      data 匹配值保持在目标数据库里面,需要创建和使用data执行模块
      range 使用范围值匹配,依赖额外的模块
      compound 使用复合类型匹配模式
      nodegroup 定义在master配置文件中的复合表达式组

    示例:

     1 base:
     2     'nag1* or G@role:monitoring':    #glob匹配以nag1开头的minion和grains role设置为monitoring的minion
     3         - nagios.server
     4 
     5     '*':                            #匹配所有minion
     6         - ldap-client
     7         - networking
     8         - salt.minion
     9                             
    10     '^(memcache|web).(qa|prod).loc$':    #使用正则方式匹配,以memcache或web开头,中间qa|prod,以loc结尾的minion ID匹配
    11         - match: pcre
    12         - nagios.mon.web
    13         - apache.server    
    14 
    15     'os:Ubuntu':                    #使用grains的变量匹配方法
    16         - match: grain
    17         - repos.ubuntu
    18     
    19     'os:(RedHat|CentOS)':            #使用grains正则的匹配方式
    20         - match: grain_pcre
    21         - repos.epel    
    22 
    23     'foo,bar,baz':                    #使用列表的方式
    24         - match: list
    25         - database
    26 
    27     'somekey:abc':                    #使用pillar变量的方式
    28         - match: pillar
    29         - xyz
    View Code

    HOW TOP FILES ARE COMPILED

    运行指定salt environment的highstate时,master会从top文件中分配指定的minion配置数据,minion再负责具体执行。
    当不指定salt运行环境的时候,minion会遍历每一个environment,每一个顶层文件都会被处理以确定哪些sls将要运行在哪些minion上,默认情况下每个环境中的sls配置都会被合并在一起。
    当时用gitfs的时候,利用分支作为环境目录,可能会导致意外的情况发生,这时候可以使用top_file_merging_strategy置same强制每一个环境使用自己使用自己的top文件,而不是合并掉。
    参考链接:http://hxzqlh.com/2016/05/07/Salt-States-%E5%9F%BA%E6%9C%AC%E6%B3%95-%E5%9B%9B/

    当使用多个环境时,不必为每个环境创建一个顶级文件。最容易维护的方法是将一个单独的top文件放在基本环境中。下面的minion配置选项如何影响top文件编译时没有环境指定,建议遵循以下四个环节来了解这些选项的工作:

      state_top_saltenv
      top_file_merging_strategy
      env_order
      default_top


    TOP FILE COMPILATION EXAMPLES

    /etc/salt/master:

    1 file_roots:
    2   base:
    3     - /srv/salt/base
    4   dev:
    5     - /srv/salt/dev
    6   qa:
    7     - /srv/salt/qa
    View Code

    /srv/salt/base/top.sls:

    1 base:
    2   '*':
    3     - base1
    4 dev:
    5   '*':
    6     - dev1
    7 qa:
    8   '*':
    9     - qa1
    View Code

    /srv/salt/dev/top.sls:

     1 base:
     2   'minion1':
     3     - base2
     4 dev:
     5   'minion2':
     6     - dev2
     7 qa:
     8   '*':
     9     - qa1
    10     - qa2
    View Code

    注意:qa环境没有配置top文件

    SCENARIO 1 - 指定dev环境
      指定dev环境运行,仅dev2 sls文件运行在minion2上,minion1无sls文件应用
      指定base环境运行,base2 sls文件将运行在所有minion上
      如果指定qa环境运行,执行high将会出现错误

    SCENARIO 2 - 不指定环境运行,TOP_FILE_MERGING_STRATEGY设置为merge
      base1, dev1, and qa1 state状态文件将会被应用到所有的minion中,如果qa环境没有被定义在/srv/salt/base/top.sls中,那么qa环境中将不会有任何state文件被应用

    SCENARIO 3 - 不指定环境运行,TOP_FILE_MERGING_STRATEGY设置为same
      在2016.11.0这一版中,same没有描述中的那么有效,新的版本已经修复
      base1将应用于所有minion中,相应的dev2将应用于minion2
      如果不设置default_top或设置为base,那么qa1 sls将应用在所有minion上,如果default_top设置为dev,那么qa1和qa2将应用到所有minion中

    SCENARIO 4 - 不指定环境运行,TOP_FILE_MERGING_STRATEGY设置为MERGE_ALL
      那么所有环境中的top都会被应用,base1被应用在所有minion上,base2将被应用在minion1上,对于dev环境,dev1会被应用在所有minion中,dev2将被应用在minion2中,qa1和qa2将被应用在所有minion中,注意qa1不会被应用两次

  • 相关阅读:
    来自于一个问题的回答对自己的反思 php怎么发送邮件?发送邮件插件PHPMailer
    如何在github上搭建一个免费的 无限流量的静态网页博客Github pages
    sass重构响应式unofficial‘s博客轻松适应移动端
    HTML5 audio元素如何使用js与jquery控制其事件
    javascript Uncaught ReferenceError: 方法名 is not defined
    JS下计算当前日期(当天)后N天出现NAN或者undefined的情况
    前端开发环境之GRUNT自动WATCH压缩JS文件与编译SASS文件环境下Ruby安装sass常见错误分析
    pycharm 语言配置
    基本动态集合
    windows下简单使用pip
  • 原文地址:https://www.cnblogs.com/solitarywares/p/7638013.html
Copyright © 2020-2023  润新知