Ansible 清单和配置文件

前几天,我们讨论了如何 使用 Vagrant 建立一个三节点 Ansible 实验室 在 Linux 中。 在本文中,我们将详细学习 Ansible 的基本概念,例如 Ansible 清单和配置文件。

内容

  1. Ansible的基本结构
  2. Ansible 配置文件
  3. Ansible 库存文件
  4. 没有明确分组的库存文件
  5. 带分组的库存文件
  6. 具有范围的库存文件
  7. 带有子组的库存文件
  8. 带有主机变量和组变量的清单文件
  9. 带别名的库存文件
  10. YAML 格式的库存文件
  11. Ansible 库存命令
  12. 结论

Ansible的基本结构

当您开始使用 ansible 时,您应该了解两个重要文件。 一个是 Ansible 库存 文件,第二个是 Ansible 配置 文件。

配置 文件包含 ansible 将在运行时使用的所有配置。 当您使用 OS 包管理器安装 ansible 时,您可以看到有一个名为“ansible.cfg“创建于 /etc/ansible 目录。

库存文件 包含有关我们要使用的托管主机列表的 IP 地址或 DNS 信息。 Ansible 将从清单文件中读取主机名,并且任务/播放将在该节点上执行。 库存文件可以在 ini, yaml, 和 json 格式。

下面是我的项目的结构。 我有一个 ansible.cfg 配置文件,主机文件和编写的剧本 yaml 格式。

当我触发剧本时,ansible 将从 ansible.cfg 文件和主机文件中的主机详细信息以运行播放。

[email protected]:~/ansible_project$ tree . . ├── ansible.cfg ├── hosts └── playbook.yml  0 directories, 3 files

让我们详细谈谈这两个文件,最后我们将运行一些临时命令。

Ansible 配置文件

Ansible 使用配置文件加载运行 ansible 任务所需的参数。 如果你有 使用包管理器安装 ansible你会有一个 ansible.cfg 文件在 /etc/ansible 目录。

下面是样本 ansible.cfg 文件。

Ansible 配置文件

Ansible 将按以下顺序查找配置文件。

  • ANSIBLE_CONFIG – 环境变量
  • ansible.cfg – 运行命令的当前目录
  • .ansible.cfg – 用户主目录
  • /etc/ansible/ansible.cfg – 在 /etc/ansible 目录

ansible --version 命令来查看 ansible 正在选择哪个配置文件。

$ ansible --version ansible [core 2.12.3]   config file = /home/vagrant/ansible_project/ansible.cfg   configured module search path = ['/home/vagrant/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']   ansible python module location = /usr/local/lib/python3.8/dist-packages/ansible   ansible collection location = /home/vagrant/.ansible/collections:/usr/share/ansible/collections   executable location = /usr/local/bin/ansible   python version = 3.8.10 (default, Nov 26 2021, 20:14:08) [GCC 9.3.0]   jinja version = 2.10.1   libyaml = True

我创建了一个自定义项目目录并创建了一个 ansible.cfg 文件。 我的配置文件只包含两个属性,库存位置和禁用的主机密钥检查。

[defaults] inventory = /home/karthick/ansible_project/hosts host_key_checking = False

还有很多其他属性,但目前您可以通过单独添加“库存”属性来开始使用它们。

Ansible 库存文件

在清单文件中,我们将提供服务器名称、网络设备、云服务或任何 ansible 可以使用的 IP 地址或 DNS。

库存可以写成 ini, json, 和 yaml 格式,您还可以使用脚本将一种库存格式转换为其他格式。

默认情况下,您可以在 /etc/ansible 如果你已经使用 OS 包管理器安装了 ansible 目录。 始终建议创建一个单独的项目目录并创建一个清单和配置文件。

下表代表了我的 ansible 实验室的设置方式。 我将为这个实验室设置创建清单文件,并将运行 ping 模块来演示清单文件中的工作方式。

节点类型 节点名称 IP地址 风味
控制节点 控制器.anslab.com 192.168.10.3 ubuntu / 焦点64
托管节点 managed1.anslab.com 192.168.10.4 ubuntu / 焦点64
托管节点 managed2.anslab.com 192.168.10.5 ubuntu / 焦点64

三节点 Ansible 实验室设置

没有明确分组的库存文件

库存文件有一个称为分组的概念,您将在其中对资源进行分组并针对该组运行任务。 它将采用以下结构。

[group-name] Resource1 Resource2 .... Resource N

您可以在不使用组的情况下创建清单文件。 在这种情况下,Ansible 将使用两个默认组 “全部”“未分组”.

  • 所有组 – 默认情况下,库存文件中可用的所有资源都将分配给 所有组.
  • 未分组 – 不属于任何用户定义组的资源将自动分配给 未分组的组.

我创建了一个没有任何组的库存文件。 现在,这两个节点将属于所有组以及未分组的组。

$ cat hosts
managed1.anslab.com
managed2.anslab.com

您可以运行以下 ansible 命令来检查 all 和 ungrouped 组下的主机列表。

