前言
当下有许多的运维自动化工具( 配置管理 ),例如:Ansible、SaltStack、Puppet、Fabric 等。
Ansible 一种集成 IT 系统的配置管理、应用部署、执行特定任务的开源平台,是 AnsibleWorks 公司名下的项目,该公司由 Cobbler 及 Func 的作者于 2012 年创建成立。
Ansible 基于 Python 语言实现,由 Paramiko 和 PyYAML 两个关键模块构建。
Ansible 特点:
- 部署简单,只需在主控端部署 Ansible 环境,被控端无需做任何操作。
- 默认使用 SSH(Secure Shell)协议对设备进行管理。
- 主从集中化管理。
- 配置简单、功能强大、扩展性强。
- 支持 API 及自定义模块,可通过 Python 轻松扩展。
- 通过 Playbooks 来定制强大的配置、状态管理。
- 对云计算平台、大数据都有很好的支持。
- 提供一个功能强大、操作性强的 Web 管理界面和 REST API 接口 —- AWX 平台。
Ansible 与 SaltStack:
- 最大的区别是 Ansible 无需在被监控主机部署任何客户端代理,默认通过 SSH 通道进行远程命令执行或下发配置。
- 相同点是都具备功能强大、灵活的系统管理、状态配置,都使用 YAML 格式来描述配置,两者都提供丰富的模板及 API,对云计算平台、大数据都有很好的支持。
安装ansible
1 | yum -y install ansible |
配置ansible
1 | ls /etc/ansible |
SSH秘钥认证
1 | ssh-keygen -t rsa |
添加被管理主机
1 | vim /etc/ansible/hosts |
测试ansible
1 | shell > ansible Client -m ping # 操作 Client 组 ( all 为操作 hosts 文件中所有主机 ),-m 指定执行 ping 模块,下面是返回结果 |
hosts主机文件
1 | shell > vim /etc/ansible/hosts |
ansible常用模块
1 | shell > ansible-doc -l # 列出 Ansible 支持的模块 |
远程命令模块(command / script / shell)
command
command 作为 Ansible 的默认模块,可以运行远程权限范围所有的 shell 命令,不支持管道符。
1 | shell > ansible Client -m command -a "free -m" # 查看 Client 分组主机内存使用情况 |
script
script 的功能是在远程主机执行主控端存储的 shell 脚本文件,相当于 scp + shell 组合。
1 | shell > ansible Client -m script -a "/home/test.sh 12 34" # 远程执行本地脚本 |
shell
shell模块基本和command相同,但是shell支持管道符
1 | shell > ansible Client -m shell -a "/home/test.sh" # 执行远程脚本 |
copy模块
实现主控端向目标主机拷贝文件,类似于 scp 功能
1 | shell > ansible Client -m copy -a "src=/home/test.sh dest=/tmp/ owner=root group=root mode=0755" # 向 Client 组中主机拷贝 test.sh 到 /tmp 下,属主、组为 root ,权限为 0755 |
file模块
file模块可以帮助我们完成一些对文件的基本操作,比如,创建文件或目录、删除文件或目录、修改文件权限等
1 | 在test70主机上创建一个名为testfile的文件,如果testfile文件已经存在,则会更新文件的时间戳,与touch命令的作用相同。 |
unarchive
作用:
- 将ansible主机上的压缩包在本地解压缩后传到远程主机上,默认设置为copy=yes,
- 将远程主机上的某个压缩包解压缩到指定路径下,需设置copy=no
1 | #解压远程主机src路径下的包,解压至/opt/下,并将解压出来的文件属组和属主改为jiii |
stat模块
获取远程文件状态信息,atime/ctime/mtime/md5/uid/gid 等信息
1 | shell > ansible Client -m stat -a "path=/etc/syctl.conf" |
get_url
实现在远程主机下载指定 URL 到本地,支持 sha256sum 文件校验
1 | shell > ansible Client -m get_url -a "url=http://www.baidu.com dest=/tmp/index.html mode=0440 force=yes" |
yum
软件包管理
1 | shell > ansible Client -m yum -a "name=curl state=latest" |
corn
远程主机 crontab 配置
1 | shell > ansible Client -m cron -a "name='check dirs' hour='5,2' job='ls -alh > /dev/null'" |
mount
远程主机分区挂载
1 | shell > ansible Client -m mount -a "name=/mnt/data src=/dev/sd0 fstype=ext4 opts=ro state=present" |
service
远程主机系统服务管理
1 | shell > ansible Client -m service -a "name=nginx state=stoped" |
user
远程主机用户管理
1 | shell > ansible Client -m user -a "name=wang comment='user wang'" |
ansible-playbook 详解
命令详解
1 | ansible-playbook playbook.yml [options] |
YAML语法
- YAML的语法和其他高阶语言类似并且可以简单表达清单、散列表、标量等数据结构。(列表用横杆表示,键值对用冒号分割,键值对里又可以嵌套另外的键值对)
- YAML文件扩展名通常为.yaml或者.yml。下面为示例
- 一定要对齐,只能使用空格
1 | name: tom |
Playbook目录结构
1 | [root@localhost project]# tree |
核心组件
- tasks:任务
- variables:变量
- templates:模板
- handlers:处理器
- roles:角色
标签处理
意义:通过tags和任务对象进行捆绑,控制部分或者指定的task执行
- 打标签
1 | 对一个对象打一个标签 |
- 标签使用
1 | -t : 执行指定的tag标签任务 |
playbook简单示例
第一个示例
1 | vim /root/first.yml |
hosts 定义单个主机或组,vars定义变量,remote_user定义执行命令的远程用户,tasks定义执行哪些命令,handlers定义调用哪些处理器
vars(变量):
变量命名: 字母数字下划线组成,只能以字母开头
变量种类:
facts(内置变量)
由远程主机发回的主机属性信息,这些信息被保存在ansible变量当中
例如:ansible 192.168.238.170 -m setup 来获取远程主机上的属性信息,这些属性信息保存在facts中
通过命令行传递
通过命令行传递:ansible-playbook test.yml –extra-vars “host=www user=tom“(如果剧本中已有此处定义的变量则会被覆盖)
通过roles传递
主机变量
在/etc/ansible/hosts中定义
1
2
3 > [web1]
> 192.168.1.1 name=haha
>
组变量
1
2
3 > [group_name:vars]
> foo=bar
>
hosts :
/etc/abible/hosts 中指定的远程主机,并用指定的属性进行连接
1
2
3
4
5
6 > ansible_ssh_port 连接远程主机使用的端口
>
> ansible_ssh_user 连接远程主机使用的用户
>
> ansible_ssh_pass 连接远程主机使用的密码
>
1
2
3
4
5
6 > cat /etc/ansible/hosts
>
> [web1]
> web1.hostname ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123
> web2.hostname
>
第二个示例
1 | vim /root/second.yml |
第三个示例
1 | vim /root/third.yml |
上面的意思是copy中复制过去的文件跟远程主机上的文件不同,就通过notify调用handlers,即重启httpd服务。
handler是重启服务是最通用的用法
第四个示例
1 | vim /etc/ansible/hosts |
1 | vim /root/httpd.conf |
1 | vim /root/fourth.yml |
第五个示例
roles:roles用于实现“代码复用”,roles以特定的层次型格式组织起来的playbook元素(variables, tasks, templates,handlers);可被playbook以role的名字直接进行调用
roles的文件结构:
- files/:此角色中用到的所有文件均放置于此目录中
- templates/: Jinja2模板文件存放位置
- tasks/:任务列表文件;可以有多个,但至少有一个叫做main.yml的文件
- handlers/:处理器列表文件;可以有多个,但至少有一个叫做main.yml的文件
- vars/:变量字典文件;可以有多个,但至少有一个叫做main.yml的文件
- meta/:此角色的特殊设定及依赖关系
1 | mkdir /root/roles |
1 | vim web1/vars/main.yml |
1 | vim web1/tasks/main.yml |
1 | vim web1/handlers/main.yml |
1 | vim web1/templates/httpd.conf |
定义一个调用roles文件
1 | vim /root/web1.yml |
运行
1 | ansible-playbook web1.yml |
使用ansible-playbook安装zabbix
定义hosts
1 | shell > vim /etc/ansible/hosts |
定义入口文件install_zabbix_agent.yml
1 | shell > vim /etc/ansible/install_zabbix_agent.yml |
定义角色 install_zabbix_agent
1 | shell > tree /etc/ansible/roles/install_zabbix_agent/ |
建立tasks主文件
1 | shell > cat /etc/ansible/roles/install_zabbix_agent/tasks/main.yml |
建立主变量文件
1 | shell > cat /etc/ansible/roles/install_zabbix_agent/vars/main.yml |
建立模板文件
1 | shell > cat /etc/ansible/roles/install_zabbix_agent/templates/zabbix_agentd |
1 | shell > cat /etc/ansible/roles/install_zabbix_agent/templates/zabbix_agentd.conf |
安装
1 | shell > ansible-playbook /etc/ansible/install_zabbix_agent.yml |