自动化运维之Ansible实战(一)
一:Ansible概述
Ansible(官方文档,中文文档)是一款为类Unix系统开发的自由开源的配置和自动化工具。它用Python写成,类似于saltstack和Puppet,但是有一个不同和优点是我们不需要在节点中安装任何客户端。它使用SSH来和节点进行通信。Ansible基于 Python paramiko 开发,分布式,无需客户端,轻量级,配置语法使用 YMAL 及 Jinja2模板语言,更强的远程命令执行操作
ansiblle具有如下特点:
- 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
- 默认使用SSH协议对设备进行管理;
- 主从集中化管理;
- 配置简单、功能强大、扩展性强;
- 支持API及自定义模块,可通过Python轻松扩展;
- 通过Playbooks来定制强大的配置、状态管理
- 对云计算平台、大数据都有很好的支持;
ansible整体架构如下:
注意事项:
- 执行ansible的主机一般称为主控端,中控,master或堡垒机
- 主控端Python版本需要2.6或以上
- 被控端python版本小于2.4需要安装python-simplejson
- 被控端如开启selinux需要安装libselinux-python
- windows不能作为主控端
二:常用自动化运维工具
- Asible:python, Agentless,中小型应用环境
- Saltstack:python,一般需要部署agent,执行效率更高
- Puppet:rubby,功能强大,配置复杂,重型,适合大型环境
- Fabric:python,agentless
- Chef:rubby,国内应用很少
- Cfengine
- func
三:安装准备
3.1 环境准备
IP | System | Hostname | Role |
---|---|---|---|
172.17.2.245 | CentOS7.4 | node245.ginvip.com | master |
172.17.2.246 | CentOS7.4 | node246.ginvip.com | slaver |
172.17.2.247 | CentOS7.4 | node247.ginvip.com | slaver |
172.17.2.248 | CentOS7.4 | node248.ginvip.com | slaver |
3.2 安装
Ansible仓库默认不在yum仓库中,因此我们需要使用下面的命令安装epel仓库。
# master端安装即可
yum install epel-release -y
yum install ansible -y
ansible --version
pip方式安装:
yum install python-pip python-devel
yum install gcc glibc-devel zibl-devel rpm-build openssl-devl
pip install --upgrade pip
pip install ansible --upgrade
配置文件:
/etc/ansible/ansible.cfg # 主配置文件,配置ansible工作特性
/etc/ansible/hosts # 主机清单
/etc/ansible/roles/ # 存放角色的目录
程序文件:
/usr/bin/ansible # 主程序,临时命令执行工具
/usr/bin/ansible-doc # 查看配置文档,模块功能查看工具
/usr/bin/ansible-galaxy # 下载/上传优秀代码或Roles模块的官网平台
/usr/bin/ansible-playbook # 定制自动化任务,编排剧本工具/usr/bin/ansible-pull远程执行命令的工具
/usr/bin/ansible-vault # 文件加密工具
/usr/bin/ansible-console # 基于Console界面与用户交互的执行工具
3.3 Ansible配置文件
Ansible默认安装好后有一个配置文件/etc/ansible/ansible.cfg,该配置文件中定义了ansible的主机的默认配置部分,如默认是否需要输入密码、是否开启sudo认证、action_plugins插件的位置、hosts主机组的位置、是否开启log功能、默认端口、key文件位置等等。
[defaults]
# some basic default values...
# hostfile = /etc/ansible/hosts # 指定默认hosts配置的位置
# library_path = /usr/share/my_modules/
# remote_tmp = $HOME/.ansible/tmp
# pattern = *
# forks = 5 # 默认并发数
# poll_interval = 15
# sudo_user = root # 远程sudo用户
# ask_sudo_pass = True # 每次执行ansible命令是否询问ssh密码
# ask_pass = True # 每次执行ansible命令时是否询问sudo密码
# transport = smart
# remote_port = 22
# module_lang = C
# gathering = implicit
host_key_checking = False # 检查对应服务器的host_key,建议取消注释
log_path = /var/log/ansible.log # 需要时可以自行添加。chown -R root:root ansible.log
# 一般只修改上面两项配置,其他的无需修改
3.4 Ansible-doc
ansible-doc:显示模块帮助
ansible-doc [options] [module...]
-a:显示所有模块的文档
-l, --list:列表可用模块
-s, --snippet:显示指定模块的playbook片段
ansible-doc ping # 查看ping模块的使用说明
ansible-doc -s ping # 简洁版ping模块的使用说明
3.5 Ansible命令参数
anisble命令语法: ansible [-i 主机文件] [-f 批次] [组名] [-m 模块名称] [-a 模块参数]
ansible详细参数:
-v,–verbose # 详细模式,如果命令执行成功,输出详细的结果 (-vv –vvv -vvvv)
-i PATH, -inventory=PATH # 指定 host 文件的路径,默认是在 /etc/ansible/hosts ,inventory [ˈɪnvəntri] 库存
-f NUM,-forks=NUM # NUM 是指定一个整数,默认是 5 ,指定 fork 开启同步进程的个数。
-m NAME,-module-name=NAME # 指定使用的 module 名称,默认使用 command模块
-a,MODULE_ARGS # 指定 module 模块的参数
-k,-ask-pass # 提示输入 ssh 的密码,而不是使用基于 ssh 的密钥认证
-sudo # 指定使用 sudo 获得 root 权限
-K,-ask-sudo-pass # 提示输入 sudo 密码,与 -sudo 一起使用
-u USERNAME,-user=USERNAME # 指定移动端的执行用户
-C,–check # 测试此命令执行会改变什么内容,不会真正的去执行
-b,--become # 代替旧版的sudo切换
ansible dbservers -m command -a 'ls -l /root' -u ubuntu -k -b -K # 以root身份执行
ansible all --list # 查看inventory列表
ansible webservers --list # 查看某个分组下inventory
四:主机清单(inventory)
4.1 基于密码管控主机
在/etc/ansible/hosts文件中加入要管理的主机:
[root@node245 ~]# tail -1 /etc/ansible/hosts
172.17.2.24[6:8]
使用ping模块检测远程主机是否存活:
[root@node245 ~]# ansible 172.17.2.247,172.17.2.248 -m ping -k
SSH password:
172.17.2.248 | SUCCESS => {
"changed": false,
"ping": "pong"
}
# ansible只会输入一次密码,即这一个密码会自动去匹配所有的主机
# -k 使用密码登录远程主机
# -m 指定使用哪个ansible模块
# 也可以将上面的IP地址换成 all 代表检测清单中的所有主机
在/etc/ansible/hosts文件中配置远程主机密码:
[root@node245 ~]# tail -3 /etc/ansible/hosts
172.17.2.246 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=root
172.17.2.247 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=root
172.17.2.248 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=root
ansible all -m ping # 检测清单中所有主机,因为清单文件中配置了SSH登录信息,所以这里就不再提示要输入密码
在/etc/ansible/hosts文件中配置主机分组:
[root@node245 ~]# tail -10 /etc/ansible/hosts
[webservers]
172.17.2.246
172.17.2.247
[dbservers]
172.17.2.247
172.17.2.248
[appservers