$ ansible all --list-hosts   hosts (2):     managed1.anslab.com     managed2.anslab.com
$ ansible ungrouped --list-hosts   hosts (2):     managed1.anslab.com     managed2.anslab.com

带分组的库存文件

如前所述,分组是组织资源的好方法,因此您可以轻松地针对特定组运行任务。 我有两个托管节点,它们运行 Ubuntu 20.04LTS。

假设我想根据操作系统类型对库存文件进行分组,那么库存文件将如下所示。 这里 ubuntu 是组名。

[ubuntu]
managed1.anslab.com
managed2.anslab.com

可以针对该组运行任务。

$ ansible ubuntu -m ping -o managed1.anslab.com | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"} managed2.anslab.com | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"}

如果我现在检查“未分组”组,则不会有主机。

$ ansible ungrouped --list-hosts
[WARNING]: No hosts matched, nothing to do
hosts (0):

您可以在清单文件中创建任意数量的组并使用相同的资源名称。

[ubuntu] managed1.anslab.com managed2.anslab.com  [dev] managed1.anslab.com  [test] managed2.anslab.com
$ ansible ubuntu -m ping -o $ ansible dev -m ping -o $ ansible test -m ping -o

具有范围的库存文件

当您的资源具有通用命名模式时,您可以使用范围。 看看下面的例子,我没有重复 DNS,而是使用了范围来缩短它。

[ubuntu]
managed[1:2].anslab.com

带有子组的库存文件

您可以创建一个组并在其下使用其他组名。 看看下面的例子,我有一个 ubuntu 组,它有我的服务器名称。 我创建了另一个名为 server 的组,其中包含 ubuntu 组。

添加很重要 :孩子们 到组名,否则服务器组将处理“ubuntu” 作为服务器名称而不是组名称。

[ubuntu] managed[1:2].anslab.com  [server:children] ubuntu

带有主机变量和组变量的清单文件

库存文件支持主机和组变量。 主机变量只不过是在清单文件中传递给主机的变量及其值。 在下面的配置中,我告诉 ansible 使用 ostechnix 作为我的 用户 而不是使用标准 ssh 端口,而是使用 端口 2222.

[ubuntu]
managed1.anslab.com ansible_user=ostechnix ansible_port=2222
managed2.anslab.com ansible_user=ostechnix ansible_port=2222

组变量与主机变量相同,但变量将应用于整个组而不是单个主机。 从上面的配置可以看出,ansible_user 和 ansible_port 对于两个节点都是一样的。 因此,您可以创建一个组 var,其中变量将由组中的所有节点继承。 您需要添加 :vars 使组成为组变量。

[ubuntu] managed1.anslab.com managed2.anslab.com  [ubuntu:vars] ansible_user=ostechnix ansible_port=2222

小心: 当您同时拥有同一节点的组 var 和主机 var 时,主机 var 具有高优先级。

您可以使用许多库存参数,您可以从 官方文件.

带别名的库存文件

您可以为资源创建别名,如下所示。 这里 m1 和 m2 是别名。

[ubuntu] m1 ansible_host=managed1.anslab.com m2 ansible_host=managed2.anslab.com

现在这个别名可以用来运行一些任务。

$ ansible m1 -m ping -o m1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"} $ ansible m2 -m ping -o m2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"}

YAML 格式的库存文件

库存文件也可以用 YAML 格式编写。 我们在前几节中讨论的任何内容都是以 YAML 格式编写的。

下图表示具有几个主机变量的两个节点。

带有主机变量的清单

下图表示具有组变量的两个节点。

具有组变量的库存具有组变量的库存

Ansible 库存命令

Ansible 有一个inventory 命令,它对查看inventory 文件信息非常有帮助。

要获取支持的选项列表,请运行 help 命令。

$ ansible-inventory --help

要以图表格式获取库存详细信息,请使用 --graph 旗帜。 如果您有不同的库存文件,则可以使用 -i 标志明确指向清单文件。

$ ansible-inventory --graph
图表视图图表视图

您可以通过传递打印主机和组 var 信息 --vars 旗连同 --graph 旗帜。

$ ansible-inventory --graph --vars
带变量的图形视图带变量的图形视图

当您使用 --list 标志,输出将采用 JSON 格式。

$ ansible-inventory -list
JSON 输出JSON 输出

您可以使用 --host 旗帜。

$ ansible-inventory --host managed1.anslab.com
主机信息主机信息

结论

在本文中,我们看到了构成 ansible 架构核心的一个重要概念。 如果您是初学者,请专注于使用 ini 格式构建库存,并且在您开始从事生产项目时,您将了解更多有关最佳实践的信息。

阅读下一篇:

  • Ansible SSH 身份验证和权限提升
  • Ansible 即席命令入门

AnsibleAnsible 命令Ansible 配置文件Ansible Inventory FileAnsible 系列Ansible 教程DevOpsIT 自动化LinuxLinux 管理管理工具开源