> 文档中心 > DO447管理清单--编写YAML清单文件

DO447管理清单--编写YAML清单文件


DO447管理清单–编写YAML清单文件

RHCSA专栏:戏说 RHCSA 认证

RHCE专栏:戏说 RHCE 认证

此文章(第二章 管理清单–编写YAML清单文件 )收录在RHCA专栏:RHCA 回忆录

文章目录

    • DO447管理清单--编写YAML清单文件
      • 📜1.1 清单插件
      • 📜1.2 Yaml静态清单文件
      • 📜1.3 设置清单变量
      • 📜1.4 从INI转换到YAML
      • 📜1.5 YAML故障排除技巧
        • 📑冒号和空格
        • 📑值的变量
        • 📑了解字符串和布尔值或浮点数之间的区别
      • 📜1.6 课本练习
        • 📑按要求修改yaml主机清单
        • 📑测试运行
        • 📑清除实验
    • 💡总结

📜1.1 清单插件

从Ansible 2.4开始,Ansible支持不同格式的目录文件都以插件的形式实现。插件是增强Ansible功能的代码片段。通过插件实现清单支持,Ansible可以通过提供一个新的插件来支持生成清单数据的新格式和方法。传统的ini风格的静态清单文件和动态清单脚本都是通过一个插件实现的。

大多数清单插件在默认情况下是禁用的。你可以在你的ansible.cfg配置文件中启用特定的插件,在inventory部分的enable_plugins指令中:

[inventory]enable_plugins = host_list, script, auto, yaml, ini, toml

如果你不指定enable_plugins指令,上面例子中的列表是默认的。当Ansible分析清单来源。它会尝试按照enable_plugins指令中出现的顺序使用每个插件。

脚本插件提供了对标准动态清单脚本的支持。ini插件提供了对标准ini格式静态清单文件的支持。其他插件从其他格式或其他来源的文件中获取目录信息。

详情可在https://docs.ansible.com/ansible/latest/plugins/inventory.html获取。

一些随Ansible一起发布的清单插件提供了对动态清单脚本的标准化替换。例如,openstack可以获取Red Hat openstack平台环境中的虚拟机信息,aws ec2可以从Amazon Web Services ec2获取云实例信息。


重要:

什么时候应该使用动态清单脚本,什么时候应该使用清单插件?

使用包含清单插件的一个好处是,如果你的用例中有一个可用的插件,它是与核心Ansible代码一起维护的。您可以编写自己的清单插件,但它必须像大多数插件一样用Python实现。

详情请访问https://docs.ansible.com/ansible/latest/dev_quide/developing_inventory.html。

你也可以继续使用你自己的动态清单脚本,插件系统将继续支持这些脚本。这些脚本只需要是可执行文件,所以您可以用您喜欢的任何编程语言编写它们。


📜1.2 Yaml静态清单文件

您可以使用yaml inventory插件以基于yaml的语法而不是基于ini的语法编写静态清单文件。这个插件默认是启用的。之所以创建YAML inventory插件,是因为它便于用户阅读,便于软件解析,并允许您将YAML用于剧本、变量文件和清单。

例如:

[lb_servers]servera.lab.example.com[web_servers]serverb.lab.example.comserverc.lab.example.com[backend_server_pool]server[b:f].lab.example.com

下面是相同的YAML格式清单文件:

lb_servers:  hosts:    servera.lab.example.com:web_servers:  hosts:    serverb.lab.example.com:    serverc.lab.example.com:backend_server_pool:  hosts:    server[b:f].lab.example.com:

YAML清单使用块来组织相关的配置项目。每个块以组名和冒号(:)开头,组名下面缩进的所有内容都属于这个组。

如果在组名下面缩进,那么关键字hosts将启动主机名块。在主机下面缩进的所有服务器名称都属于这个组。这些服务器本身组成了它们的所属组,所以它们必须以冒号(:)结束。

可以在组块中使用关键字children。此关键字将启动作为此组成员的组列表。这些成员可以有自己的hosts和children块。

YAML语法优于INI语法的一个优点是,它将服务器列表和嵌套组列表组织在静态清单文件的同一位置。


重要:

all组隐式地存在于顶层,并将清单的其余部分包括为其子元素。你可以在你的YAML清单文件中明确列出它,但不是必需的:

DO447管理清单--编写YAML清单文件

一些基于ini的静态清单包括不属于任何组成员的主机。

DO447管理清单--编写YAML清单文件

Ansible自动将任何这些主机放在ungrouped的特殊组中。在基于yaml的静态清单中,你可以通过显式地将主机分配给ungrouped来完成:

DO447管理清单--编写YAML清单文件


📜1.3 设置清单变量

可以在基于yaml的清单文件中直接设置清单变量,就像在基于inil的清单文件中一样。

注意:

在许多情况下,最好的做法是避免将变量存储在静态清单文件中。

许多有经验的Ansible开发人员更喜欢使用静态清单文件来存储关于管理哪些主机以及它们属于哪些组的信息。变量及其值存储在清单的host_vars或group_vars文件中。

然而,在某些情况下,您可能希望将ansible_port或ansible_connection等变量与清单本身保存在同一个文件中。从而将信息保存在一个地方。如果在太多不同的地方设置变量,就很难记住特定变量的设置位置。

在组块中,可以使用vars关键字在YAML清单文件中直接设置组变量。例如,在基于ini的静态清单文件中,可以将smtp_relay变量设置为值smtp.lab.example.com用于组监控中的所有主机,如下所示:

DO447管理清单--编写YAML清单文件

基于yaml的静态清单文件:

