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
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
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
在上面的例子中,每一个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
ADVANCED MINION TARGETING
minion target进阶使用
上面的例子中minion的匹配上是使用glob的,top文件中默认的匹配是复合类型匹配的,大多数情况下二者是不可区分的,但有一种minion ID中包含空格的时候,由于复合表达式是逐字进行匹配的,所以会匹配异常,这种情况下需要声明glob
示例:
1 base: 2 'minion 1': 3 - match: glob 4 - foo
以下是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
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
/srv/salt/base/top.sls:
1 base: 2 '*': 3 - base1 4 dev: 5 '*': 6 - dev1 7 qa: 8 '*': 9 - qa1
/srv/salt/dev/top.sls:
1 base: 2 'minion1': 3 - base2 4 dev: 5 'minion2': 6 - dev2 7 qa: 8 '*': 9 - qa1 10 - qa2
注意: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不会被应用两次