什么是ansible?
Ansible是一款自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
工作原理
Ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是Ansible所运行的模块,Ansible只是提供一种框架。主要包括: (1) 连接插件connection plugins:负责和被监控端实现通信; (2) host inventory:指定操作的主机,是一个配置文件里面定义监控的主机; (3) 各种模块核心模块、command模块、自定义模块; (4) 借助于插件完成记录日志邮件等功能; (5) playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
Ansible 围绕无代理架构构建(由于没有代理,也不需要额外的自定义安全基础架构,)。通常而言,Ansible 通过 OpenSSH 或 WinRM 连接它所管理的主机并且运行任务,方法通常是将称为 Ansible 模块的小程序推送至这些主机。这些程序用于将系统置于需要的特定状态。在 Ansible 运行完其任务后,推送的所有模块都会被删除。
优点
-
部署简单:只需要在控制节点上配置ansible环境,被控制节点上只需安装ssh和Python2.6及以上版本 -
跨平台支持:Ansible 提供Linux、Windows、UNIX和网络设备的无代理支持,适用于物理、虚拟、云和容器环境。 -
人类可读的自动化:Ansible Playbook采用YAML文本文件编写,易于阅读,有助于确保所有人都能理解它们的用途。 -
完美描述应用:可以通过 Ansible Playbook进行每种更改,并描述和记录应用环境的每一个方面。 -
轻松管理版本控制:Ansible Playbook和项目是纯文本。它们可以视作源代码,放在现有版本控制系统中。 -
支持动态清单:可以从外部来源动态更新 Ansible 管理的计算机列表,随时获取所有受管服务器的当前正确列表,不受基础架构或位置的影响。 -
编排可与其他系统轻松集成:能够利用环境中现有的 HP SA、Puppet、Jenkins、红帽卫星和其他系统,并且集成到 Ansible 工作流中。 -
支持playbook编排任务 -
幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况 -
可使用任何编程语言写模块 -
YAML格式,编排任务,支持丰富的数据结构 较强大的多层解决方案
Ansible 方式
Ansible 的设计宗旨是工具易用,自动化易写易读。所以在创建自动化时我们应追求简单化。
Ansible 自动化语言围绕简单易读的声明性文本文件来构建。正确编写的 Ansible Playbook可以清楚地记录你的工作自动化。
Ansible 是一种要求状态引擎。它通过表达你所希望系统处于何种状态来解决如何自动化IT部署的问题。Ansible 的目标是通过仅执行必要的更改,使系统处于所需的状态,Ansible区别于脚本语言
Ansible是基于模块工作的,本身是没有批量部署的能力,真正具有批量部署的是ansible所运行的模块。
Ansible架构
Ansible系统由控制节点和受控制节点两部分组成:
控制节点(即安装ansible的主机):
可以是一台或是多台,但是必须是Linux或者Unix系统,不能使Windows平台
受控制节点(即受管的主机):
在这里插入代码片可以是Linux、Unix、Windows
架构图示: 架构解析:
1.核心:ansible
2.核心模块(Core Modules):ansible自带的模块
3.扩展模块(Custom Modules):如果核心模块不足以完成某种功能,可以添加扩展模块
4.插件(Plugins):通过插件来实现记录日志,发送邮件或其他功能
5.剧本(Playbooks):YAML格式文件,多任务自定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
6.连接插件(Connectior Plugins):ansible基于连接插件连接到每个主机上的,虽然ansible是使用ssh连接到每个主机上的,但是它还支持其他的连接方式。
7.主机群(Host Inventory):记录由Ansible管理的主机信息,包括端口、密码、ip等
##Ansible执行流程
1.读取配置
2.抓取全量机器&分组列表可从多个静态文件、文件夹、脚本中读取机器,分组及其变关联量信息。
3.使用host-pattern过滤机器列表
4.根据参数确定执行模块和配置 从modules目录动态读取,用户可以自行开发模块
5.Runner执行返回
6.输出结束
##Ansible执行状态
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败
Ansible安装流程(以centos7为例)
直接利用自带源下载
[root@localhost ~]
[root@localhost ~]
Loaded plugins: fastestmirror, langpacks
Existing lock /var/run/yum.pid: another copy is running as pid 11199.
Another app is currently holding the yum lock; waiting for it to exit...
The other application is: PackageKit
Memory : 313 M RSS (1.6 GB VSZ)
Started: Tue Jul 13 08:24:10 2021 - 00:43 ago
State : Sleeping, pid: 11199
发现yum源被另一个程序锁定
利用pid直接终止该进程
[root@localhost ~]
[root@localhost ~]
检查版本
[root@localhost ~]
config file(配置文件) = /etc/ansible/ansible.cfg
configured module search path(已配置的模块搜索路径) = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location(Ansible python模块位置) = /usr/lib/python2.7/site-packages/ansible
executable location(可执行文件的位置) = /usr/bin/ansible
python version(python版本) = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
##配置文件
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主机清单
/etc/ansible/roles/ 存放角色的目录
[root@localhost ~]
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
与主机联通性正常
显示当前主机时间
[root@localhost ~]
localhost | CHANGED | rc=0 >>
Tue Jul 13 08:56:19 PDT 2021
匹配所有主机
[root@localhost ~]
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit
localhost does not match 'all'
此时没有添加受管主机显示为空
去ansible主机清单配置文件添加受管主机地址
[root@localhost ~]
尝试ping
[root@localhost ~]
192.168.216.131 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
"unreachable": true
}
访问被拒绝
添加-k 密匙验证
[root@localhost ~]
SSH password:
192.168.216.131 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
成功
|