1.Ansible介绍
Ansible是一款开源的自动化运维工具, 在2012年由Michael DeHaan创建, 现在由Red Hat维护。Ansible是基于Python开发的,采用YAML语言编写自动化脚本playbook, 可以在Linux、Unix等系统上运行, 通过SSH协议管理节点, 无需在被管理节点安装agent。Ansible以其简单、高效、无agent成为广泛使用的自动化工具, 可以应用于配置管理、应用部署、任务调度等。
Ansible能够自动管理远程系统和控制它们的期望状态, 一个基础Ansible环境主要包含三大组件:
- 控制节点 - 安装有Ansible的系统。我们可以在控制节点上运行Ansible命令,如
ansible
或ansible-inventory
。 - 管理节点 - Ansible控制的远程系统或主机。
- 清单 - 在逻辑上组织起来的受控节点列表。在控制节点上创建清单,用来描述Ansible管理的主机部署。
架构如下:
2.Ansible安装和配置
使用 yum 安装
yum install epel-release -y
yum install ansible –y
ansible 程序结构
安装目录如下(yum安装):
配置文件目录:/etc/ansible/
执行文件目录:/usr/bin/
Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/
Help文档目录:/usr/share/doc/ansible-X.X.X/
Man文档目录:/usr/share/man/man1/
安装完成后输入命令: ansible --version查看版本号
接下来需要配置管理hosts, 在目标目录新建一个名为hosts的清单文件:/etc/ansible/hosts
编辑hosts文件,输入以下格式内容
[virtualmachines]
192.168.204.130
192.168.204.131
在标签名称下的2个IP地址是我的另外2台虚拟机,它们将接收ansible的统一管理。
在命令行输入命令:ansible all --list-hosts
该命令将验证清单中的主机, 返回信息如下:
hosts(2):
192.168.204.130
192.168.204.131
在控制节点192.168.204.129中, 我们需要生成一个SSH的密钥对,输入以下命令:
ssh-keygen -t rsa
中间提示一律按回车键即可, 结束后将在~/.ssh目录下生成id_rsa和id_rsa.pub两个密钥文件,我们要将公钥id_rsa.pub文件发送到2台虚拟机上(192.168.204.130-131), 分别输入以下命令:
ssh-copy-id root@192.168.204.130
ssh-copy-id root@192.168.204.131
接下来我们输入以下命令进行免密码登录验证:
ssh root@192.168.204.130
此时, 我们可以输入以下命令进行批量主机管理测试:
ansible all -m ping
返回结果
可以看到, 2台受管理的主机已经全部Ping通。
3.创建清单
通过清单文件, Ansible可以通过单个命令管理大量主机, 且可以通过减少需要指定的命令行选项数量来帮助我们更有效地使用Ansible,例如:清单通常包含SSH用户, 因此在运行Ansible命令时可以不需要包含-u参数来指定用户名。
在任意目录创建一个名为inventory.yaml的文件, 这里我把清单文件建在目录: /home/inventory.yaml, 内容如下:
[virtualmachines]
hosts:
vm01:
ansible_host: 192.168.204.130
vm02:
ansible_host: 192.168.204.130
vm03:
ansible_host: 192.168.204.130
下面输入命令进行验证:
ansible-inventory -i inventory.yaml --list
注意一下 -i 参数后面的yaml文件路径, 我这里是cd到yaml文件的当前目录了, 所以直接跟的文件名, 在实际应用过程中需要根据情况进行全路径和相对路径的选择。
该命令执行返回结果
接下来对清单中的受管节点执行Ping操作, 执行命令:
ansible virtualmachines -m ping -i inventory.yaml
返回结果
4.创建剧本(playbook)
剧本是Ansible用来部署和配置受管节点的自动化蓝图,使用YAML格式编写。
下面先解释一下剧本的基本元素:
- Play - 按顺序排列的任务列表,与inventory中受管节点对应映射。
- 任务(task) - 定义Ansible要执行的一个或多个模块操作的列表。
- 模块:Ansible在受管节点上运行的代码单元或二进制文件。Ansible的模块按集合组织,每个模块有一个完全限定的集合名称(Fully Qualified Collection Name, FQCN)。
在上面的操作中,我们使用了ansible
命令来ping清单中的主机。现在创建一个playbook,它不仅可以ping主机,还可以打印“Hello world”消息。
继续在/home目录下创建一个名为playbook.yaml的文件, 输入以下内容:
- name: suntiger's
hosts: virtualmachines
tasks:
- name: Ping my hosts
ansible.builtin.ping
- name: Print message
ansible.builtin.debug
msg: Hello World
在该配置文件中, 我们定义了一个剧本的名称、定义了hosts名称和具体的任务(tasks), 其中任务项这里包含两个: Ping主机和打印消息。
接下来我们看看剧本效果如何, 输入以下命令:
ansible-playbook -i inventory.yaml playbook.yaml
返回结果
从结果来看,一切都OK, 成功执行了我们的剧本并对2个目标主机进行了Ping