
#######################分隔线####################
一、简介
saltstack 是一个新基础设施管理工具,可以看做是强化的Func+弱化puppet的组合,间接的反映出了saltstack的两大功能:远程执行命令与配置管理,
saltstack是使用python开发的,非常简单易用和轻量级的管理工具,由master和minion构成,通过ZeroMQ进行通信
二、安装
安装时需要epel源的支持,请自行安装与当系统匹配的epel源
*:安装依赖包
1
<code>yum </code><code>install</code> <code>python-jinja2 -y</code>
1、安装master端
<code>yum -y </code><code>install</code> <code>salt-master enablerepr=epel-testing</code>
2、安装minion端
<code>yum -y </code><code>install</code> <code>salt-minion enablerepr=epel-testing</code>
三、配置环境
a、master
1、修改本地绑定地址
<code>sed</code> <code>-ie </code><code>'s/^#.*interface:.*/\ interface: 192.168.2.65/g'</code> <code>/etc/salt/master</code>
注:或是此处写上主机名,并绑定/etc/hosts文件
2、自动接收所有minion的请求
<code>sed</code> <code>-ie </code><code>'s@^#\(auto_accept: \)False@\ \1true@g'</code> <code>/etc/salt/master</code>
b、minion
1、指向master
<code>sed</code> <code>-ie </code><code>'s@^#.*master:.*@\ master: salt@g'</code> <code>/etc/salt/minion</code>
注:由于saltstack配置文件所限,当启用每一个配置参数时对格式有严格要求,书写时请注意
四、环境测试
1、分别在master/minion中启动服务
2
3
<code>#service salt-master start</code>
<code>#service salt-minion start</code>
说明:
saltstack的master监听于4505,minion监听于4506;
可以将master与minion部署同一台服务器上(没有什么意义[哈哈~])。
2、salt 测试
4
5
<code>[root@openapi php-fpm]</code><code># salt "*" test.ping</code>
<code>192.168.2.36-CentOS.backup.</code><code>test</code><code>.backend:</code>
<code> </code><code>True</code>
<code>192.168.2.30-centos.public.</code><code>test</code><code>:</code>
说明:salt的其它命令可用salt --help很简单,在此不多介绍
五、salt 常用的正则表达式(部分)
a、E:正则匹配
<a href="http://s3.51cto.com/wyfs02/M02/70/80/wKioL1W4_f7i-jLPAACz8jBS0LA203.jpg" target="_blank"></a>
可以在每一个句后面加一个 -l debug来显示命令具体执行过程
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<code>[root@openapi self_userd]</code><code># salt -E '(backend81)' test.ping</code>
<code>backend81:</code>
<code>[root@openapi self_userd]</code><code># salt -E '(backend81)' test.ping -l debug</code>
<code>[DEBUG ] Reading configuration from </code><code>/etc/salt/master</code>
<code>[DEBUG ] Guessing ID. The </code><code>id</code> <code>can be explicitly </code><code>in</code> <code>set</code> <code>/etc/salt/minion</code>
<code>[INFO ] Found minion </code><code>id</code> <code>from generate_minion_id(): openapi.</code><code>test</code><code>.dns.com.cn</code>
<code>[DEBUG ] Missing configuration </code><code>file</code><code>: ~/.saltrc</code>
<code>[DEBUG ] Configuration </code><code>file</code> <code>path: </code><code>/etc/salt/master</code>
<code>[DEBUG ] MasterEvent PUB socket URI: ipc:</code><code>///var/run/salt/master/master_event_pub</code><code>.ipc</code>
<code>[DEBUG ] MasterEvent PULL socket URI: ipc:</code><code>///var/run/salt/master/master_event_pull</code><code>.ipc</code>
<code>[DEBUG ] LazyLoaded local_cache.get_load</code>
<code>[DEBUG ] get_iter_returns </code><code>for</code> <code>jid 20150727212822728009 sent to </code><code>set</code><code>([</code><code>'backend81'</code><code>]) will timeout at 21:28:27.732956</code>
<code>[DEBUG ] jid 20150727212822728009 </code><code>return</code> <code>from backend81</code>
<code>[DEBUG ] jid 20150727212822728009 found all minions </code><code>set</code><code>([</code><code>'backend81'</code><code>])</code>
b、-L :命令行里面一般是以列表的形式来指定对象的。
c、-G:这个参数很强大,会根据默认的grain的结果来过滤。(grains也可以自己定义)
<a href="http://s3.51cto.com/wyfs02/M02/70/83/wKiom1W4_X6xGjf0AACqkBNK2kM670.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M00/70/80/wKioL1W4_4Oiz6lcAACmVYdhGlY139.jpg" target="_blank"></a>
d、-N:这个参数是基于分组的,前提是你得先分好组。(分组可以定义于主匹配文件/etc/salt/master中,也可以定义于/etc/salt/master.d/*.conf)
<a href="http://s3.51cto.com/wyfs02/M02/70/80/wKioL1W5ADKxFDpLAAHISTdTPI8672.jpg" target="_blank"></a>
然后可以这样使用
<a href="http://s3.51cto.com/wyfs02/M01/70/83/wKiom1W4_mOzPyZWAABgST-EzN4712.jpg" target="_blank"></a>
e、-C :表示tagger可是一个复合语句
<code>[root@openapi salt]</code><code># salt -C 'G@virtual:physical and E@backend81' test.ping </code>
f、-b :一次操作多少台,也可以使使用百分比来操作(--batch-size)
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<code>[root@openapi salt]</code><code># salt "*" -b 3 grains.item os</code>
<code>#salt "*" --batch-size 25% grains.item os</code>
<code>36 Detected </code><code>for</code> <code>this batch run</code>
<code>backend81 Detected </code><code>for</code> <code>this batch run</code>
<code>backend84 Detected </code><code>for</code> <code>this batch run</code>
<code>zabbix.server.dns.com.cn Detected </code><code>for</code> <code>this batch run</code>
<code>backend83 Detected </code><code>for</code> <code>this batch run</code>
<code>webdata.backup Detected </code><code>for</code> <code>this batch run</code>
<code> </code>
<code>Executing run on [</code><code>'zabbix.server.dns.com.cn'</code><code>, </code><code>'webdata.backup'</code><code>, </code><code>'backend84'</code><code>]</code>
<code>webdata.backup:</code>
<code> </code><code>----------</code>
<code> </code><code>os:</code>
<code> </code><code>CentOS</code>
<code>backend84:</code>
<code>zabbix.server.dns.com.cn:</code>
<code>Executing run on [</code><code>'backend83'</code><code>, </code><code>'backend81'</code><code>, </code><code>'36'</code><code>]</code>
<code>backend83:</code>
<code>36:</code>
注:
更多的模块使用说明可以使用
<code>salt \* sys.doc |</code><code>grep</code> <code><模块名称></code>
salt 的每一个子命令都可以用-d来查看具体的用法
六、自定义grains
1、grains的优先级
grains可以保持在minion端、通过master端下发等多个方式来分发。但不同的方法有不同的优先级的:
a. /etc/salt/grains
b. /etc/salt/minion
c./srv/salt/_grains/ master端_grains目录下
优先级顺序依次为存在在minion端/etc/salt/minion配置文件中的同名grains会覆盖/etc/salt/grains文件中的值,而通过master端_grains目录下grains文件下发的值可以会覆盖minion端的所有同名值。比较拗口,总之记得,通过master下发的grains优先级是最高的可,/etc/salt/minion次之,/etc/salt/grains最低(core grains不大懂,就不讨论了,这个比/etc/salt/grains还低)
2、自定义grains
注:
a、首先要在master端的主匹配文件中开启file_roots
<code> </code><code>file_roots:</code>
<code> </code><code>base:</code>
<code> </code><code>- </code><code>/srv/salt</code>
b、如果没有以上目录,创建即可(此处使用_grains目录)
<code>[root@openapi _grains]</code><code># pwd</code>
<code>/srv/salt/_grains</code>
c、自定义grains字典
<code>[root@openapi _grains]</code><code># cat ports.py </code>
<code>#!/usr/bin/env python </code>
<code>#coding:utf8</code>
<code>def</code> <code>open_moutil_port ():</code>
<code> </code><code>grains</code><code>=</code><code>{}</code>
<code> </code><code>grains[</code><code>'web_port'</code><code>]</code><code>=</code><code>'80'</code>
<code> </code><code>grains[</code><code>'mysql_path'</code><code>]</code><code>=</code><code>'/data/mysql'</code>
<code> </code><code>grains[</code><code>'mysqld_port'</code><code>]</code><code>=</code><code>'3307'</code>
<code> </code><code>grains[</code><code>'max_open_file'</code><code>]</code><code>=</code><code>'65535'</code>
<code> </code><code>return</code> <code>grains</code>
d、同步grains并重新加载grains(grains是“静态”的,是每一个minion接入到master自动提交的)
<code>[root@openapi _grains]</code><code># salt "*" saltutil.sync_all</code>
<code> </code><code>beacons:</code>
<code> </code><code>grains:</code>
<code> </code><code>modules:</code>
<code> </code><code>outputters:</code>
<code> </code><code>renderers:</code>
<code> </code><code>returners:</code>
<code> </code><code>states:</code>
<code> </code><code>utils:</code>
<code>[root@openapi _grains]</code><code># salt '*' sys.reload_modules</code>
e、查询自定义的grains
<code>[root@openapi _grains]</code><code># salt "*" grains.item web_port</code>
<code> </code><code>web_port:</code>
<code> </code><code>80</code>
七、LNMP环境
1、目录结构如下:
<code>[root@openapi salt]</code><code># tree</code>
<code>.</code>
<code>├── _grains</code>
<code>│ └── ports.py</code>
<code>├── lnmp.sls</code>
<code>├── mysql</code>
<code>│ ├── installed.sls</code>
<code>│ └── my.cnf</code>
<code>├── nginx</code>
<code>│ ├── default.conf</code>
<code>│ └── installed.sls</code>
<code>├── php-fpm</code>
<code>│ ├── index.php</code>
<code>└── </code><code>top</code><code>.sls</code>
a、top文件(此文件必须存在,它定义了各minion的执行规划)
<code>[root@openapi salt]</code><code># cat top.sls </code>
<code>base:</code>
<code> </code><code>'192.168.2.30-centos.public.test'</code><code>: </code><code>#此处可以写组、正则、或minion;匹配目标</code>
<code> </code><code>- nginx.installed </code><code>#这表示到那一个目录下的那一个文件 ,此部分表示在30安装nginx,php-fpm</code>
<code> </code><code>- php-fpm.installed </code>
<code> </code><code>'192.168.2.36-CentOS.backup.test.backend'</code><code>:</code>
<code> </code><code>- mysql.installed </code><code>#在2.36上安装mysql-server</code>
b、nginx目录下的文件
<code>[root@openapi nginx]</code><code># ll</code>
<code>total 8</code>
<code>-rw-r--r-- 1 sysadmin sysadmin 1102 Jul 29 21:50 default.conf </code>
<code>#nginx 默认的配置文件,只改了root目录为/var/www/html,其它地方与/etc/nginx/conf.d/default完全一样</code>
<code>-rw-r--r-- 1 root root 360 Jul 29 23:23 installed.sls </code>
<code>#操作文件 </code>
<code>[root@openapi nginx]</code><code># cat installed.sls </code>
<code>nginx: </code><code>#id </code>
<code> </code><code>pkg.installed: </code><code>#使用pkg安装包,installed表示要安装完成,也可以指定版本来保证所有环境使用同一版本软件包</code>
<code> </code><code>- name: nginx </code><code>#包名,如果没有将继承id名称</code>
<code> </code><code>service.running: </code><code>#服务状态</code>
<code> </code><code>- </code><code>enable</code><code>: True </code><code>#是否启动</code>
<code> </code><code>- reload: True </code><code>#重新载入</code>
<code> </code><code>- </code><code>watch</code><code>: </code><code>#监控文件</code>
<code> </code><code>- </code><code>file</code><code>: </code><code>/etc/nginx/conf</code><code>.d</code><code>/default</code><code>.conf </code><code>#如果此文件发生变化将文件重新装载到服务中</code>
<code> </code><code>- require: </code><code>#依赖</code>
<code> </code><code>- pkg: nginx </code><code>#包名</code>
<code> </code><code>file</code><code>.managed: </code><code>#文件操作</code>
<code> </code><code>- name: </code><code>/etc/nginx/conf</code><code>.d</code><code>/default</code><code>.conf </code><code>#文件名</code>
<code> </code><code>- </code><code>source</code><code>: salt:</code><code>//nginx/default</code><code>.conf </code><code>#base下那一个文件</code>
<code> </code><code>- user: nginx </code><code>#用户</code>
<code> </code><code>- group: root </code><code>#组</code>
<code> </code><code>- mode: 644 </code><code>#权限</code>
<code> </code><code>- backup: minion </code><code>#将上一个版本的文件备份。(如果有的话)</code>
<code> </code><code>- require: </code><code>#依赖</code>
<code> </code><code>- pkg: nginx</code>
c、mysql目录下的文件
<code>[root@openapi mysql]</code><code># ll</code>
<code>-rw-r--r-- 1 root root 434 Jul 29 23:07 installed.sls </code><code>#操作文件</code>
<code>-rw-r--r-- 1 sysadmin sysadmin 775 Jul 29 22:26 my.cnf </code><code>#默认的匹配文件</code>
<code>[root@openapi mysql]</code><code># cat installed.sls </code>
<code>mysql-server:</code>
<code> </code><code>pkg.installed:</code>
<code> </code><code>- name: mysql-server</code>
<code> </code><code>service.running:</code>
<code> </code><code>- name: mysqld</code>
<code> </code><code>- </code><code>enable</code><code>: True</code>
<code> </code><code>- reload: True</code>
<code> </code><code>- </code><code>watch</code><code>:</code>
<code> </code><code>- </code><code>file</code><code>: </code><code>/etc/my</code><code>.cnf</code>
<code> </code><code>- require:</code>
<code> </code><code>- pkg: mysql-server</code>
<code> </code><code>file</code><code>.managed:</code>
<code> </code><code>- name: </code><code>/etc/my</code><code>.cnf</code>
<code> </code><code>- </code><code>source</code><code>: salt:</code><code>//mysql/my</code><code>.cnf</code>
<code> </code><code>- user: mysql</code>
<code> </code><code>- group: mysql</code>
<code> </code><code>- mode: 644</code>
<code> </code><code>- backup: minion</code>
<code>mysql:</code>
<code> </code><code>pkg.installed:</code>
<code> </code><code>- name: mysql</code>
<code> </code>
<code>myslq-devel:</code>
<code> </code><code>- name: mysql-devel</code>
d、php-fpm目录下的文件
<code>[root@openapi php-fpm]</code><code># ll</code>
<code>-rw-r--r-- 1 root root 22 Jul 29 22:35 index.php</code>
<code>-rw-r--r-- 1 root root 351 Jul 29 23:34 installed.sls</code>
<code>[root@openapi php-fpm]</code><code># cat index.php #php测试页面</code>
<code><?php</code>
<code> </code><code>phpinfo()</code>
<code>?></code>
<code>[root@openapi php-fpm]</code><code># cat installed.sls </code>
<code>php-xcache:</code>
<code> </code><code>- name: php-xcache</code>
<code>php-fpm:</code>
<code> </code><code>- name: php-fpm</code>
<code> </code><code>service.running:</code>
<code> </code><code>- </code><code>enable</code><code>: Ture</code>
<code> </code><code>- require:</code>
<code> </code><code>- pkg: php-fpm</code>
<code> </code><code>file</code><code>.managed:</code>
<code> </code><code>- name: </code><code>/var/www/html/index</code><code>.php</code>
<code> </code><code>- </code><code>source</code><code>: salt:</code><code>//php-fpm/index</code><code>.php</code>
<code> </code><code>- user: nginx</code>
<code> </code><code>- group: root</code>
<code> </code><code>- mode: 644</code>
<code> </code><code>- require:</code>
<code> </code><code>- pkg: php-fpm</code>
注:在php-fpm中的installed.sls如果需要的模块不是php-fpm依赖的必需定义到phf-fpm之前,如果先安装完成php-fpm后安装所需要的php模块,还要重新reloadphp-fpm服务才能生效
e、定义顺序文件
lnmp环境一般要先行安装数据库-->web服务-->php-fpm所以要定义一下两台不同服务执行执行顺序。
<code>[root@openapi salt]</code><code># pwd</code>
<code>/srv/salt</code>
<code>[root@openapi salt]</code><code># cat lnmp.sls </code>
<code>db_setup: </code><code>#id </code>
<code> </code><code>salt.state: </code><code>#状态</code>
<code> </code><code>- tgt: </code><code>'192.168.2.36-CentOS.backup.test.backend'</code> <code>#目标与base定义的一样</code>
<code> </code><code>- highstate: True </code>
<code>web_setup:</code>
<code> </code><code>salt.state:</code>
<code> </code><code>- tgt: </code><code>'192.168.2.30-centos.public.test'</code>
<code> </code><code>- highstate: True</code>
<code> </code><code>- salt: db_setup</code>
2、执行操作
<code>salt-run state.orchestrate lnmp</code>
注: 也可以使用如下命令测试
<code>salt-run state.orchestrate lnmp </code><code>test</code><code>=Ture</code>
剩下说等待操作完成了
3、最络执行结果
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<code>[root@openapi nginx]</code><code># salt-run state.orchestrate lnmp</code>
<code>openapi.</code><code>test</code><code>.dns.com.cn_master:</code>
<code>----------</code>
<code> </code><code>ID: db_setup</code>
<code> </code><code>Function: salt.state</code>
<code> </code><code>Result: True</code>
<code> </code><code>Comment: States ran successfully. No changes made to 192.168.2.36-CentOS.backup.</code><code>test</code><code>.backend.</code>
<code> </code><code>Started: 23:27:11.401701</code>
<code> </code><code>Duration: 3533.27 ms</code>
<code> </code><code>Changes: </code>
<code> </code><code>ID: web_setup</code>
<code> </code><code>Comment: States ran successfully. Updating 192.168.2.30-centos.public.</code><code>test</code><code>.</code>
<code> </code><code>Started: 23:27:14.936140</code>
<code> </code><code>Duration: 46763.368 ms</code>
<code> </code><code>192.168.2.30-centos.public.</code><code>test</code><code>:</code>
<code> </code><code>----------</code>
<code> </code><code>ID: nginx</code>
<code> </code><code>Function: pkg.installed</code>
<code> </code><code>Result: True</code>
<code> </code><code>Comment: Package nginx is already installed.</code>
<code> </code><code>Started: 23:29:08.840872</code>
<code> </code><code>Duration: 971.023 ms</code>
<code> </code><code>Changes: </code>
<code> </code><code>Function: </code><code>file</code><code>.managed</code>
<code> </code><code>Name: </code><code>/etc/nginx/conf</code><code>.d</code><code>/default</code><code>.conf</code>
<code> </code><code>Comment: File </code><code>/etc/nginx/conf</code><code>.d</code><code>/default</code><code>.conf is </code><code>in</code> <code>the correct state</code>
<code> </code><code>Started: 23:29:09.816842</code>
<code> </code><code>Duration: 5.82 ms</code>
<code> </code><code>Function: service.running</code>
<code> </code><code>Comment: Service nginx is already enabled, and is </code><code>in</code> <code>the desired state</code>
<code> </code><code>Started: 23:29:09.822994</code>
<code> </code><code>Duration: 273.52 ms</code>
<code> </code><code>ID: php-fpm</code>
<code> </code><code>Comment: The following packages were installed</code><code>/updated</code><code>: php-fpm</code>
<code> </code><code>Started: 23:29:10.097200</code>
<code> </code><code>Duration: 26085.157 ms</code>
<code> </code><code>----------</code>
<code> </code><code>php-fpm:</code>
<code> </code><code>----------</code>
<code> </code><code>new:</code>
<code> </code><code>5.3.3-46.el6_6</code>
<code> </code><code>old:</code>
<code> </code>
<code> </code><code>Comment: Started Service php-fpm</code>
<code> </code><code>Started: 23:29:36.192137</code>
<code> </code><code>Duration: 301.652 ms</code>
<code> </code><code>True</code>
<code> </code><code>Name: </code><code>/var/www/html/index</code><code>.php</code>
<code> </code><code>Comment: File </code><code>/var/www/html/index</code><code>.php updated</code>
<code> </code><code>Started: 23:29:36.499508</code>
<code> </code><code>Duration: 23.542 ms</code>
<code> </code><code>diff</code><code>:</code>
<code> </code><code>New </code><code>file</code>
<code> </code><code>mode:</code>
<code> </code><code>0644</code>
<code> </code><code>user:</code>
<code> </code><code>nginx</code>
<code> </code><code>ID: php-xcache</code>
<code> </code><code>Comment: The following packages were installed</code><code>/updated</code><code>: php-xcache</code>
<code> </code><code>Started: 23:29:36.527960</code>
<code> </code><code>Duration: 16844.534 ms</code>
<code> </code><code>php-xcache:</code>
<code> </code><code>3.0.4-1.el6</code>
<code> </code>
<code> </code><code>Summary</code>
<code> </code><code>------------</code>
<code> </code><code>Succeeded: 7 (changed=4)</code>
<code> </code><code>Failed: 0</code>
<code> </code><code>Total states run: 7</code>
<code>Summary</code>
<code>------------</code>
<code>Succeeded: 2 (changed=1)</code>
<code>Failed: 0</code>
<code>Total states run: 2</code>
温馨提示:在卸载软件包时,千万不要用yum、yum、yum.
a、查看服务状态
<code>[root@openapi salt]</code><code># salt "192.168.2.36-CentOS.backup.test.backend" service.status mysqld</code>
<code> </code><code>Ture</code>
<code>[root@openapi salt]</code><code># salt "192.168.2.30-centos.public.test" service.status nginx</code>
<code>[root@openapi salt]</code><code># salt "192.168.2.30-centos.public.test" service.status php-fpm</code>
b、测试php
ps:
其它了服务也是同理,是重要的是注意操作文件的格式及服务执行的先后顺序。
下次更新来个源码的及pillar的使用!回家,碎觉~
本文转自 jinlinger 51CTO博客,原文链接:http://blog.51cto.com/essun/1679860,如需转载请自行联系原作者