saltstack grains
grains是在minion启动时收集到的一些信息,比如操作系统类型、网卡ip、内核版本、cpu架构等,grains的信息并不是动态的,并不会实时变更,它是在minion启动时收集到的,可以根据grains收集到的一些信息,做配置管理工作
列出指定minion端所有的grains项目名:
[root@linux01 ~]# salt 'linux02' grains.ls
列出指定minion端所有的grains项目名和对应的值:
[root@linux01 ~]# salt 'linux02' grains.items
自定义grains信息
在minion端添加配置文件:
[root@linux02 ~]# vi /etc/salt/grains
配置文件内容:
name: web
#grains项目名name,值web,注意值前面需要有个空格
重启minion服务:
[root@linux02 ~]# systemctl restart salt-minion
在master端获取该自定义项目的值:
[root@linux01 ~]# salt 'linux02' grains.item name
linux02:
----------
name:
web
针对自定义grains执行命令:
[root@linux01 ~]# salt -G name:web cmd.run 'hostname;uptime'
linux02:
linux02
14:30:53 up 21:04, 2 users, load average: 0.40, 0.26, 0.27
说明:grains的主要作用就是针对多台属性相同的机器,设置相同的自定义grains值,实现saltstack批量执行命令,例如:多台数据库机器可以定义grains值为name:db,多台redis机器可以定义grains值为name:redis,即可通过saltstack批量操作多台机器
saltstack pillar
pillar和grains相似但不一样,pillar是在master端定义的,并且是针对minion定义的一些信息,像一些比较重要的数据(密码)可以存在pillar里,还可以定义变量等
在master端编辑配置文件:
[root@linux01 ~]# vim /etc/salt/master
去掉以下配置项前面的注释:
#保持默认的第二行2个空格,第三行4个空格,否则会出错
创建配置文件目录:
[root@linux01 ~]# mkdir /srv/pillar
创建子配置文件:
[root@linux01 ~]# vi /srv/pillar/test.sls
配置文件内容:
name: db
继续创建子配置文件:
[root@linux01 ~]# vi /srv/pillar/test2.sls
配置文件内容:
name: server
创建主配置文件:
[root@linux01 ~]# vi /srv/pillar/top.sls
文件内容:
base:
'linux02':
- test
'linux01':
- test2
#指定主机名hostname绑定对应的子配置文件,需要注意格式:主机名前面2个空格,子配置文件名前面4个空格
刷新pillar:
[root@linux01 ~]# salt '*' saltutil.refresh_pillar
linux02:
True
linux01:
True
验证:
[root@linux01 ~]# salt '*' pillar.item name
linux02:
----------
name:
db
linux01:
----------
name:
server
用作salt工具的匹配对象,批量操作多台机器:
[root@linux01 ~]# salt -I name:db cmd.run 'who'
linux02:
root pts/0 Dec 26 16:59 (192.168.234.1)
root pts/1 Dec 27 13:47 (192.168.234.1)
注意:当自定义grains或pillar项含义特殊符号时,用作salt工具匹配时,需要使用单引号括起来
saltstack批量安装软件包
在master端编辑配置文件:
[root@linux01 ~]# vi /etc/salt/master
去掉以下配置项的注释:
创建配置文件目录:
[root@linux01 ~]# mkdir /srv/salt
以批量安装Apache为例,创建子配置文件:
[root@linux01 ~]# vi /srv/salt/httpd.sls
配置文件内容:
httpd-service:
pkg.installed:
- names:
- httpd
- httpd-devel
service.running:
- name: httpd
- enable: True
说明:httpd-service自定义的名字,pkg.installed 为saltstack的包安装函数,names下面是要安装的包的名字,service.running也是一个saltstack的函数,表示要启动的服务,enable表示开机启动
创建主配置文件:
[root@linux01 ~]# vi /srv/salt/top.sls
配置文件内容:
base:
'*':
- httpd
#*号表示所有主机,httpd为子配置文件名称
重启master服务:
[root@linux01 ~]# systemctl restart salt-master
在指定的minion端安装:
[root@linux01 ~]# salt linux02 state.highstate
linux02:
----------
ID: httpd-service
Function: pkg.installed
Name: httpd
Result: True
Comment: All specified packages are already installed
Started: 15:58:40.565875
Duration: 2126.73 ms
Changes:
----------
ID: httpd-service
Function: pkg.installed
Name: httpd-devel
Result: True
Comment: All specified packages are already installed
Started: 15:58:42.693203
Duration: 43.204 ms
Changes:
----------
ID: httpd-service
Function: service.running
Name: httpd
Result: True
Comment: The service httpd is already running
Started: 15:58:42.739355
Duration: 107.608 ms
Changes:
Summary for linux02
------------
Succeeded: 3
Failed: 0
------------
Total states run: 3
Total run time: 2.278 s
在minion端查看进程:
[root@linux02 ~]# ps aux |grep httpd
root 18385 0.1 0.4 224056 5012 ? Ss 15:57 0:00 /usr/sbin/httpd -DFOREGROUND
apache 18410 0.0 0.2 224056 2944 ? S 15:57 0:00 /usr/sbin/httpd -DFOREGROUND
apache 18411 0.0 0.2 224056 2944 ? S 15:57 0:00 /usr/sbin/httpd -DFOREGROUND
apache 18412 0.0 0.2 224056 2944 ? S 15:57 0:00 /usr/sbin/httpd -DFOREGROUND
apache 18413 0.0 0.2 224056 2944 ? S 15:57 0:00 /usr/sbin/httpd -DFOREGROUND
apache 18418 0.0 0.2 224056 2944 ? S 15:57 0:00 /usr/sbin/httpd -DFOREGROUND
root 18575 0.0 0.0 112728 972 pts/1 R+ 15:58 0:00 grep --color=auto httpd
#安装成功,在多台机器安装只需将匹配对象改为*或者使用自定义的grains/pillar项即可
saltstack批量分发文件
当多台机器的某个配置文件需要更改时,通过saltstack批量分发新的配置文件到所有机器上
在master端添加测试文件:
[root@linux01 ~]# echo "ok" > /srv/salt/1.txt
创建子配置文件:
[root@linux01 ~]# vi /srv/salt/file.sls
配置文件内容:
file_test:
file.managed:
- name: /tmp/test.conf
- source: salt://1.txt
- user: root
- group: root
- mode: 600
说明:第一行的file_test为自定义的名字,表示该配置段的名字,将master端/srv/salt/1.txt文件分发到minion端的/tmp目录下,并命名为test.conf,如果minion端已存在test.conf,则会更新该文件的内容
编辑主配置文件:
[root@linux01 ~]# vi /srv/salt/top.sls
内容:
base:
'*':
- file
#指定子配置文件名
分发到指定的主机:
[root@linux01 ~]# salt 'linux02' state.highstate
linux02:
----------
ID: file_test
Function: file.managed
Name: /tmp/test.conf
Result: True
Comment: File /tmp/test.conf updated
Started: 16:42:34.248497
Duration: 147.453 ms
Changes:
----------
diff:
New file
Summary for linux02
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1
Total run time: 147.453 ms
在minion端查看即可显示:
[root@linux02 ~]# ll /tmp/test.conf
-rw------- 1 root root 3 12月 27 16:42 /tmp/test.conf
[root@linux02 ~]# cat !$
cat /tmp/test.conf
ok
saltstack批量分发目录
创建测试目录:
[root@linux01 ~]# mkdir /srv/salt/test
[root@linux01 ~]# touch /srv/salt/test/aaa.txt
创建子配置文件:
[root@linux01 ~]# vi /srv/salt/dir.sls
配置文件内容:
file_dir:
file.recurse:
- name: /tmp/abc
- source: salt://test
- user: root
- file_mode: 640
- dir_mode: 750
- mkdir: True
- clean: True
说明:引用的是saltstack的recurse模块,将master端的/srv/salt/test/目录分发到指定的minion端的/tmp目录下并命名为abc,minion端该目录权限为750,目录中的文件权限为640;如果minion端没有这个目录,则自动创建;如果有,直接覆盖;clean:true表示当master端的源目录删除时,minion端也删除
编辑主配置文件:
[root@linux01 ~]# vi /srv/salt/top.sls
指定子配置文件名:
base:
'*':
- dir
分发到指定主机:
[root@linux01 ~]# salt 'linux02' state.highstate
linux02:
----------
ID: file_dir
Function: file.recurse
Name: /tmp/abc
Result: True
Comment: Recursively updated /tmp/abc
Started: 01:41:56.618491
Duration: 202.749 ms
Changes:
----------
/tmp/abc:
----------
/tmp/abc:
----------
mode:
0750
mode:
0750
/tmp/abc/aaa.txt:
----------
diff:
New file
mode:
0640
removed:
- /tmp/abc/bbb.txt
Summary for linux02
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1
Total run time: 202.749 ms
在minion端查看目录:
[root@linux02 ~]# ll -d /tmp/abc
drwxr-x--- 2 root root 21 12月 28 01:41 /tmp/abc
[root@linux02 ~]# ll /tmp/abc
-rw-r----- 1 root root 0 12月 28 01:41 aaa.txt
补充:如果分发的目录中没有文件,为空目录,则不会分发成功,saltstack会忽略为空的目录
saltstack批量远程执行脚本
在salt根目录下创建脚本:
[root@linux01 ~]# vim /srv/salt/1.sh
脚本内容:
#!/bin/bash
if [ ! -d /tmp/shell_test ]
then
mkdir /tmp/shell_test
fi
创建子配置文件:
[root@linux01 ~]# vi /srv/salt/shell.sls
配置文件内容:
shell_test:
cmd.script:
- source: salt://1.sh
- user: root
#指定要在远程minion端上执行的脚本为/srv/salt/1.sh
编辑主配置文件:
[root@linux01 ~]# vi /srv/salt/top.sls
指定子配置文件名:
base:
'*':
- shell
在指定minion端执行脚本:
[root@linux01 ~]# salt 'linux02' state.highstate
linux02:
----------
ID: shell_test
Function: cmd.script
Result: True
Comment: Command 'shell_test' run
Started: 02:01:51.753030
Duration: 57.968 ms
Changes:
----------
pid:
19724
retcode:
0
stderr:
stdout:
Summary for linux02
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1
Total run time: 57.968 ms
在minion端查看shell中指定的文件是否已被创建:
[root@linux02 ~]# ll -d /tmp/shell_test/
drwxr-xr-x 2 root root 6 12月 28 02:01 /tmp/shell_test/
saltstack批量创建cron任务计划
在salt根目录下创建子配置文件:
[root@linux01 ~]# vi /srv/salt/add_cron.sls
配置文件内容:
cron_test:
cron.present:
- name: /bin/touch /tmp/test_cron.txt
- user: root
- minute: '*'
- hour: 20
- daymonth: '*'
- month: '*'
- dayweek: '*'
修改主配置文件:
[root@linux01 ~]# vi /srv/salt/top.sls
指定子配置文件:
base:
'*':
- add_cron
在指定的minion端创建任务计划:
[root@linux01 ~]# salt 'linux02' state.highstate
linux02:
----------
ID: cron_test
Function: cron.present
Name: /bin/touch /tmp/test_cron.txt
Result: True
Comment: Cron /bin/touch /tmp/test_cron.txt added to root's crontab
Started: 02:29:23.429625
Duration: 408.538 ms
Changes:
----------
root:
/bin/touch /tmp/test_cron.txt
Summary for linux02
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1
Total run time: 408.538 ms
在minion端查看任务计划:
[root@linux02 ~]# 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
#前两行注释为salt自动生成,不能修改,否则会导致下次使用salt变更任务计划时出错,如果需要改动定时任务时间,直接在master端修改/srv/salt/add_cron.sls文件,再执行salt ‘linux02’ state.highstate即可
删除任务计划,修改子配置文件内容为:
cron.absent:
- name: /bin/touch /tmp/test_cron.txt
#修改后再次执行 salt xxx state.highstate即可
saltstack补充命令
拷贝salt根目录下的文件到minion端:
salt '*' cp.get_file salt://1.txt /tmp/123.txt
拷贝salt根目录下的目录到minion端:
salt '*' cp.get_dir salt://test/conf /tmp/
#将/srv/salt/test/conf目录拷贝到minion端的/tmp下
显示存活的minion端:
[root@linux01 ~]# salt-run manage.up
- linux01
- linux02
远程执行shell脚本:
salt '*' cmd.script salt://test/1.sh
#在所有minion端执行master端的/srv/salt/test/1.sh脚本
salt-ssh使用
salt-ssh可以直接通过ssh秘钥的方式连接远程的客户端,客户端不需要安装salt-minion包
安装saltstack yum源:
yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest.el7.noarch.rpm
安装salt-ssh:
[root@linux01 ~]# yum -y install salt-ssh
编辑配置文件:
[root@linux01 ~]# vi /etc/salt/roster
添加以下内容:
linux01:
host: 192.168.234.128
user: root
passwd: abc123
linux02:
host: 192.168.234.130
user: root
passwd: abc123
#添加客户端的信息,hostname,ip,用户名和密码
在所有客户端执行命令:
[root@linux01 ~]# salt-ssh --key-deploy '*' -r 'uptime'
linux02:
----------
retcode:
0
stderr:
stdout:
03:24:00 up 1 day, 9:57, 1 user, load average: 0.33, 0.38, 0.30
linux01:
----------
retcode:
0
stderr:
stdout:
03:24:06 up 1 day, 17:38, 3 users, load average: 0.23, 0.23, 0.31
#第一次执行命令的时候会把master机器的公钥存放到客户端,然后把配置文件/etc/salt/roster中的密码去掉即可,后面再次执行命令会自动使用ssh秘钥认证
master端秘钥存放目录:
[root@linux01 ~]# ls /etc/salt/pki/master/ssh/
salt-ssh.rsa salt-ssh.rsa.pub
#.pub文件的公钥会自动写入客户端/root/.ssh/authorized_keys文件中
转载:https://blog.csdn.net/Powerful_Fy/article/details/103731387