Ansible - QLGQ/learning-python GitHub Wiki

Introduction

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(punnet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。

Architecture

  1. ansible core:ansible自身核心模块
  2. host inventory:主机库,定义可管控的主机列表(指定操作的主机,是一个配置文件里面定义监控的主机)
  3. connection plugins:连接插件,一般默认基于ssh协议连接,负责和被监控端实现通信
  4. modules:core modules(自带模块)、custom modules(自定义模块)
  5. playbooks:剧本,按照所设定编排的顺序执行完成安排任务
  6. plugins:借助于插件完成记录日志邮件等功能

ansible架构

Features

  1. no agents:不需要在被管控主机上安装任何客户端
  2. no server:无服务器端,使用时直接运行命令即可
  3. modules in any languages:基于模块工作,可使用任意语言开发模块
  4. yaml:使用yaml语言定制剧本playbook
  5. ssh:默认使用ssh(secure shell)协议对设备进行管理
  6. strong multi-tier solution:可实现多级指挥

YAML

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 -kansible 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中表格中使用逻辑或符号“|”的方法为:&#124;

⚠️ **GitHub.com Fallback** ⚠️