Linux学习总结(七十三)自动化运维之saltstack
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux学习总结(七十三)自动化运维之saltstack相关的知识,希望对你有一定的参考价值。
1 认识自动化运维
传统运维效率低,大多工作人为完成
传统运维工作繁琐,容易出错
传统运维每日重复做相同的事情
传统运维没有标准化流程
传统运维的脚本繁多,不能方便管理
自动化运维就是要解决上面所有问题
2 常见自动化运维工具
Puppet (www.puppetlabs.com)基于rubby开发,c/s架构,支持多平台,可管理配置文件、用户、cron任务、软件包、系统服务等。 分为社区版(免费)和企业版(收费),企业版支持图形化配置。
Saltstack(官网 https://saltstack.com,文档docs.saltstack.com )基于python开发,c/s架构,支持多平台,比puppet轻量,在远程执行命令时非常快捷,配置和使用比puppet容易,能实现puppet几乎所有的功能。
Ansible (www.ansible.com )更加简洁的自动化运维工具,不需要在客户端上安装agent,基于python开发。可以实现批量操作系统配置、批量程序的部署、批量运行命令。
3 saltstack 安装
saltstack介绍https://docs.saltstack.com/en/latest/topics/index.html
可以使用salt-ssh远程执行,类似ansible,
也支持c/s模式,下面我们将讲述该种模式的使用,需要准备两台机器
226.129为服务端,226.130为客户端
设置hostname以及hosts,lvlinux-1,lvlinux-2
hostnamectl set-hostname lvlinux-1
vim /etc/hosts
192.168.226.129 lvlinux-1
192.168.226.130 lvlinux-2
两台机器上都要做
两台机器全部安装saltstack yum源yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
129上执行 yum install -y salt-master salt-minion
130上执行 yum install -y salt-minion
启动salt相关服务
129上编辑配置文件vi /etc/salt/minion
//增加master: lvlinux-1
启动服务systemctl start salt-master; systemctl start salt-minion
130上编辑配置文件vi /etc/salt/minion
//增加master: lvlinux-1
启动服务systemctl start salt-minion
服务端监听4505和4506两个端口,4505为消息发布的端口,4506为和客户端通信的端口
4saltstack 配置认证
master端和minion端通信需要建立一个安全通道,传输过程需要加密,所以得配置认证,也是通过密钥对来加密解密的
minion在第一次启动时会在/etc/salt/pki/minion/下生成minion.pem和minion.pub,其中.pub为公钥,它会把公钥传输给master
master第一次启动时也会在/etc/salt/pki/master下生成密钥对,当master接收到minion传过来的公钥后,通过salt-key工具接受这个公钥,一旦接受后就会在/etc/salt/pki/master/minions/目录里存放刚刚接受的公钥,同时客户端也会接受master传过去的公钥,把它放在/etc/salt/pki/minion目录下,并命名为minion_master.pub
以上过程需要借助salt-key工具来实现
执行如下命令 salt-key -a lvlinux-2// -a后面跟主机名,可以认证指定主机salt-key -a lvlinux-2
salt-key 命令用法
-a 后面跟主机名,认证指定主机
-A 认证所有主机
-r 跟主机名,拒绝指定主机
-R 拒绝所有主机
-d 跟主机名,删除指定主机认证
-D 删除全部主机认证
-y 省略掉交互,相当于直接按了y
5 saltstack 远程执行命令
salt ‘*‘ test.ping
//这里的表示所有已经签名的minion端,也可以指定一个salt ‘lvlinux-1‘ test.ping
`salt ‘‘ cmd.run "hostname"`
说明: 这里的*必须是在master上已经被接受过认证的客户端,可以通过salt-key查到,通常是我们已经设定的id值。关于这部分内容,它支持通配、列表以及正则。 比如两台客户端aming-01,aming-02, 那我们可以写成salt ‘aming-*‘, salt ‘aming-0[12]‘ salt -L ‘aming-01,aming-02‘ salt -E ‘aming-(01|02)‘等形式,使用列表,即多个机器用逗号分隔,而且需要加-L,使用正则必须要带-E选项。 它还支持grains,加-G选项,pillar 加-I选项,下面会介绍到。
6 saltstack - grains
grains是在minion启动时收集到的一些信息,比如操作系统类型、网卡ip、内核版本、cpu架构等。salt ‘lvlinux-2‘ grains.ls
列出所有的grains项目名字salt ‘lvlinux-2‘ grains.items
列出所有grains项目以及值
grains的信息并不是动态的,并不会实时变更,它是在minion启动时收集到的。
我们可以根据grains收集到的一些信息,做配置管理工作。
grains支持自定义信息。
自定义grains
minion上:vim /etc/salt/grains
//添加:
role: nginx
env: test
重启minion服务systemctl restart salt-minion
master上:
获取grains:salt ‘*‘ grains.item role env
可以借助grains的一些属性信息来执行salt -G role:nginx cmd.run ‘hostname‘
备注:
在minion端自定义grains, 以key-vlaue的形式,可以将处理动作归类。针对不同的minion端就可以定义不同的key-value,从而在master端执行命令时,区分不同类型的minion端。比如,我们要在web类服务器安装nginx,在DB类服务器安装数据库。就可以做一下区分。在上面例子中,role为key,nginx 为value。中间以冒号,空格作为分割。
7 saltstack – pillar
pillar和grains不一样,是在master上定义的,并且是针对minion定义的一些信息。像一些比较重要的数据(密码)可以存在pillar里,还可以定义变量等。
配置自定义pillarvim /etc/salt/master
找到如下配置://去掉前面的井号
pillar_roots:
base: #此行前面有两个空格
- /srv/pillar #此行前面有4个空格
mkdir /srv/pillar
vim /srv/pillar/test.sls
//内容如下conf: /etc/123.conf
vi /srv/pillar/top.sls
//内容如下
base:
‘lvinux-2‘: #此行前面有两个空格
- test #此行前面有4个空格
重启mastersystemctl restart salt-master
当更改完pillar配置文件后,我们可以通过刷新pillar配置来获取新的pillar状态:salt ‘*‘ saltutil.refresh_pillar
验证:salt ‘*‘ pillar.item conf
pillar同样可以用来作为salt的匹配对象。比如 salt -I ‘conf:/etc/123.conf‘ test.ping
备注:这次我们在master上定义,它的核心也跟grains相同,也是以key-value形式可以对批处理进行分类。首先我们在master配置文件中打开自定义pillar 的项目入口。其中/srv/pillar就是文件载入路径。以后的自定义都放在该路径下。用以上例子来说明的话,我们首先要定义我们的具体应用文件,
test.sls. 其中conf为key值,/etc/123.conf 为value值,该路径文件暂时没有实际含义。仅作为一个名称。接下来我们还要定义应用的入口文件,top.sls 该文件以base 开头,定义了要操作的主机,还有要调用的应用文件名称。
8 saltstack – 安装配置httpd
master上 vi /etc/salt/master
//搜索找到file_roots
打开如下内容的注释:
file_roots:
base: #前面有两个空格
- /srv/salt #前面有4个空格
mkdir /srv/salt ; cd /srv/salt
vi /srv/salt/top.sls
//加入如下内容
base:
‘*‘: #前面有两个空格
- httpd #前面有4个空格
意思是,在所有的客户端上执行httpd模块
重启 systemctl restart salt-master
master上vi /srv/salt/httpd.sls
//加入如下内容,这个就是httpd模块的内容
httpd-service:
pkg.installed:
- names: //这里如果只有一个服务,那么就可以写成 –name: httpd 不用再换一行了。
- httpd
- httpd-devel
service.running:
- name: httpd
- enable: True
说明: httpd-service是id的名字,自定义的。pkg.installed 为包安装函数,下面是要安装的包的名字。service.running也是一个函数,来保证指定的服务启动,enable表示开机启动。层级结构之间依次缩进两个空格
执行: salt ‘lvlinux-2‘ state.highstate
//执行过程会比较慢,因为客户端上在yum install httpd httpd-devel
备注:以上内容整体框架跟pillar用法相似,因为它同样是针对master操作,也是在master配置文件中打开应用入口file_roots,再创建接引文件top.sls ,下来创建应用文件httpd.sls.不过这次应用文件httpd.sls中调用了两个功能模块,pkg.installed 和 service.running
9 saltstack – 配置管理文件
master上vi /srv/salt/test.sls
//加入如下内容
file_test:
file.managed:
- name: /tmp/lvlinux.com
- source: salt://test/123/1.txt
- user: root
- group: root
- mode: 600
说明:第一行的file_test为自定的名字,表示该配置段的名字,可以在别的配置段中引用它,source指定文件从哪里拷贝,这里的salt://test/123/1.txt相当于是/srv/salt/test/123/1.txtmkdir /srv/salt/test/123
cp /etc/passwd /srv/salt/test/123/1.txt
vi /srv/salt/top.sls
//改为如下内容
base:
‘*‘:
- test
执行: salt ‘lvlinux-2‘ state.highstate
检查lvlinux-2上是否有/tmp/lvlinux.com,检查内容以及权限
备注:简单来说以上实现了文件的批量分发,类似于用rsync做循环同步的shell脚本。
10 saltstack – 配置管理目录
master上vi /srv/salt/test_dir.sls
//加入如下内容
file_dir:
file.recurse:
- name: /tmp/testdir
- source: salt://test/123
- user: root
- file_mode: 640
- dir_mode: 750
- mkdir: True
- clean: True
//加上最后一句之后,源删除文件或目录,目标也会跟着删除,否则不会删除
修改top.sls, vi /srv/salt/top.sls
//改为如下内容
base:
‘*‘:
- test_dir
执行: salt ‘lvlinux-2‘ state.highstate
检查lvlinux-2上是否有/tmp/testdir,检查里面的目录、文件以及权限
说明:这里有一个问题,如果source对应的目录里有空目录的话,客户端上不会创建该目录
11 saltstack – 配置管理远程命令
master上vi /srv/salt/shell_test.sls
//加入如下内容
shell_test:
cmd.script:
- source: salt://test/1.sh
- user: root
vi /srv/salt/test/1.sh
//加入如下内容
#!/bin/bash
touch /tmp/111.txt
if [ ! -d /tmp/1233 ]
then
mkdir /tmp/1233
fi
更改top.sls内容
base:
‘*‘:
- shell_test
执行: salt ‘lvlinux-2‘ state.highstate
检查是否有/tmp/111.txt和/tmp/1233
备注:就是关联shell脚本,实现命令的封装。
12 saltstack – 配置管理任务计划
master上vi /srv/salt/cron_test.sls
//加入如下内容
cron_test:
cron.present:
- name: /bin/touch /tmp/111.txt
- user: root
- minute: ‘*‘
- hour: 20
- daymonth: ‘*‘
- month: ‘*‘
- dayweek: ‘*‘
注意,*需要用单引号引起来。当然我们还可以使用file.managed模块来管理cron,因为系统的cron都是以配置文件的形式存在的。想要删除该cron,需要增加
cron.absent:
- name: /bin/touch /tmp/111.txt
两者不能共存,要想删除一个cron,那之前的present就得去掉。
更改top.sls
base:
‘*‘:
- cron_test
执行: salt ‘lvlinux-2‘ state.highstate
到lvinux-2上检查cron,会看到提示# Lines below here are managed by Salt, do not edit
我们不能随意改动它,否则就没法删除或者修改这个cron了。
crontab -l
13saltstack – 其它可能会用到的命令
cp.get_file 拷贝master上的文件到客户端salt ‘*‘ cp.get_file salt://test/1.txt /tmp/123.txt
cp.get_dir 拷贝目录salt ‘*‘ cp.get_dir salt://test/conf /tmp/
//会自动在客户端创建conf目录,所以后面不要加conf,如果写成 /tmp/conf/ 则会在/tmp/conf/目录下又创建confsalt-run manage.up
显示存活的minionsalt ‘*‘ cmd.script salt://test/1.sh
命令行下执行master上的shell脚本
14 salt-ssh 使用
salt-ssh不需要对客户端做认证,客户端也不用安装salt-minion,它类似pssh/expect
安装很简单yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
yum install -y salt-ssh
vi /etc/salt/roster
//增加如下内容
lvlinux-1:
host: 192.168.226.129
user: root
passwd: lvlinux
lvinux-2:
host: 192.168.226.130
user: root
passwd: lvlinux
salt-ssh --key-deploy ‘*‘ -r ‘w‘
//第一次执行的时候会自动把本机的公钥放到对方机器上,然后就可以把roster里面的密码去掉,该命令就是用秘钥认证远程登陆到机器,根据roster文件里定义的主机,依次执行w命令返回结果。
以上是关于Linux学习总结(七十三)自动化运维之saltstack的主要内容,如果未能解决你的问题,请参考以下文章