认识自动化运维
- 传统运维效率低,大多工作人为完成
- 传统运维工作繁琐,容易出错
- 传统运维每日重复做相同的事情
- 传统运维没有标准化流程
- 传统运维的脚本繁多,不能方便管理
- 自动化运维就是要解决上面所有问题
常见自动化运维工具
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开发。可以实现批量操作系统配置、批量程序的部署、批量运行命令。
saltstack
saltstack安装
saltstack 介绍 https://docs.saltstack.com/en/latest/topics/index.html
可以使用salt-ssh远程执行,类似ansible
也支持c/s模式,下面我们将讲述该种模式的使用,需要准备两台机器
133.130为服务端,133.132为客户端
设置hostname以及hosts,aming-01,aming-02
两台机器全部安装saltstack yum源
yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
130上执行 yum install -y salt-master salt-minion
132上执行 yum install -y salt-minion
启动salt相关服务
139上编辑配置文件
vi /etc/salt/minion //增加
master: liang-03
启动服务systemctl start salt-master; systemctl start salt-minion
140上编辑配置文件
vi /etc/salt/minion //增加
master: liang-04
启动服务systemctl start salt-minion
服务端监听4505和4506两个端口,4505(zeromq)为消息发布的端口,4506为和客户端通信的端口
saltstack配置认证
master端和minion端通信需要建立一个安全通道,传输过程需要加密,所以得配置认证,也是通过密钥对来加密解密的
minion在第一次启动时会在/etc/salt/pki/minion/下生成minion.pem和minion.pub,其中.pub为公钥,它会把公钥传输给master
[root@liang-04 ~]# ls /etc/salt/pki/minion/
minion.pem minion.pub
master第一次启动时也会在/etc/salt/pki/master下生成密钥对,当master接收到minion传过来的公钥后,通过salt-key工具接受这个公钥,一旦接受后就会在/etc/salt/pki/master/minions/目录里存放刚刚接受的公钥,同时客户端也会接受master传过去的公钥,把它放在/etc/salt/pki/minion目录下,并命名为minion_master.pub
[root@liang-03 ~]# ls /etc/salt/pki/master/
master.pem master.pub minions minions_autosign minions_denied minions_pre minions_rejected
以上过程需要借助salt-key工具来实现
执行如下命令 salt-key -a liang-04 // -a后面跟主机名,可以认证指定主机
salt命令用法
-a 后面跟主机名,认证指定主机
-A 认证所有主机
-r 跟主机名,拒绝指定主机
-R 拒绝所有主机
-d 跟主机名,删除指定主机认证
-D 删除全部主机认证
-y 省略掉交互,相当于直接按了y
saltstack远程执行命令
salt '*' test.ping //这里的*表示所有已经签名的minion端,也可以指定一个
[root@liang-03 ~]# salt '*' test.ping
liang-04:
True
liang-03:
True
salt 'aming-01' test.ping
[root@liang-03 ~]# salt 'liang-04' test.ping
liang-04:
True
salt '*' cmd.run "hostname" //执行指定minion中的命令
[root@liang-03 ~]# salt '*' cmd.run 'hostname'
liang-04:
liang-04
liang-03:
liang-03
[root@liang-03 ~]# salt 'liang-04' cmd.run 'hostname'
liang-04:
liang-04
说明:这里的*必须是在 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选项,下面会介绍到。
[root@liang-03 ~]# salt 'liang-*' cmd.run 'pwd'
liang-04:
/root
liang-03:
/root
[root@liang-03 ~]# salt -E 'liang-0[34]' cmd.run 'pwd'
liang-04:
/root
liang-03:
/root
[root@liang-03 ~]# salt -E 'liang-[0-9]+' cmd.run 'pwd'
liang-03:
/root
liang-04:
/root
[root@liang-03 ~]# salt -E 'liang-(03|04)' cmd.run 'pwd'
liang-04:
/root
liang-03:
/root
[root@liang-03 ~]# salt -L 'liang-03,liang-04' cmd.run 'pwd'
liang-03:
/root
liang-04:
/root
[root@liang-03 ~]#
grain
grains是在 minion 启动时收集到的一些信息,比如操作系统类型、网卡ip、内核版本、cpu架构等。
salt 'liang-04' grains.ls 列出所有的grains项目名字:
[root@liang-03 ~]# salt 'liang-04' grains.ls
liang-04:
- SSDs
- biosreleasedate
- biosversion
- cpu_flags
- cpu_model
- cpuarch
- disks
- dns
- domain
- fqdn
- fqdn_ip4
- fqdn_ip6
- fqdns
- gid
- gpus
- groupname
- host
salt 'liang-04' grains.items 列出所有grains项目以及值:
[root@liang-03 ~]# salt 'liang-04' grains.items
liang-04:
----------
SSDs:
biosreleasedate:
07/02/2015
biosversion:
6.00
cpu_flags:
- fpu
- vme
- de
- pse
- tsc
- msr
- pae
- mce
- cx8
grains的信息并不是动态的,并不会实时变更,它是在 minion 启动时收集到的。
我们可以根据grains收集到的一些信息,做配置管理工作。
grains支持自定义信息。
saltstack自定义grains
minion上:
vim /etc/salt/grains //添加:
role: nginx
env: test
重启minion服务
systemctl restart salt-minion
master上,获取grains:
salt '*' grains.item role env
[root@liang-03 ~]# salt '*' grains.item role env
liang-03:
----------
env:
role:
liang-04:
----------
env:
test
role:
nginx
[root@liang-03 ~]#
可以借助grains的一些属性信息来执行:
salt -G role:nginx cmd.run 'hostname'
[root@liang-03 ~]# salt -G role:nginx cmd.run 'hostname'
liang-04:
liang-04
[root@liang-03 ~]# salt -G role:nginx cmd.run 'w'
liang-04:
10:36:27 up 33 min, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.66.1 10:04 3:39 0.62s 0.62s -bash
[root@liang-03 ~]#
pillar
pillar 和 grains 不一样,是在 master 上定义的,并且是针对 minion 定义的一些信息。像一些比较重要的数据(密码)可以存在 pillar 里,还可以定义变量等。
配置自定义 pillar
vim /etc/salt/master
找到如下配置://去掉前面的#号
pillar_roots: base: #此行前面有两个空格 - /srv/pillar #此行前面有4个空格
mkdir /srv/pillar
vim /srv/pillar/test.sls //内容如下
conf: /etc/123.conf
此时,test.sls还不能生效,需要在配置一个top.sls
vim /srv/pillar/top.sls #注意前面的空格
base:
'liang-04':
- test
当更改完pillar配置文件后,我们可以通过刷新pillar配置来获取新的pillar状态:
[root@liang-03 pillar]# salt '*' saltutil.refresh_pillar
liang-04:
True
liang-03:
True
[root@liang-03 pillar]#
验证:salt '*' pillar.item conf
[root@liang-03 pillar]# salt '*' pillar.item conf
liang-03:
----------
conf:
liang-04:
----------
conf:
/etc/123.conf
[root@liang-03 pillar]#
pillar同样可以用来作为salt的匹配对象。比如 salt -I 'conf:/etc/123.conf' test.ping
[root@liang-03 pillar]# salt -I 'conf:/etc/123.conf' test.ping
liang-04:
True
[root@liang-03 pillar]# salt -I 'conf:/etc/123.conf' cmd.run 'w'
liang-04:
11:05:44 up 1:03, 1 user, load average: 0.04, 0.08, 0.07
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.66.1 10:04 2:56 0.66s 0.66s -bash
[root@liang-03 pillar]#
saltstack安装配置httpd
master上 vi /etc/salt/master //搜索找到file_roots
去掉如下内容的注释:
file_roots:
base:
- /srv/salt
mkdir /srv/salt ; cd /srv/salt
vi /srv/salt/top.sls //加入如下内容
base:
'*':
- httpd
意思是,在所有的客户端上执行 httpd 模块
重启 systemctl restart salt-master
master上vi /srv/salt/httpd.sls //加入如下内容,这个就是httpd模块的内容
httpd-service:
pkg.installed:
- names:
- httpd
- httpd-devel
service.running:
- name: httpd
- enable: True
说明:httpd-service是id的名字,自定义的;
pkg.installed 为包安装函数,下面是要安装的包的名字;
service.running也是一个函数,来保证指定的服务启动,enable表示开机启动。
执行: salt 'liang-04' state.highstate //执行过程会比较慢,因为客户端上在 yum install httpd httpd-devel
[root@liang-03 salt]# salt 'liang-04' state.highstate
liang-04:
----------
ID: httpd-service
Function: pkg.installed
Name: httpd
Result: True
Comment: The following packages were installed/updated: httpd
Started: 12:02:06.662270
Duration: 75199.234 ms
Changes:
----------
httpd:
----------
new:
2.4.6-88.el7.centos
old:
----------
ID: httpd-service
Function: pkg.installed
Name: httpd-devel
Result: True
Comment: The following packages were installed/updated: httpd-devel
Started: 12:03:21.963110
Duration: 17626.075 ms
Changes:
----------
httpd-devel:
----------
new:
2.4.6-88.el7.centos
old:
----------
ID: httpd-service
Function: service.running
Name: httpd
Result: True
Comment: Service httpd has been enabled, and is running
Started: 12:03:42.059734
Duration: 395.088 ms
Changes:
----------
httpd:
True
Summary for liang-04
------------
Succeeded: 3 (changed=3)
Failed: 0
------------
Total states run: 3
Total run time: 93.220 s
[root@liang-03 salt]#
saltstack配置管理文件
在master上vi /srv/salt/test.sls //加入如下内容
file_test:
file.managed:
- name: /tmp/aminglinux.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.txt
mkdir /srv/salt/test/123
cp /etc/inittab /srv/salt/test/123/1.txt
vi /srv/salt/top.sls //改为如下内容
base:
'*':
- test
执行: salt 'liang-04' state.highstate
[root@liang-03 salt]# salt 'liang-04' state.highstate
liang-04:
----------
ID: file_test
Function: file.managed
Name: /tmp/liang.txt
Result: True
Comment: File /tmp/liang.txt updated
Started: 13:59:30.232251
Duration: 592.358 ms
Changes:
----------
diff:
New file
Summary for liang-04
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1
Total run time: 592.358 ms
检查aming-02上是否有 /tmp/liang.txt,检查内容以及权限
[root@liang-04 ~]# ls -lt /tmp/liang.txt
-rw------- 1 root root 511 Mar 2 13:59 /tmp/liang.txt
[root@liang-04 ~]# cat !$
cat /tmp/liang.txt
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
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 //加上它之后,源删除文件或目录,目标也会跟着删除,否则不会删除
执行: salt 'aming-02' state.highstate
[root@liang-03 salt]# salt 'liang-04' state.highstate
liang-04:
----------
ID: file_dir
Function: file.recurse
Name: /tmp/testdir
Result: True
Comment: Recursively updated /tmp/testdir
Started: 14:13:46.236198
Duration: 397.833 ms
Changes:
----------
/tmp/testdir/1.txt:
----------
diff:
New file
mode:
0640
Summary for liang-04
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1
Total run time: 397.833 ms
[root@liang-03 salt]#
检查 liang-04:
[root@liang-04 ~]# ls -lt /tmp/testdir/
total 4
-rw-r----- 1 root root 511 Mar 2 14:13 1.txt
[root@liang-04 ~]# ls -ltd /tmp/testdir/
drwxr-x--- 2 root root 19 Mar 2 14:13 /tmp/testdir/
[root@liang-04 ~]#
说明:这里有一个问题,如果source对应的目录里有空目录的话,客户端上不会创建该目录,若要穿件需在空目录下有文件存在。
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
执行: salt 'liang-04' state.highstate
[root@liang-03 salt]# salt 'liang-04' state.highstate
liang-04:
----------
ID: shell_test
Function: cmd.script
Result: True
Comment: Command 'shell_test' run
Started: 14:45:23.481903
Duration: 849.139 ms
Changes:
----------
pid:
6684
retcode:
0
stderr:
stdout:
Summary for liang-04
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1
Total run time: 849.139 ms
[root@liang-03 salt]#
检查是否有 /tmp/111.txt 和 /tmp/666
[root@liang-04 ~]# ls -lt /tmp/
total 8
drwxr-xr-x 2 root root 6 Mar 2 14:45 666
-rw-r--r-- 1 root root 0 Mar 2 14:45 111.txt
drwxr-x--- 2 root root 19 Mar 2 14:13 testdir
-rw------- 1 root root 511 Mar 2 13:59 liang.txt
drwx------ 3 root root 17 Mar 2 12:03 systemd-private-bae5303e84114014af71c9022769e90d-httpd.service-rYr0B1
drwx------ 3 root root 17 Mar 2 10:02 systemd-private-bae5303e84114014af71c9022769e90d-chronyd.service-T96o8J
-rw------- 1 git git 0 Feb 28 11:52 RackMultipart20190228-16197-xb907v
-rw------- 1 git git 0 Feb 27 23:06 RackMultipart20190227-5571-1s8wkyr
-rw------- 1 root root 256 Feb 27 22:01 yum_save_tx.2019-02-27.22-01.Cta4sm.yumtx
drwx------ 2 root root 6 Feb 25 21:06 vmware-root
[root@liang-04 ~]#
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都是以配置文件的形式存在的。
[root@liang-03 salt]# salt 'liang-04' state.highstate
liang-04:
----------
ID: cron_test
Function: cron.present
Name: /bin/touch /tmp/111.txt
Result: True
Comment: Cron /bin/touch /tmp/111.txt added to root's crontab
Started: 15:49:21.172300
Duration: 2544.1 ms
Changes:
----------
root:
/bin/touch /tmp/111.txt
Summary for liang-04
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1
Total run time: 2.544 s
[root@liang-03 salt]#
[root@liang-04 ~]# crontab -l
# Lines below here are managed by Salt, do not edit
# SALT_CRON_IDENTIFIER:/bin/touch /tmp/111.txt
* 20 * * * /bin/touch /tmp/111.txt
想要删除该cron,需要增加:
cron.absent:
- name: /bin/touch /tmp/111.txt
两者不能共存,要想删除一个cron,那之前的present就得去掉。
更改top.sls
base:
'*':
- cron_test
执行: salt 'liang-04' state.highstate
到 liang-04上检查 cron,会看到提示# Lines below here are managed by Salt, do not edit
我们不能随意改动它,否则就没法删除或者修改这个cron了。
saltstack其它命令
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/目录下又创建conf
salt-run manage.up 显示存活的minion;
#salt '*' cmd.script salt://test/1.sh 命令行下执行master上的shell脚本;
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 //增加如下内容
liang-03:
host: 192.168.66.139
user: root
passwd: lishiming
liang-04:
host: 192.168.133.140
user: root
passwd: lishiming
salt-ssh --key-deploy '*' -r 'w' //第一次执行的时候会自动把本机的公钥放到对方机器上,然后再次执行就可以把 roster 里面的密码去掉。