1.Ansible介绍
Ansible是2012年推出的一种通用自动化工具,可用于配置管理或工作流程自动化,配置管理是一种"基础架构代码"实践,它将事务编码,例如应该在安装什么包和版本,或者应该运行什么守护进程,工作流自动化可能是从配置基础架构到部署软件的任何事情,ansible在2015年时被Redhat公司收购。
Ansible使用Python编写的,它使用SSH在不同的机器上执行命令,Ansible是无代理的,这使得入手更容易,您值需要在相关机器上安装SSH和Python。Ansible使用声明式语言"playbook"将一组主机("hosts")映射到定义明确的角色,声明性用于指示Ansible如何设置或更改事务
Ansible 的目标
一切自动化
ansible的使用范围
- 自动化部署应用
- 自动化管理配置
- 自动化的持续交付
- 自动化的云服务管理
- 自动化网络设备管理
Ansible特点
Ansible自2012年发布以来,很快在全球流行,其特点如下:
Ansible基于Python开发,运维工程对其二次开发相对比较容易;
Ansible丰富的内置模块,几乎可以满足一切要求;
管理模式非常简单,一条命令可以影响上千台主机;
无客户端模式,底层通过SSH通信;
Ansible发布后,也陆续被AWS,Google Cloud Platform, Microsoft Azure, Cisco, HP, VMware, Twittwer等大公司接纳并投入使用
Ansible执行流程
简单理解就是ansible在运行时,首先读取ansible.cfg中的配置,根据规则获取inventory中的管理主机列表,并行的在这些主机中执行配置的任务,最后等待执行返回的结果,ansible命令执行过程,自己的理解哈.
1,加载自己的配置文件,默认/etc/ansible.cfg;
2,查找对应的主机配置文件,找到要执行的主机或组;
3,加载自己对应的模块文件,如command;
4,通过ansible将模块或命令生成对应的临时py文件,并将该文件传输到远程服务器上;
5,对应执行用户的家目录的.ansible/temp/xxx/xxx.py文件
ex:
6,给文件+x执行权限;
7,执行并返回结果;
8,删除临时py文件,sleep 0 退出;
安装Ansible
Ansible对管理主机的要求
目前,只要机器上安装了Python2(版本2.6或2.7)或Python3(版本3.5及更高版本)都可以运行Ansible(windows系统不可以做管理主机)管理主机的系统可以时Red Hat,Debian,CentOS,OS X, BSD的各种版本
Ansible对节点主机的要求
通常我们使用ssh与节点通信,默认使用sftp,如果sftp不可用,可在ansible.cfg配置文件中配置成scp的方式,在节点上也需要安装python2(2.6或更高版本)或Python3(3.5或更高版本)
在管理节点上离线安装ansible
这里我们选择使用centos/rehel的安装方式
bash命令行自动补全
在ansible2.9之后,就支持了命令行参数补齐功能
在bash 小于4.2 时,使用下列命令注册
创建SSH免交互登录
Ansible通过SSH对设备进行管理,而ssh包含两种认证方式:一种时通过密码认证,另外一种时通过密钥对验证,前者必须和系统交互,而后者时免交互登录,如果希望通过ansible自动管理设备,应该配置为面交互登录被登录设备
通过ssh-copy-id复制公钥到远端机器上
至此,已完成Ansible的部署
对Ansible节点进行管理
任务
我们将要在目标主机上安装部署nginx服务
步骤
安装ansible,上面的部署我就不说了
1,定义主机清单
定义一个简单的通过ssh认证的主机清单
主机清单中的配置含义
10.0.0.91 定义远程主机ip地址
ansible_ssh_user 连接远程主机的用户
ansible_ssh_pass 连接远程主机的用户密码
2,执行ansible命令
测试连接状态
命令中的含义-10.0.0.91用于匹配主机清单中的主机名称 -m ping指定ping模块,用于测试与远程主机的连接状态
安装nginx
命令中的含义10.0.0.91用于匹配主机清单中的主机名称 -m yum指定yum模块,用于安装软件 -a 'name=nginx'指定模块的参数,name是软件的名称,默认操作是安装。
启动nginx
命令中的含义10.0.0.91用于匹配主机清单中的主机名称 -m systemd指定systemd模块,用于管理系统服务,-a 'name=nginx state=startd enabled=yes'指定模块的参数,name是软件的名称,state指定管理状态,enabled是否开启自启动
3,执行ansible playbook
执行playbook
4,认识主机清单
Ansible可同时操作属于一个组的多台主机,组和主机之间的关系通过inventory文件配置,默认的文件路径/etc/ansible/hosts,执行命令的时候使用-i参数即可指定主机清单。
主机清单示例
主机清单文件主要有ini和yaml格式两种语法格式
ini格式
上列配置的一些解释:
ansible_connection 是执行主机的连接类型,默认是smart
ansible_host 主机ssh连接地址
ansible_port 主机ssh连接端口
ansible_user 主机ssh连接用户
ansible_password 主机ssh连接用户密码
ansible_python_interpreter 指定python的执行路径
[webservers:vars]定义webservers组的变量
[server:children]定义server组的子成员
也可以使用yaml格式来表示
但是yaml格式配置可读性比较差,建议使用ini方式来设置主机清单
使用多个主机清单
在命令参数中,使用多个-i就可以指定多个主机清单
主机内置变量列表
用于主机连接
参数 | 描述 |
ansible_connection | 与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行. |
用于所有连接
参数 | 描述 |
ansible_host | 将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置. |
ansible_port | 连接端口号,如果是ssh的话,默认是22 |
ansible_user | 用于连接认证的用户名 |
ansible_password | 用于连接认证的用户名密码 |
ssh连接参数
参数 | 描述 |
ansible_ssh_private_key_file | ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况. |
ansible_ssh_common_args | 此设置附加到sftp,scp和ssh的缺省命令行 |
ansible_sftp_extra_args | 此设置附加到默认sftp命令行。 |
ansible_scp_extra_args | 此设置附加到默认scp命令行。 |
ansible_ssh_extra_args | 此设置附加到默认ssh命令行。 |
ansible_ssh_pipelining | 确定是否使用SSH管道。这可以覆盖ansible.cfg中得设置。 |
ansible_ssh_executable | ssh可执行文件 |
权限提升参数
参数 | 描述 |
ansible_become | 开启提权,等同于 |
ansible_become_method | 提权方式 |
ansible_become_user | 提权用户,等同于 |
ansible_become_password | 提权密码,等同于 |
ansible_become_exe | 提权所用的可执行文件,等同于 |
ansible_become_flags | 提权命令的参数,等同于 |
远程主机环境参数
参数 | 描述 |
ansible_shell_type | 目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为 'csh' 或 'fish'. |
ansible_python_interpreter | 目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 *BSD, 或者 /usr/bin/python |
ansible_*_interpreter | 这里的"*"可以是 ruby 或 perl 或其他语言的解释器,作用和ansible_python_interpreter 类似 |
ansible_shell_executable | 这将设置ansible控制器将在目标机器上使用的shell,覆盖ansible.cfg中的配置,默认为/bin/sh。 |
限定主机清单的运行主机
使用--limit hostname可以在运行任务的时候,只允许在此主机上运行
连接本机主机
不需要再主机清单里定义,直接使用localhost或127.0.0.1就可以连接本地了
使用别名连接主机
5,Patterns匹配
Patterns是定义Ansible要执行的主机,Ansible Patterns可以引用一个主机,一个IP地址,一个清单组,一个集合组或清单中的所有主机,Patterns具有高度的灵活性,您可以排除或要求主机的子集,使用通配符或正则表达式来定义Patterns
命令格式
使用示例
在playbook的剧本中,需要在每个play中hosts:行中定义
使用示例
常见匹配
描述 | Pattern(s) | Targets |
所有主机 |
| 主机清单中的所有主机 |
一个主机(精确匹配) |
|
|
多个主机 |
|
|
一个组 |
|
|
多个组(或匹配) |
|
|
排除组(非模式匹配) | webservers:!atlanta |
|
交集组(交集匹配) | webservers:&dbservers |
|
通配符匹配
表示所有字符
组合匹配
在webservers或者dbservers组中,必须还存在与staging中,但是不再phonenix组中
局限性
Patterns依赖于主机清单(inventory),如果说匹配不到主机清单里的数据,则回返回如下警告
在ansible-playbook命令中,你也可以使用变量来组成这样的表达式,但是你必须使用-e的选项来指定这个表达式
执行playbook
使用切片
可以使用下表来选择组中的各个主机或范围,类似python中的切片
[0]表示组第一个成员
[1:]表示组内第2个含第2个之后的所有成员
[0:25]表示组第1个到第24个成员
正则表达式
在开头的地方使用"~",表示这是一个正则表达式
限定主机
可以使用命令行选项更改playbook中定义的Patterns的行为
6,使用ad-hoc命令
ad-hoc命令
ansible [pattern] -m [module] -a "[module options]"
执行结果说明
rc:命令返回码(0表示成功)
执行shell命令
command
重启服务器
ansible servers -a "reboot"
不指定-m模块时,将使用ansible的默认模块command,它不会通过shell进行处理,所以像$HOME和像"<",">",“|”,“&”将不工作,测试下
默认情况下,Ansible使用5个并发进程,如果要扩大并发,使用-f 10参数指定数量即可
默认情况下,Ansible连接远端用户是当前用户,使用-u参数可以修改
shell
获取web组里的eth0网卡接口信息
raw
如果是远程主机没有python模块时,可以使用raw模块执行命令
script
执行脚本
将本地脚本传送到远程节点上执行
文件管理
copy
拷贝本地的/etc/hosts文件到web组所有主机的/tmp/hosts(空目录除外)
拷贝本地的/etc/hosts文件到目的地址,设置其用户及权限,如果目标地址存在相同的文件,则备份源文件
fetch
从远端服务器拷贝文件到本地
file
更改文件的用户及权限
创建目录,类似mkdir -p
删除文件或者目录
创建软链接,并设置所属用户和用户组
unarchive
将本地的压缩文件解压到目标主机
安装软件包
yum
安装最新的Apache
删除apache
更新所有的包
安装远程的rpm包
package
使用远程主机的包管理器进行安装,卸载,更新软件,相对于apt和域名而言,兼容性更好。
安装ntpdate
用户和用户组
user
添加用户hero并设置其uid和主要的组'admin'