文章目录
自动化运维工具Ansible
1.Ansible简介
1.1 什么是Ansible
Ansible是一款自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
Ansible是分布式,无需客户端,轻量级,配置语法使用 YMAL 及 Jinja2模板语言,更强的远程命令执行操作。
Ansible工具的目标有这么几项:自动化部署APP;自动化管理配置项;自动化的持续交互;自动化的(AWS)云服务管理。所有的这几个目标从本质上来说都是在一个台或者几台服务器上,执行一系列的命令而已。通俗的说就是批量的在远程服务器上执行命令 。最主要的是它是基于 paramiko 开发的。这个paramiko是什么呢?它是一个纯Python实现的ssh协议库。因此fabric和ansible还有一个共同点就是不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的
1.2Ansible的特点
- 跨平台支持:Ansible 提供Linux、Windows、UNIX和网络设备的无代理支持,适用于物理、虚拟、云和容器环境。
- 人类可读的自动化:Ansible Playbook采用YAML文本文件编写,易于阅读,有助于确保所有人都能理解它们的用途。
- 完美描述应用:可以通过 Ansible Playbook进行每种更改,并描述和记录应用环境的每一个方面。
- 轻松管理版本控制:Ansible Playbook和项目是纯文本。它们可以视作源代码,放在现有版本控制系统中。
- 支持动态清单:可以从外部来源动态更新 Ansible 管理的计算机列表,随时获取所有受管服务器的当前正确列表,不受基础架构或位置的影响。
- 编排可与其他系统轻松集成:能够利用环境中现有的 HP SA、Puppet、Jenkins、红帽卫星和其他系统,并且集成到 Ansible 工作流中。
- 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可
- 批量任务执行可以写成脚本,而且不用分发到远程就可以执行
- 使用python编写,维护更简单,ruby语法过于复杂
1.3 Ansible的工作模式
Ansible 通过本身集成的非常丰富的模块可以实现各种管理任务,Ansible只是提供一种框架。主要包括:
- 连接插件connection plugins:负责和被监控端实现通信;
- host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
- 各种模块核心模块、command模块、自定义模块;
- 借助于插件完成记录日志邮件等功能;
- playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
Ansible架构图
- Ansible核心:是指执行任务的程序,主要有ansible命令和ansible-playbook命令,前者执行一些临时性的命令,后者根据编排好的剧本可以执行非常复杂的任务
- Inventory: 主机清单,里面包含了要执行任务的服务器ip,执行任务时需要制定主机清单,不指定时使用默认配置,命令行中使用-i参数指定
- Modules: 模块,ansible提供了相当多的内置模块,比如command模块可以支持在远程服务器上执行命令行,copy模块可以拷贝本地文件到远程服务器等。模块也分为三类:核心模块、扩展模块、自定义模块
- Playbook: 剧本,将所需要执行的任务通过配置文件的方式保存下来,我们称该配置文件为剧本。ansible使用yaml格式编写剧本。ansible-playbook是专门执行剧本的命令
1.3Ansible任务执行模式
Ansible 系统由控制主机对被管节点的操作方式可分为两类,即adhoc和playbook
-
ad-hoc模式(点对点模式) 使用单个模块,支持批量执行单条命令。ad-hoc
命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。 -
playbook模式(剧本模式)
是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。
1.4Ansible工作流程
2Ansible安装配置
2.1Ansible安装
- Ansible的安装部署非常简单,以RPM安装为例,其依赖软件只有Python和SSH,且系统默认均已安装。Ansible的管理端只能是Linux,如RedHat、Debian、CentOS。
- 操作系统是红帽8.0,Ansible 2.9可以自动使用 platform-python
软件包,该软件包支持使用Python的系统实用程序。你不需要从 AppStream安装python37或python27软件包。
[root@zhaojie ~]# yum list installed platform-python
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
已安装的软件包
platform-python.x86_64 3.6.8-23.el8 @anaconda
- 通过YUM安装Ansible
[root@zhaojie yum.repos.d]# wget -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo
[root@zhaojie yum.repos.d]# ls
Centos-8.repo CentOS-Base.repo
- 安装epel-release源
[root@zhaojie yum.repos.d]# dnf -y install epel-release
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
CentOS-8 - Extras - mirrors.aliyun.com 6.8 kB/s | 1.6 kB 00:00
导入 GPG 公钥 0x8483C65D:
Userid: "CentOS (CentOS Official Signing Key) <security@centos.org>"
指纹: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
来自: https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-Official
.......
导入公钥成功
运行事务检查
事务检查成功。
运行事务测试
事务测试成功。
运行事务
准备中 : 1/1
安装 : epel-release-8-11.el8.noarch 1/1
运行脚本: epel-release-8-11.el8.noarch 1/1
验证 : epel-release-8-11.el8.noarch 1/1
Installed products updated.
已安装:
epel-release-8-11.el8.noarch
完毕!
- 安装Ansible
[root@zhaojie ~]# dnf -y install ansible
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
......
已安装:
ansible-2.9.23-1.el8.noarch libsodium-1.0.18-2.el8.x86_64
python3-babel-2.5.1-5.el8.noarch python3-bcrypt-3.1.6-2.el8.1.x86_64
python3-jinja2-2.10.1-2.el8_0.noarch python3-jmespath-0.9.0-11.el8.noarch
python3-markupsafe-0.23-19.el8.x86_64 python3-paramiko-2.4.3-1.el8.noarch
python3-pyasn1-0.3.7-6.el8.noarch python3-pynacl-1.3.0-5.el8.x86_64
sshpass-1.06-9.el8.x86_64
完毕!
- 通过ansible -m setup localhost查看本机信息
[root@zhaojie ~]# ansible -m setup localhost
localhost | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.25.128",
"192.168.122.1"
],
"ansible_all_ipv6_addresses": [
"fe80::871d:6b3a:94aa:aae4"
],
"ansible_apparmor": {
"status": "disabled"
},
"ansible_architecture": "x86_64",
"ansible_bios_date": "07/29/2019",
"ansible_bios_version": "6.00",
"ansible_cmdline": {
"BOOT_IMAGE": "(hd0,msdos1)/vmlinuz-4.18.0-193.el8.x86_64",
"crashkernel": "auto",
"quiet": true,
"rd.lvm.lv": "rhel/swap",
"resume": "/dev/mapper/rhel-swap",
"rhgb": true,
"ro": true,
"root": "/dev/mapper/rhel-root"
- 通过使用setup模块验证localhost上的ansible_python_version
[root@zhaojie ~]# ansible -m setup localhost|grep python
"_": "/usr/bin/python3.6"
"ansible_python": {
"executable": "/usr/bin/python3.6",
"type": "cpython",
"ansible_python_version": "3.6.8",
"ansible_selinux_python_present": true,