前几天,我们讨论了如何 使用 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_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
您可以使用 --host
旗帜。
$ ansible-inventory --host managed1.anslab.com
结论
在本文中,我们看到了构成 ansible 架构核心的一个重要概念。 如果您是初学者,请专注于使用 ini 格式构建库存,并且在您开始从事生产项目时,您将了解更多有关最佳实践的信息。
阅读下一篇:
- Ansible SSH 身份验证和权限提升
- Ansible 即席命令入门
AnsibleAnsible 命令Ansible 配置文件Ansible Inventory FileAnsible 系列Ansible 教程DevOpsIT 自动化LinuxLinux 管理管理工具开源