SaltStack入门
SaltStack优点和文档:
可以远程执行和配置管理
saltstack所有状态模块:https://www.unixhot.com/docs/saltstack/ref/states/all/index.html#all-salt-states
一.SaltStack的运行方式
1.Local:本地运行,对于只有一台机器的话,使用该方式,SaltStack可以通过命令搭建自己;
2.Master/Minion:主控端/客户端的关系,Minion只是干活的;
3.Salt SSH:SaltStack也支持ssh的方式控制其他服务器。
二.安装
这里介绍的是Linux6版本下yum安装的
先配置一个repo的yum源
https://repo.saltstack.com/yum/redhat/6.5/x86_64/saltstack-rhel6.repo
[saltstack-repo] name=SaltStack repo for RHEL/CentOS $releasever baseurl=https://repo.saltstack.com/yum/redhat/$releasever/$basearch/latest enabled=1 gpgcheck=1 gpgkey=https://repo.saltstack.com/yum/redhat/$releasever/$basearch/latest/SALTSTACK-GPG-KEY.pub
查看一下yum中的salt的版本
yum list | grep salt
然后是安装
#Salt Master安装和启动 yum -y install salt-master service salt-master start #Salt Minion安装和启动 yum -y install salt-minion service salt-minion start
安装完之后,SaltStack被安装在/etc/salt 目录下
三.安装目录
通过YUM安装的salt,不管是master还是minion,都是安装在/etc/salt目录下的
cd /etc/salt
四.进入到安装目录之后先启动master
service salt-master start
启动之后会/etc/salt/pki/master 目录下会生成master的密钥文件
注:master的私钥和公钥文件,在启动的时候才会生成,如果刚安装上,没有启动过,该目录下是没有这些文件的
五.配置salt-minion
在启动minion之前,首先要在配置文件中,告诉它谁是master,否则起不来
[root@linux-node2 master]# cd /etc/salt/
[root@linux-node2 salt]# vim minion
注:该配置文件中不能存在tab键和中文,否则会导致salt-minion起不来
启动minion之后,会发现,pki目录下的minion目录下,也生成了一对密钥
当minion启动的时候,会自动将自己生成的公钥文件,颁发给master,当master认可了该公钥文件了,双方就可以开始通信了。
遇到的问题:
1.这里在启动的时候遇到过一个小问题,就是远程的minion启动以后,不能将自己的公钥办法给master,既然网络走不通,可能是防火墙导致的,关闭双方的防火墙之后,master机器上立刻有了minion颁发的公钥。
2.通过配置文件中指定id,然后导致minion起不来,原因是因为id: 的后面必须要有一个空格,然后再写主机名。
六.master上管理公钥文件
当minion启动之后,我们可以观察一下master的目录结构
然后我们可以在master机器上,通过salt-key来查看,有那些公钥文件正在请求认证,那些公钥是通过认证的
然后我们将所有等待同意的公钥都通过批准
salt-key -A #A 这个选项代表将队列中所有的公钥的请求都批准通过
注:经过master同意过的公钥后,公钥所对应的的minion机器上,在minion存放公钥的目录下,也会多一个master的公钥的文件,这样,master和minion双方都互相有了公钥文件之后,就确保了操作的安全性。
salt-key的其他选项:
## 显示所有minion的认证信息 salt-key -L # 接受linux-node1的认证信息 salt-key -a linux-node1 # 接受linux-node1的认证信息,不需要手动验证 salt-key -a 192.168.0.100-y # 接受linux-node1的认证信息,即使该minion是Rejected Keys状态 salt-key -a linux-node1--include-all # 接受所有 Unaccepted Keys 状态的minion的认证信息 salt-key -A # 拒绝认证linux-node1 salt-key -d linux-node1 # 拒绝所有 Unaccepted Keys 状态的minion salt-key -D
七.master验证是否和minion之间互通
salt '*' test.ping # *代表测试所有的minion
测试单个minion
salt 'linux-node1' test.ping # linux-node1是minion的id
例:
八.使用salt命令的cmd执行模块,对minion主机运行命令
salt '*' cmd.run 'pwd'
说明:salt是salt-master的命令;
'*' 这里是选择让哪台minion主机执行,而*就代表所有通过认证的minion主机
cmd是执行模块,也就是python下的一个模块;
run是cmd模块的一个方法,就是cmd模块下的很多方法的其中一个方法;
'pwd'是传入的参数,是linux的系统命令。
注:1.一般salt不建议通过命令来使用,一般都定义YAML脚本来进行使用。
2.cmd是一个超级模块,可以支持所有linux命令。
九.master配置运行作业
需要了解YAML的用法,可以参考我的另一篇博客:
https://www.cnblogs.com/Jackie-Chen/articles/10732266.html
1.配置master配置文件,告诉master作业存放的路径
vim /etc/salt/master
在该配置文件中搜索:file_roots,定位到之后,配置如下内容:
注:1.配置完配置文件之后,需要确定以上配置的目录都必须存在,才可以重启,如果配置的目录不存在,是起不来的。
2.base目录是必须有的。
批量创建目录
mkdir -p /srv/salt/{base,dev,test,prod}
2.创建saltstack的作业脚本
cd /src/salt/base
vim apache.sls
注:saltstack的作业脚本,必须是.sls结尾的。
配置内容如下:
注:一般像上面这样配置来安装服务的话,都是通过yum来进行安装的。
3.运行作业脚本
salt 'linux-node2' state.sls apache
说明:
salt:saltstack的master命令 'linux-node2' :指定执行作业的机器的id state.sls :调用运行模块state的sls方法 apache:运行刚才创建的apache.sls文件 注:运行作业文件的时候,不用写作业文件的后缀名
但是我们一般会将作业的脚本通过目录来分类,例如刚才我们创建的apache.sls就可以归为web类,可以在base目录下创建一个web目录,存放这类的作业脚本,然后运行的时候通过点.来区分目录结构,如下:
cd /srv/salt/base mkdir web mv apache.sls web salt 'linux-node2' state.sls web.apache
这样方便我们日后来管理作业脚本。
十.saltstack高级状态
高级状态是在top.sls中配置的,可以在master的配置文件中,看到该文件的说明,在master配置文件中搜索:top.sls
该文件是自己创建的,最好创建的base目录下,最好只创建一个top.sls,这是为了日后方便管理。
top.sls的作用:它的作用就是配置哪台服务器要执行哪个状态,通过该文件可以批量执行,不需要通过在命令行执行。
cd /srv/salt/base
vim top.sls
salt '*' state.highstate
说明:上条命令是对所有服务器启动高级状态,使用高级状态的会,会去base目录下面执行top.sls
十一.saltstack管理目录
方法的参考文档:https://www.unixhot.com/docs/saltstack/ref/states/all/salt.states.file.html#module-salt.states.file
这里说的管理目录是指同步某个目录,举例来说,当master在sls脚本中,设置了master主机的一个目录,要让其他minon服务器上的httpd的conf.d目录下的文件,和master指定的目录下的文件保持一致,就需要用到状态模块file下的recurse方法。
例:
master的top.sls:
base: 'linux-node1': - web.apache 'linux-node2': - web.apache
master的web目录下的apache:
apache-confs: file.recurse: - name: /etc/httpd/conf.d #这里设置的是目标目录 - source: salt://web/file/apache-conf.d #这里设置的是源目录
注:1.目标目录会和源目录做对比,如果源目录有新增的文件,那么,执行高级状态命令后,目标目录上也会新增源目录中的文件。
2.当源目录和目标目录下,有同名的文件,但是源文件的内容发生变化的时候,源文件的内容会覆盖掉目标文件的内容。(如果想要批量删除目标目录下某个文件某行的时候,可以通过,修改源目录下的文件,先把要删的内容删掉,然后,再执行高级状态的命令,然后,所有目标主机下同名文件中想要删掉的内容就会被删掉)。
3.source也可以指定的是ftp、http等其他的路径,只要可以下载就可以。
4.salt:// 这个路径代表的是master上的base的路径,后面跟的web目录是在base下必须存在的。
然后执行salt的高级状态命令,即可对比对比master目录下面的文件是否和所有minon下的文件一样,不一样的话,就会新增minon没有的文件。
十二.saltstack对文件内容进行增加
cd /srv/salt/base/web
vim append.sls
etc/profile: file.append: - text: - "this is new str!!!!!!"
cd .. salt "*" state.sls web/append
执行完之后,/etc/profile文件最后一行就会添加一行字符串。
删除在文档中没找到,但是想要删除文件内容的话,可以参考十一的注2的说明,举例说明:
profile-del: file.recurse: - name: /etc - source: salt://web/file
/web/file目录下是有一个profile文件,最后一行是没有添加“this is new str!!!!!!”,执行完该状态后,所有minon机器上/etc/profile文件的最后一行“this is new str!!!!!!”内容都会被删掉。
十三. SaltStack常用模块和方法
参考我的另一篇博客:https://www.cnblogs.com/Jackie-Chen/articles/10760570.html
十四.unless判断的用法
unless是用来做判断的,如果后面的判断条件为真,那么该方法不执行,举例说明:
在创建httpd的认证的时候,需要有一个存放用户和密码信息的文件,但是这个文件一般只用创建一次即可,不需要重复创建。
apache-auth: #随便起的一个状态id pkg.installed: #执行pkg模块下的installed安装方法 - name: httpd-tools #安装的rpm包是httpd-tools - require_in: #如果该服务安装成功,那么,执行下面的cmd - cmd: apache-auth cmd.run: #运行cmd模块的run方法,该方法就是执行系统命令 - name: htpasswd -bc /etc/httpd/conf.htpasswd_file admin admin #执行该命令 - unless: test -f /etc/httpd/conf/htpasswd_file #判断,如果这条命令的结果为真,那么执行name后面的命令将不会被执行
待续。。。。