目录
一、Ansible 是什么?
Ansible
是一个 IT 自动化工具。它可以配置系统、部署软件并协调更高级的 IT 任务,例如持续部署或零停机时间滚动更新等。Ansible 的主要目标是简单和易用,它还非常关注安全性和可靠性,具有最少的移动部件,其使用 OpenSSH
进行传输。
二、Ansible 安装
2.1 安装
2.1.1 Python 方式
1、安装最新版本
python3 -m pip install --user ansible
2、安装指定版本
python3 -m pip install --user ansible-core==2.12.3
3、升级 Ansible
python3 -m pip install --upgrade --user ansible
4、验证
ansible --version
5、Ansible 的 shell补全
-
安装 argcomplete
python3 -m pip install --user argcomplete
-
配置 argcomplete
# 全局配置:要求 bash 4.2 activate-global-python-argcomplete
# 如果您没有 bash 4.2,则必须单独注册每个脚本 eval $(register-python-argcomplete ansible) eval $(register-python-argcomplete ansible-config) eval $(register-python-argcomplete ansible-console) eval $(register-python-argcomplete ansible-doc) eval $(register-python-argcomplete ansible-galaxy) eval $(register-python-argcomplete ansible-inventory) eval $(register-python-argcomplete ansible-playbook) eval $(register-python-argcomplete ansible-pull) eval $(register-python-argcomplete ansible-vault)
2.1.2 Yum 方式
sudo yum install epel-release
sudo yum install ansible
其他特定系统安装请看官方文档。
2.2 配置
配置文件位于 /etc/ansible
下,Ansible 中的某些设置可通过配置文件 (ansible.cfg) 进行调整。对于大多数用户来说,Inventory 配置已经足够了。
三、快速入门
3.1 三组件
一个基本的 Ansible 环境包含三个主要组件:Control node
、Managed node
、Inventory
1、Control node
安装了 Ansible 的系统,安装完成后,可以在控制节点上运行 Ansible 相关命令,例如ansible
或ansible-inventory
。
2、Managed node
Ansible 控制的远程系统或主机,即接下来要说到的 hosts 文件中的主机清单。
3、Inventory
逻辑组织的受管节点列表,在控制节点上创建一个清单以向 Ansible 描述主机部署。
3.2 基础使用
我的 ansible 机器为:192.168.56.132
1、安装 Ansible
python3 -m pip install --user ansible
# 或 yum 安装
yum instakk -y ansible
2、添加主机列表
通过将一个或多个远程系统的 IP 地址或完全限定域名 (FQDN) 添加到
/etc/ansible/hosts
[web]
192.168.56.132
192.168.56.180
3、验证清单中的主机
ansible all --list-hosts
hosts (2):
192.168.56.132
192.168.56.180
3、设置 SSH 连接
将
Control node
主机的 SSH 公密添加到每个远程系统(主机)上的authorized_keys
文件中,以便 Ansible 可以连接到受管节点。
ssh-copy-id 192.168.56.180
如果控制节点上的用户名在主机上不同,则需要将-u
选项与ansible
命令一起传递。
4、Ping 受管节点
ansible all -m ping
192.168.56.180 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.56.132 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
3.3 创建 Inventory
Inventory 文件位于 Control node 节点上(即安装 ansible 的主机)。使用清单文件,Ansible 可以通过单个命令管理大量主机,我们也可以直接将受管节点添加到/etc/ansible/hosts
文件中,来实现批量主机管理。在 Inventory 文件编写中,其语法格式可以是INI
或YAML
格式,建立一个 Inventory 的基本步骤如下:
- 在您的控制节点上打开一个终端窗口。
- 在任何目录中创建一个新的库存文件
inventory.yaml
并打开它进行编辑。 - 为您的主机添加一个新组,然后使用该字段指定每个受管节点的 IP 地址或完全限定域名 (FQDN)
ansible_host
。
1、创建名为 inventory.yaml 的 Inventory
cat inventory.yaml
mywebhost:
hosts:
vm01:
ansible_host: 192.168.56.132
vm02:
ansible_host: 192.168.56.180
# 说明:mywebhost 为组名
2、验证 Inventory
如果你在主目录以外的目录中创建了清单,请使用该
-i
选项指定完整路径。
ansible-inventory -i inventory.yaml --list
2、ping 清单中的受管节点
在此示例中,组名称是
mywebhost
,此时可以使用ansible
命令。
ansible mywebhost -m ping -i inventory.yaml
vm01 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
vm02 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
注意 Inventory 与 hosts 文件的区别:
Ansible 的主机清单是 Inventory,我们可以通过创建 *.yaml
文件来作为我们的主机清单(Inventory)文件,如果你没有创建这个 yaml 文件,那 Ansible 的默认主机清单文件就是 hosts,这个文件在安装 Ansible 时默认存在 的。当找不到 *.yaml 主机清单文件时,就会去找 hosts 文件。
由于 hosts 文件是默认的主机清单文件,如果你想使用你自定义的其他主机清单文件,需通过 -i
参数指定,如 ansible mywebhost -m ping -i inventory.yaml
,否则它会默认去找 hosts 文件。
3.4 创建 playbook
YAML
剧本是 Ansible 用于部署和配置托管节点的自动化蓝图。看看几个重要元素:
-
Playbook
定义 Ansible 从上到下执行操作以实现总体目标的顺序的剧本列表。
-
Play
映射到清单中的受管节点的有序任务列表。
-
Task
定义 Ansible 执行的操作的一个或多个模块的列表。
-
Module
Ansible 在托管节点上运行的代码或二进制单元。
创建一个 playbook 的步骤如下:
-
在控制节点上打开一个终端窗口。
-
在任何目录中创建一个新的 playbook 文件
playbook.yaml
并打开它进行编辑。
1、创建 playbook
cat playbook.yaml
- name: My first play
hosts: mywebhost
tasks:
- name: Ping my hosts
ansible.builtin.ping:
- name: Print message
ansible.builtin.debug:
msg: Hello world
# 可看到我的主机清单指定的是mywebhost组,而这个组是在我自定义的Inventory文件中定义的
# 因此我在运行playbook时需要-i指定自定义的Inventory文件,如果不指定,ansible就回去找默认的hosts文件,而这个文件中根本没有mywebhost这个组名,所以会报错。
2、运行 playbook
ansible-playbook -i inventory.yaml playbook.yaml
剧本的执行过程:
- 任务隐式运行。默认情况下,Ansible 会收集可以在 playbook 中使用的库存信息(Inventory),
Gather Facts
。 - 每个任务的状态。每个任务都有一个状态,
ok
这意味着它运行成功。 - 对每个主机的剧本中所有任务的结果进行总结的剧本回顾。在此示例中,共有三个任务,因此
ok=3
表明每个任务都运行成功。