构建清单
清单将受管节点组织在集中文件中,为 Ansible 提供系统信息和网络位置。通过使用清单文件,Ansible 可以通过单个命令管理大量主机。
要完成以下步骤,您需要至少一台主机系统的 IP 地址或全限定域名 (FQDN)。为了演示目的,主机可以在本地容器或虚拟机中运行。您还必须确保您的公共 SSH 密钥已添加到每台主机的 authorized_keys 文件中。
继续开始使用 Ansible,并按如下方式构建清单:
在您在上一步中创建的
ansible_quickstart目录中,创建一个名为inventory.ini的文件。在
inventory.ini文件中添加一个新组[myhosts],并指定每台主机系统的 IP 地址或全限定域名 (FQDN)。[myhosts] 192.0.2.50 192.0.2.51 192.0.2.52
验证您的清单。
ansible-inventory -i inventory.ini --list
对清单中的
myhosts组执行 Ping 操作。ansible myhosts -m ping -i inventory.ini
注意
如果控制节点和受管节点的用户名不同,请在
ansible命令中传递-u选项。192.0.2.50 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } 192.0.2.51 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } 192.0.2.52 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" }
恭喜,您已成功构建清单。通过创建剧本 (playbook)继续开始使用 Ansible。
INI 或 YAML 格式的清单
您可以使用 INI 文件或 YAML 创建清单。在大多数情况下(例如前述步骤中的示例),对于少量的受管节点,INI 文件更加直接且易于阅读。
随着受管节点数量的增加,使用 YAML 格式创建清单将成为一个合理的选择。例如,以下内容与 inventory.ini 等效,它为受管节点声明了唯一名称并使用了 ansible_host 字段
myhosts:
hosts:
my_host_01:
ansible_host: 192.0.2.50
my_host_02:
ansible_host: 192.0.2.51
my_host_03:
ansible_host: 192.0.2.52
构建清单的技巧
确保组名具有意义且唯一。组名还区分大小写。
在组名中避免使用空格、连字符和前导数字(请使用
floor_19而不是19th_floor)。根据主机的是什么 (What)、在哪里 (Where) 和 何时 (When) 在清单中对其进行逻辑分组。
- 是什么 (What)
根据拓扑结构对主机进行分组,例如:db, web, leaf, spine。
- 在哪里 (Where)
根据地理位置对主机进行分组,例如:datacenter, region, floor, building。
- 何时 (When)
根据阶段对主机进行分组,例如:development, test, staging, production。
使用元组 (Metagroups)
使用以下语法创建元组,以组织清单中的多个组:
metagroupname:
children:
以下清单展示了一个数据中心的基本结构。此示例清单包含一个 network 元组(包含所有网络设备)和一个 datacenter 元组(包含 network 组和所有 Web 服务器)。
leafs:
hosts:
leaf01:
ansible_host: 192.0.2.100
leaf02:
ansible_host: 192.0.2.110
spines:
hosts:
spine01:
ansible_host: 192.0.2.120
spine02:
ansible_host: 192.0.2.130
network:
children:
leafs:
spines:
webservers:
hosts:
webserver01:
ansible_host: 192.0.2.140
webserver02:
ansible_host: 192.0.2.150
datacenter:
children:
network:
webservers:
一个组可以属于多个元组。例如,network 组可以同时出现在 datacenter 和 ops 元组下。
leafs:
hosts:
leaf01:
ansible_host: 192.0.2.100
leaf02:
ansible_host: 192.0.2.110
spines:
hosts:
spine01:
ansible_host: 192.0.2.120
spine02:
ansible_host: 192.0.2.130
network:
children:
leafs:
spines:
webservers:
hosts:
webserver01:
ansible_host: 192.0.2.140
webserver02:
ansible_host: 192.0.2.150
datacenter:
children:
network:
webservers:
为父组的 group_vars 定义的变量适用于子组中的主机,但子组 group_vars 中定义的值会覆盖父组的值。为了保证继承的可预测性,即使允许有多个父级,也建议将每个组仅定义在一个父元组下。
创建变量
变量为受管节点设置值,例如 IP 地址、FQDN、操作系统和 SSH 用户,这样您在运行 Ansible 命令时就无需传递这些参数。
变量可以应用于特定主机。
webservers:
hosts:
webserver01:
ansible_host: 192.0.2.140
http_port: 80
webserver02:
ansible_host: 192.0.2.150
http_port: 443
变量也可以应用于组中的所有主机。
webservers:
hosts:
webserver01:
ansible_host: 192.0.2.140
http_port: 80
webserver02:
ansible_host: 192.0.2.150
http_port: 443
vars:
ansible_user: my_server_user
另请参阅
- 如何构建您的清单
在
YAML或INI格式中了解更多关于清单的信息。- 向清单添加变量
详细了解清单变量及其语法。
- Ansible Vault
了解如何对清单中的敏感内容(如密码和密钥)进行加密。