认识自动化运维
- 传统运维效率低,大多工作人为完成
- 传统运维工作繁琐,容易出错
- 传统运维每日重复做相同的事情
- 传统运维没有标准化流程
- 传统运维的脚本繁多,不能方便管理
- 自动化运维就是要解决上面所有问题
常见自动化运维工具
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 里面的密码去掉。