24.6 grains
-
grains是在minion启动时收集到的一些信息,比如操作系统类型、网卡ip、内核版本、cpu架构等。
-
列出所有的grains项目名字:salt "client" grains.ls
-
列出所有grains项目以及值:salt "client" grains.items
grains的信息并不是动态的,并不会实时变更,它是在minion启动时收集到的。我们可以根据grains收集到的一些信息,做配置管理工作。
- grains支持自定义信息
1、在minion端上编辑配置文件;(增加自定义信息,格式是 键 : 值 形式)
[root@client ~]# [root@client ~]# vim /etc/salt/grains [root@client ~]# cat /etc/salt/grains role: nginx env: test
2、重启minion服务:systemctl restart salt-minion
3、回到master上,获取grains;salt '*' grains.item role env
[root@server ~]# salt '*' grains.item role env server: ---------- env: role: client: ---------- env: test role: nginx
获取不存在的grains信息,返回空值 [root@server ~]# salt '*' grains.item abcd efg server: ---------- abcd: efg: client: ---------- abcd: efg:
可以借助grains的一些属性信息来执行;可以起到一个匹配的作用;(salt -G role:nginx cmd.run 'hostname' )
[root@server ~]# salt -G role:nginx cmd.run 'hostname' client: client
24.7 saltstack – pillar
pillar和grains不一样,是在master上定义的,并且是针对minion定义的一些信息。像一些比较重要的数据(密码)可以存在pillar里,还可以定义变量等。
1、配置自定义pillar;vim /etc/salt/master
找到如下配置://去掉前面的#号
pillar_roots:
base: #此行前面有两个空格
- /srv/pillar #此行前面有4个空格
**注意保留空格**
2、重启salt-master服务;systemctl restart salt-master.service
3、创建/srv/pillar目录,并且编辑一个子配置文件用于测试;
[root@server ~]# mkdir /srv/pillar [root@server ~]# vim /srv/pillar/test.sls //添加的测试文件 [root@server ~]# cat /srv/pillar/test.sls conf: /etc/123.conf //添加的测试文件内容
4、编写主配置文件;vim /srv/pillar/top.sls
base: # 表示根
'client': # 主机名,缩进两个空格
- test # 加载哪个前缀的配置文件,缩进四个空格
5、重启salt-master服务;systemctl restart salt-master.service
6、当更改完pillar配置文件后,我们可以通过刷新pillar配置来获取新的pillar状态:salt '*' saltutil.refresh_pillar
[root@server ~]# salt '*' saltutil.refresh_pillar server: True client: True
- 验证:salt '*' pillar.item conf
[root@server ~]# salt '*' pillar.item conf client: ---------- conf: /etc/123.conf server: ---------- conf:
- pillar同样可以用来作为salt的匹配对象。比如 salt -I 'conf:/etc/123.conf' test.ping
[root@server ~]# salt -I 'conf:/etc/123.conf' test.ping client: True [root@server ~]# salt -I 'conf:/etc/test.conf' cmd.run "hostname" //不匹配则错误提示 No minions matched the target. No command was sent, no jid was assigned. ERROR: No return received
24.8 使用saltstack去安装httpd
- master上编辑配置文件:
[root@server ~]# vim /etc/salt/master [root@server ~]# vim /etc/salt/master # 搜索file_roots,去掉以下几行的注释,注意保留空格 file_roots: base: - /srv/salt [root@server ~]# systemctl restart salt-master.service #重启服务
- 创建目录及主配置文件
[root@server ~]# mkdir /srv/salt [root@server ~]# vim /srv/salt/top.sls base: '*': # *表示所有,前面有两个空格 - httpd # 前面有4个空格,表示在所有的客户端上执行httpd模块
- 增加子配置文件:
[root@server ~]# vim /srv/salt/httpd.sls httpd-service: # 服务的名称 pkg.installed: # saltstack内置模块,用于执行安装命令 - names: # names的值是需要安装的包的名称 - httpd # 安装httpd 包 - httpd-devel # 安装httpd-devel 包 service.running: # saltstack内置模块,用于启动服务 - name: httpd # 启动httpd服务 - enable: True # True表示开机启动 [root@server ~]# salt 'client' state.highstate
- minion端查看执行的yum命令
[root@client ~]# ps aux |grep yum root 1160 19.0 6.9 296588 70208 ? D 15:48 0:00 /usr/bin/python /usr/bin/yum -y install httpd root 1177 0.0 0.0 112676 980 pts/0 S+ 15:48 0:00 grep --color=auto yum
- master执行完成后,在minion端上可以看到已经安装成功
[root@client ~]# ps aux |grep httpd root 1381 0.1 0.4 223980 4976 ? Ss 15:48 0:00 /usr/sbin/httpd -DFOREGROUND apache 1382 0.0 0.2 223980 2960 ? S 15:48 0:00 /usr/sbin/httpd -DFOREGROUND apache 1383 0.0 0.2 223980 2960 ? S 15:48 0:00 /usr/sbin/httpd -DFOREGROUND apache 1384 0.0 0.2 223980 2960 ? S 15:48 0:00 /usr/sbin/httpd -DFOREGROUND apache 1385 0.0 0.2 223980 2960 ? S 15:48 0:00 /usr/sbin/httpd -DFOREGROUND apache 1388 0.0 0.2 223980 2960 ? S 15:48 0:00 /usr/sbin/httpd -DFOREGROUND root 1409 0.0 0.0 112676 984 pts/0 S+ 15:49 0:00 grep --color=auto httpd [root@client ~]# netstat -lntp |grep httpd tcp6 0 0 :::80 :::* LISTEN 1381/httpd
24.9 使用saltstack分发文件
saltstack有一个分发文件的功能,可以使用这个功能来批量分发一些文件到minion端上。我们需要在master端准备一个模板文件,并且进行相应的配置后,才能够进行分发。分发功能的好处在于,我们不需要自己一个个的将文件发送到master端上,只需要在master端执行一条命令就完成将文件发送到master端上的任务,减少了很多重复且无谓的工作。
- 在master上编辑配置文件:
[root@server ~]# vim /srv/salt/test.sls file_test: file.managed: - name: /tmp/example.com - source: salt://test/example/example.txt - user: root - group: root - mode: 600
注:
-
第一行的file_test为自定的名字,表示该配置段的名字,可以在别的配置段中引用它,
-
name指定分发到minion端上的哪个路径以及文件名称
-
source指定文件从哪里拷贝,这里的salt://test/example/example.txt相当于是/srv/salt/test/example/example.txt,
-
user和group指定文件的属主以及属组
-
mode则是指定文件的的权限
-
创建目录以及模板文件
[root@server ~]# mkdir -p /srv/salt/test/example [root@server ~]# vim /srv/salt/test/example/example.txt [root@server ~]# cat /srv/salt/test/example/example.txt test test!
- 编辑主配置文件
[root@server ~]# vim /srv/salt/top.sls # 修改为如下内容 base: '*': - test
- 执行命令,将模板文件分发到minion端上
[root@server ~]# salt 'client' state.highstate client: ---------- ID: file_test Function: file.managed Name: /tmp/example.com Result: True Comment: File /tmp/example.com updated Started: 16:15:18.365846 Duration: 67.243 ms Changes: ---------- diff: New file Summary for client ------------ Succeeded: 1 (changed=1) Failed: 0 ------------ Total states run: 1 Total run time: 67.243 ms
- 到minion端上查看分发过去的文件
[root@client ~]# ls -l /tmp/example.com -rw-------. 1 root root 11 10月 18 16:15 /tmp/example.com [root@client ~]# cat /tmp/example.com test test!
24.10 使用saltstack分发目录
除了分发文件外,很多情况下我们还需要分发目录。
在master上编辑子配置文件 [root@server ~]# vim /srv/salt/test_dir.sls
file_dir: file.recurse: - name: /tmp/testdir - source: salt://test/example - user: root - file_mode: 640 - dir_mode: 750
- mkdir: True - clean: True
注:
-
第一行的file_dir为自定的名字,表示该配置段的名字,可以在别的配置段中引用它,
-
name指定分发到minion端上的哪个路径以及文件名称
-
source指定文件从哪里拷贝,这里的salt://test/example 相当于是/srv/salt/test/example
-
user和group指定文件的属主以及属组
-
mode则是指定文件的的权限
-
dir_mode目录权限
-
mkdir: True 如果没有目录就创建
-
clean: True 加上它之后,源删除文件或目录,目标也会跟着删除,否则不会删除
-
修改主配置文件
[root@server ~]# vim /srv/salt/top.sls base: '*': - test_dir
- 执行以下命令分发目录:
[root@server ~]# salt 'client' state.highstate client: ---------- ID: file_dir Function: file.recurse Name: /tmp/testdir Result: True Comment: Recursively updated /tmp/testdir Started: 16:37:41.975561 Duration: 146.891 ms Changes: ---------- /tmp/testdir/example.txt: ---------- diff: New file mode: 0640 Summary for client ------------ Succeeded: 1 (changed=1) Failed: 0 ------------ Total states run: 1 Total run time: 146.891 ms
- 到minion端上查看分发过去的目录
[root@client ~]# ls /tmp/testdir/ example.txt [root@client ~]# ll /tmp/testdir/example.txt -rw-r-----. 1 root root 11 10月 18 16:37 /tmp/testdir/example.txt
注: saltstack不能分发空目录
24.11 配置管理远程命令
虽然我们可以使用cmd.run去远程执行命令,但是这样的效率太低,每次只能执行一条命令。所以我们需要批量远程执行命令来提高效率,实现批量远程执行命令我们需要使用到脚本,将这个脚本分发到各个minion端上执行,要执行这个脚本我们还得进行一些相应的配置。
- 在master上编辑子配置文件
[root@server ~]# vim /srv/salt/shell_test.sls # 增加以下内容 shell_test: cmd.script: - source: salt://test/example.sh - user: root
- 创建模板脚本文件
[root@server ~]# vim /srv/salt/test/example.sh #!/bin/bash touch /tmp/test.txt if [ ! -d /tmp/test ] then mkdir /tmp/test fi
- 更改top.sls内容
[root@server ~]# vim /srv/salt/top.sls base: '*': - shell_test
- 执行以下测试:
[root@server ~]# salt 'client' state.highstate
- 到client上检查测试文件
[root@client ~]# ls -l /tmp/test.txt -rw-r--r--. 1 root root 0 10月 18 16:54 /tmp/test.txt
24.12 配置管理计划任务
- 在master上编辑子配置文件
[root@server ~]# vim /srv/salt/cron_test.sls cron_test: cron.present: - name: /bin/touch/tmp/test_cron.txt # 需要执行的命令,也可以执行一个脚本 - user: root - minute: '*' # 分 - hour: 20 # 时 - daymonth: '*' # 日 - month: '*' # 月 - dayweek: '*' # 周
注:
- 需要用单引号引起来。
- 更改top.sls文件
[root@server ~]# vim /srv/salt/top.sls base: '*': - cron_test
- 执行命令测试
[root@server ~]# salt 'client' state.highstate
- 到client上检查测试结果
[root@client ~]# crontab -l # Lines below here are managed by Salt, do not edit # SALT_CRON_IDENTIFIER:/bin/touch/tmp/test_cron.txt * 20 * * * /bin/touch/tmp/test_cron.txt [root@client ~]#
删除cron
- 修改/srv/salt/cron_test.sls文件内容如下:
cron_test: cron.absent: - name: /bin/touch/tmp/test_cron.txt
- 执行命令测试
[root@server ~]# salt 'client' state.highstate
- 到client上检查测试结果
[root@client ~]# crontab -l # Lines below here are managed by Salt, do not edit
24.13 其他命令
- 拷贝master上的文件到客户端:cp.get_file
[root@server ~]# echo "test test" > /srv/salt/test/cp.txt [root@server ~]# salt 'client' cp.get_file salt://test/cp.txt /tmp/cp.txt client: /tmp/cp.txt
- 到client上检查测试结果
[root@client ~]# ls /tmp/cp.txt /tmp/cp.txt [root@client ~]# cat /tmp/cp.txt test test
- 拷贝目录:cp.get_dir
[root@server ~]# salt 'client' cp.get_dir salt://test/ /tmp/ client: - /tmp//test/cp.txt - /tmp//test/example.sh - /tmp//test/example/example.txt
- 到client上检查测试结果
[root@client ~]# ls /tmp/test cp.txt example example.sh
- 查看存活的minion
[root@server ~]# salt-run manage.up - client - server
- 执行shell脚本:cmd.script
[root@server ~]# salt 'client' cmd.script salt://test/example.sh client: ---------- pid: 3793 retcode: 0 stderr: stdout:
24.14 salt-ssh使用
salt-ssh不需要对客户端做认证,客户端也不用安装salt-minion或者启动什么服务,它类似ssh/expect
- 安装salt-ssh:
[root@server ~]# yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm [root@server ~]# yum install -y salt-ssh
- 编辑配置文件:
[root@server ~]# vim /etc/salt/roster # 文件末尾加上以下内容 client: host: 192.168.222.113 user: root passwd: ******
注:
-
client:主机名
-
host:登录的ip
-
user: 登录的用户
-
passwd: 用户的密码
-
执行命令测试:
[root@server ~]# salt-ssh --key-deploy '*' -r 'w' client: ---------- retcode: 254 stderr: stdout: The host key needs to be accepted, to auto accept run salt-ssh with the -i flag: The authenticity of host '192.168.222.113 (192.168.222.113)' can't be established. ECDSA key fingerprint is SHA256:wYze5ycgD9rMzbhqVkxphS0yHTJ2C1r/EEBMvIEU0xc. ECDSA key fingerprint is MD5:60:a7:f8:e1:85:e8:d3:01:ea:7a:24:02:c6:d0:11:08. Are you sure you want to continue connecting (yes/no)?
[root@server ~]# salt-ssh --key-deploy '*' -r 'w' client: ---------- retcode: 0 stderr: stdout: 11:56:31 up 20:26, 1 user, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.222.1 四15 37:03 0.11s 0.11s -bash
注:第一次执行的时候会自动把本机的公钥放到对方机器上,在这之后就可以把roster文件里面的密码给去掉。