1 认识自动化运维
传统运维效率低, 大多工作人为完成
传统运维工作繁琐, 容易出错
传统运维每日重复做相同的事情
传统运维没有标准化流程
传统运维的脚本繁多, 不能方便管理
自动化运维就是要解决上面所有问题
2 常见自动化运维工具
Puppet (www.puppetlabs.com)基于 rubby 开发, c/s 架构, 支持多平台, 可管理配置文件, 用户, cron 任务, 软件包, 系统服务等. 分为社区版 (免费) 和企业版(收费), 企业版支持图形化配置.
Saltstack(官网 https://saltstack.com, 文档 docs.saltstack.com https://saltstack.xn--com,docs-ti6ug0y.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
启动服务 s
ystemctl 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 里, 还可以定义变量等.
配置自定义 pillar
vim /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 个空格
重启 master
systemctl 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.txt
- mkdir /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 / 目录下又创建 conf
salt-run manage.up 显示存活的 minion
salt '*' 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 命令返回结果.
来源: http://www.bubuko.com/infodetail-2706228.html