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后面的命令将不会被执行

 

 

 

 

 

 

待续。。。。

posted @ 2019-04-16 22:23  *年少轻狂*  阅读(238)  评论(0编辑  收藏  举报