DO447管理清单--编写YAML清单文件

可以将主机变量设置为YAML清单文件中主机下缩进的项。例如,在一个基于ini的静态清单文件中,可以将主机localhost的ansible_connection变量设置为local,如下所示:

DO447管理清单--编写YAML清单文件

基于yaml的静态清单文件:

DO447管理清单--编写YAML清单文件


📜1.4 从INI转换到YAML

可以使用ansible-inventory命令帮助将基于ini的清单转换为YAML格式。然而,这并不是该工具的预期用途。这个工具是为了显示Ansible看到的整个配置的清单,并且结果可能与原始清单文件报告的结果不同。ansible-inventory命令解析和测试清单文件的格式,但它不尝试验证清单中的主机名是否实际存在。


注意:

清单文件中的名称不一定是有效的主机名,而是由playbook使用来引用特定的托管主机。托管主机的名称可以有一个ansible_host主机变量集,该变量指向ansible在连接到托管主机时应该使用的真实名称或IP地址,并且清单文件中的名称可以是为了剧本的目的而简化的别名。

例如,假设有一个初始的ini格式的静态清单,命名为origin_inventory,如下所示:

DO447管理清单--编写YAML清单文件

在本例中,可以使用下面的ansible-inventory来生成YAML输出。

DO447管理清单--编写YAML清单文件

仔细观察这个输出,可能会注意到一些奇怪的事情。web服务器的alternate_server组变量被报告为该组的两个成员的主机变量。此外,由于组后端服务器池是这两个主机的第一个出现。该变量的值在那里报告,而不是在组web服务器中那些主机的定义中报告。

转换后的清单将产生相同的产出。请记住,即使组变量是基于web服务器中的成员关系设置的。即使play根据不同组中的成员关系选择了该主机,它仍然为该组中的主机设置。


重要:

如果主机基于组中的成员资格设置了其中一个变量,并且该变量没有被覆盖,那么即使主机基于不同组中的成员资格为剧本选择了它,它也将是有效的。

这种行为的问题是,这不是原始清单的工作方式,这可能会引起混乱。要修复这个差异,必须编辑生成的YAML。在这种情况下,您将编辑目的地清单。删除这两个定义,然后在web服务器下创建一个vars部分在这个小节中,从服务器复制变量alternate_server的定义。您还必须更改最初由backend_server_pool中的范围定义的服务器,以再次使用范围,而不是单独列出。

DO447管理清单--编写YAML清单文件

在转换非常大的清单文件时,使用ansible-inventory命令可以节省大量时间,但必须谨慎使用。如果原始的静态清单文件不直接声明清单变量,它会更好地工作。而是从host_vars和group_vars。

注意:

ansible-inventory的YAML输出中的一些组或主机行以 {} 结束。表示组没有任何成员或组变量,或者主机没有主机变量。如果用YAML格式手工编写,则不需要包含这些大括号。


📜1.5 YAML故障排除技巧

如果在使用YAML格式的静态清单文件时遇到了麻烦,那应该记住一些关于YAML语法的事情。

📑冒号和空格

在没有引号的字符串中,冒号后跟空格会导致错误,YAML会将其解释为在字典中开始一个新元素。

以下是一些例子以及如何解决这些问题:

DO447管理清单--编写YAML清单文件


📑值的变量

Ansible使用{{ variable }}替换变量,但是YAML中以 { 开头的任何内容都被解释为字典的开头。因此,你必须用双引号将变量占位符括起来:

foo: "{{ variable }} rest of the value".

一般情况下,当使用任何保留字符 [] {} > | * & ! % # ` @ ,你应该在值周围使用双引号""。


📑了解字符串和布尔值或浮点数之间的区别

用作变量值的布尔值和浮点数不应该用引号括起来。用引号括起来的值被视为字符串。

例如,一个布尔值和一个字符串:

active: yes# Boolean valuedefault_answer: "yes"   # string containing yes

一个浮点值和一个字符串:

temperature: 36.5# Floating point valueversion: "2.0"    # String containing a dot

📜1.6 课本练习

[student@workstation ~]$ lab inventory-yaml start

📑按要求修改yaml主机清单

[student@workstation ~]$ cd DO447/labs/inventory-yaml/[student@workstation inventory-yaml]$ lltotal 4-rw-rw-r--. 1 student student 300 May 17  2019 inventory[student@workstation inventory-yaml]$ cp inventory inventory.yml[student@workstation inventory-yaml]$ cat inventory.yml active_web_servers:  hosts:    server[b:c].lab.example.com:inactive_web_servers:  hosts:    server[d:f].lab.example.com:region_eu:  hosts:    serverc.lab.example.com:    serverf.lab.example.com:web_servers:  children:    active_web_servers:    inactive_web_servers:all_servers:  hosts:    servera.lab.example.com:  children:    web_servers:

📑测试运行

[student@workstation inventory-yaml]$ ansible -i inventory all_servers --list-hosts  hosts (6):    servera.lab.example.com    serverb.lab.example.com    serverc.lab.example.com    serverd.lab.example.com    servere.lab.example.com    serverf.lab.example.com[student@workstation inventory-yaml]$ ansible -i inventory.yml all_servers -m ping

📑清除实验

[student@workstation ~]$ lab inventory-yaml finish


💡总结

RHCA认证经历5门的考试,还是需要花不少时间去学习与备考的,好好加油,可以噶🤪。

DO447管理清单--编写YAML清单文件

以上就是【金鱼哥】对 第二章 管理清单–编写YAML清单文件 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。

如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!

DO447管理清单--编写YAML清单文件