1. Ansible 概念
- Control node
任何安装了 Ansible 的机器。可以通过从任何控制节点调用ansible
oransible-playbook
命令来运行 Ansible 命令和 playbook 。可以使用任何安装了 Python 的计算机作为控制节点——笔记本电脑、共享桌面和服务器都可以运行 Ansible, 并可以控制多个控制节点。但是,不能将 Windows 机器用作控制节点。 - Managed nodes
使用 Ansible 管理的网络设备(和/或服务器)。受管节点有时也称为“主机”。Ansible 未安装在受管节点上。 - Inventory
受管节点列表。清单文件有时也称为“主机文件”。您的清单可以为每个受管节点指定 IP 地址等信息。清单还可以组织受管节点,创建和嵌套组以便于扩展。要了解有关库存的更多信息,请参阅使用库存部分。 - Collections
集合是 Ansible 内容的分发格式,可以包括剧本、角色、模块和插件。您可以通过Ansible Galaxy安装和使用集合。要了解有关集合的更多信息,请参阅使用集合。 - Modules
Ansible 执行的代码单元。每个模块都有特定的用途,从管理特定类型数据库上的用户到管理特定类型网络设备上的 VLAN 接口。可以使用任务调用单个模块,或调用剧本中的多个不同模块。从 Ansible 2.10 开始,模块被分组到集合中。有关 Ansible 包含多少集合的想法,请查看集合索引。 - Tasks
Ansible 中的动作单元。可以使用临时命令执行一次单个任务。 - Playbooks
已保存的有序任务列表,以便可以按该顺序重复运行这些任务。剧本可以包括变量和任务。Playbooks 是用 YAML 编写的,易于阅读、编写、共享和理解。要了解有关 playbook 的更多信息,请参阅playbook 简介。
2. 安装 Ansible
2.1 控制节点要求
控制节点(运行 Ansible 的机器), 建议使用任何安装了 Python 3.8 或更新版本的机器。这包括 Red Hat、Debian、CentOS、macOS、任何 BSD 等等。控制节点不支持 Windows。
2.2 受控节点要求
尽管托管节点上不需要守护进程,但需要一种 Ansible 与它们进行通信的方式。对于大多数受管节点,Ansible 通过 SSH 建立连接并使用 SFTP 传输模块。如果 SSH 有效但 SFTP 在您的某些受管节点上不可用,您可以在ansible.cfg 中切换到 SCP 。对于任何可以运行 Python 的机器或设备,您还需要 Python 2(版本 2.6 或更高版本)或 Python 3(版本 3.5 或更高版本)。
2.3 在特定系统上安装 Ansible
Fedora: $ sudo dnf install ansible
RHEL: $ sudo yum install ansible
CentOS: $ sudo yum install epel-release
$ sudo yum install ansible
Ubuntu:
$ sudo apt update
$ sudo apt install software-properties-common
$ sudo add-apt-repository --yes --update ppa:ansible/ansible
$ sudo apt install ansible
2.4 pip 安装 Ansible
2.4.1 通过 ansible 用户安装
$ python -m pip install --user ansible
2.4.2 全局安装
sudo python -m pip install ansible
3. Ansible 配置设置
3.1 配置文件介绍
Ansible 支持多种来源来配置其行为,包括名为 的 ini 文件ansible.cfg
、环境变量、命令行选项、剧本关键字和变量。有关每个源的相对优先级的详细信息,请参阅控制 Ansible 的行为:优先级规则。
3.2 配置文件查看&浏览
ansible-config
命令 允许用户查看所有可用的配置设置、默认值、设置方式以及当前值的来源。有关更多信息,请参阅ansible-config。
3.3 配置文件查找顺序
Ansiblw将按以下顺序搜索的配置文件中进行和使用更改:
- ANSIBLE_CONFIG (如果设置了环境变量)
- ansible.cfg (在当前目录中)
- ~/.ansible.cfg (在主目录中)
- /etc/ansible/ansible.cfg
Ansible 将处理上面的列表并使用找到的第一个文件,所有其他文件都将被忽略。
3.4 配置文件覆盖优先级
Ansible 提供了四种控制其行为的来源。按照从最低(最容易覆盖)到最高(覆盖所有其他)的优先级顺序,类别是:
- 配置设置
- 命令行选项
- 剧本关键词
- 变量
每个类别都会覆盖所有优先级较低的类别中的任何信息。例如,剧本关键字将覆盖任何配置设置。
在每个优先级类别中,都适用特定的规则。但是,一般来说,“最后定义”会胜出并覆盖任何先前的定义。
4. Ansible 入门
4.1 Ansible 工作原理
一个基本的Ansible 命令 或 playbook 执行流程如下:
- 从主机列表选择要执行的机器
- 通过SSH 连接到这些机器
- 将一个或多个模块复制到远程机器上执行命令
4.2 基本使用
4.2.1. 编辑或创建 /etc/ansible/hosts, 并向其中添加ip 或者 FQDNs
192.168.11.50
aserver.example.org
bserver.example.org
4.2.2. 连接到远程节点
注: 确保可以使用相同的用户名连接到主机列表
中的所有节点,最好对所有节点都设置了免密登录, 所以建议控制节点和管理节点都创建ansible 用户,并根据需求设置用户权限.
可以通过多种方式覆盖默认远程用户名(当前执行命令的用户),包括:
-u 在命令行传递参数
在主机列表中设置用户信息
在配置文件中设置用户信息
设置环境变量
4.2.3. 复制和执行模块
ssh连接后,Ansible 会将命令或剧本所需的模块传输到远程机器以供执行。
4.2.3.1 运行Ansible 命令
- 使用 ping 模块 ping 主机列表中所有节点:
$ ansible all -m ping
aserver.example.org | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
注: 可以使用 -u 来指定要连接的用户,默认情况下 Ansible 使用 SSH,默认为当前用户
。
- 在所有节点运行实时命令
ansible all -a "/bin/echo hello"
server.example.org | CHANGED | rc=0 >>
hello
4.2.3.2 运行第一个playbook
- 创建或编辑 mytask.yaml
---
- name: My playbook
hosts: all
tasks:
- name: Leaving a mark
command: "touch /tmp/ansible_was_here"
2, 运行 playbook
$ ansible-playbook mytask.yaml
PLAY [My playbook] **********************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************
ok: [aserver.example.org]
ok: [aserver.example.org]
ok: [192.0.2.50]
fatal: [192.0.2.50]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.0.2.50 port 22: No route to host", "unreachable": true}
TASK [Leaving a mark] *******************************************************************************************************************
[WARNING]: Consider using the file module with state=touch rather than running 'touch'. If you need to use command because file is
insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message.
changed: [aserver.example.org]
changed: [bserver.example.org]
PLAY RECAP ******************************************************************************************************************************
aserver.example.org : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
bserver.example.org : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.0.2.50 : ok=0 changed=0 unreachable=1 failed=0 skipped=0 rescued=0 ignored=0
- 提升权限来运行命令
# as bruce
$ ansible all -m ping -u bruce
# as bruce, sudoing to root (sudo is default method)
$ ansible all -m ping -u bruce --become
# as bruce, sudoing to batman
$ ansible all -m ping -u bruce --become --become-user batman