Ansible - QLGQ/learning-python GitHub Wiki
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(punnet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
- ansible core:ansible自身核心模块
- host inventory:主机库,定义可管控的主机列表(指定操作的主机,是一个配置文件里面定义监控的主机)
- connection plugins:连接插件,一般默认基于ssh协议连接,负责和被监控端实现通信
- modules:core modules(自带模块)、custom modules(自定义模块)
- playbooks:剧本,按照所设定编排的顺序执行完成安排任务
- plugins:借助于插件完成记录日志邮件等功能
- no agents:不需要在被管控主机上安装任何客户端
- no server:无服务器端,使用时直接运行命令即可
- modules in any languages:基于模块工作,可使用任意语言开发模块
- yaml:使用yaml语言定制剧本playbook
- ssh:默认使用ssh(secure shell)协议对设备进行管理
- strong multi-tier solution:可实现多级指挥
YAML是一种用来表达数据序列的编程语言,它的主要特点包括:可读性强、语法简单明了、支持丰富的语言解析库、通用性强等。ansible环境中配置文件都以YAML格式存在。
块序列就是将描述的元素序列到Python的列表(List)中。以下代码演示了YAML与Python的对应关系:
import yaml
obj = yaml.load(
"""
- Hesperiidae
- Papilionidae
- Apatelodidae
- Epiplemidae
""")
print obj
本例中引用“-”来分隔列表中的每个元素,运行结果如下:
['Hesperiidae', 'Papilionidae', 'Apatelodidae', 'Epiplemidae']
ansible只需在管理端部署环境即可,主服务器(主控端)安装,代码为:sudo apt-get install ansible
第一步是修改主机与组配置,文件位置/etc/ansible/hosts,格式为ini,添加两台主机IP,同时定义两个IP到webservers组,更新的内容如下:
#green.example.com
#blue.example.com
192.168.1.21
192.168.1.22
[webservers]
#alpha.example.com
#beta.example.com
192.168.1.21
192.168.1.22
通过ping模块测试主机的连通性,分别对单主机及组进行ping操作,即可知晓ansible安装、测试成功与否。命令为:ansible 192.168.1.21 -m ping -k
,ansible webservers -m ping -k
。
由于主控端与被控主机未配置SSH证书信任,需要在执行ansible命令时添加-k参数,要求提供root(默认)账号密码,即提示“SSH password:”时输入。很多人更倾向于使用Linux普通用户账户进行连接并使用sudo命令来实现root权限,格式为:
ansible webservers -m ping -u ansible -sudo
。
ansible通过定义好的主机与组规则(Inventory)对匹配的目标主机进行远程操作,配置规则文件默认是/etc/ansible/hosts。
所有定义的主机与组规则都在/etc/ansible/hosts文件中,为ini文件格式,主机可以用域名、IP、别名进行标识,其中webservers、dbservers为组名,紧跟着的主机为其成员。格式如下:
mail.example.com
192.168.1.21:2135
[webservers]
foo.example.com
bar.example.com
192.168.1.22
[dbservers]
one.example.com
two.example.com
three.example.com
192.168.1.23
jumper ansible_ssh_port=22 ansible_ssh_host=192.168.1.50
上述命令行中jumper为定义的一个别名,ansible_ssh_port为主机SSH服务端口,ansible_ssh_host为目标主机。更多保留主机变量如下:
- ansible_ssh_host:连接目标主机的地址
- ansible_ssh_port:连接目标主机SSH端口,端口22无需指定
- ansible_ssh_user:连接目标主机默认用户
- ansible_ssh_pass:连接目标主机默认用户密码
- ansible_connection:目标主机连接类型,可以使local、ssh或paramiko
- ansible_ssh_private_key_file:连接目标主机的ssh私钥
- ansible_*_interpreter:指定采用非Python语言的其他脚本语言,如Ruby、Perl或其他类似ansible_python_interpreter解释器。
组成员主机名称支持正则描述,示例如下:
[webservers]
www[01:50].example.com
[databases]
db-[a:f].example.com
主机可以指定变量,以便后面供Playbooks配置使用,定义格式如下:
[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestsPerChild=909
组变量的作用域是覆盖组所有成员,通过定义一个新块,块名由组名+“:vars”组成,定义格式如下:
[atlanta]
host1
host2
[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com
同时ansible支持组嵌套组,通过定义一个新块,块名由组名+“:children”组成。
嵌套组只能使用在/usr/bin/ansible-playbook中,在/usr/bin/ansible中不起作用。
为了更好规范定义的主机与组变量,ansible支持将/etc/ansible/hosts定义的主机名与组变量单独剥离出来存放在指定的文件中,将采用YAML格式存放,存放位置规定:“/etc/ansible/group_vars/+组名”和“/etc/ansible/host_vars/+主机名”分别存放指定组名或主机名定义的变量,例如:
/etc/ansible/group_vars/dbservers
/etc/ansible/group_vars/webservers
/etc/ansible/host_vars/foosball
定义的dbservers变量格式为:
---
ntp_server: acme.example.org
database_server: storage.example.org
在ansible1.2及以后版本中,group_vars/和host_vars/目录可以保存在playbook目录或inventory目录,如同时存在,inventory目录的优先级高于playbook目录的。
目标(Patterns)匹配的格式为:ansible <pattern_goes_here> -m <module_name> -a <arguments>
。举例说明,重启webservers组的所有的Apache服务:ansible webservers -m service -a "name=httpd state=restarted"。
匹配目标主机规则表
规则 | 含义 |
---|---|
192.192.12或one.example.com | 匹配目标IP地址或主机名,多个IP或主机名使用“:”号分隔 |
webservers | 匹配目标组为webservers,多个组使用“:”号分隔 |
All或'*' | 匹配目标所有主机 |
~(web|db).*\.example\.com或192.168.1.* | 支持正则表达式匹配主机或IP地址 |
webservers:!192.168.1.22 | 匹配webservers组且排除192.168.1.22主机IP |
webservers:&dbservers | 匹配webservers与dbservers两个群组的交集 |
webservers:!{{excluded}}:&{{required}} | 支持变量匹配方式 |
markdown中表格中使用逻辑或符号“|”的方法为:
|
。