Ansible 清单和配置文件

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

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.com192.168.10.3ubuntu/focal64
托管节点managed1.anslab.com192.168.10.4ubuntu/focal64
托管节点managed2.anslab.com192.168.10.5ubuntu/focal64

三节点 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

具有范围的库存文件

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

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

带有子组的库存文件

您可以创建一个组并在其下使用其他组名。 看看下面 example,我有 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 即席命令入门