我们希望听到您的意见!帮助我们深入了解 Ansible 生态系统的现状。
参与 2024 年 Ansible 项目调查

Ansible 和 Infoblox 角色深度解析

Ansible 和 Infoblox 角色深度解析

正如 Sean Cavanaugh 在他之前的 Infoblox 博客文章中提到的,Ansible 2.5 版本引入了查找插件、动态清单脚本和五个模块,这些模块允许进行 Infoblox 自动化。这些模块和查找在角色中的组合提供了一个强大的 DNS 自动化框架。

摘要

今天,我们将演示如何使用 Ansible 自动化 Infoblox Core 网络服务,帮助轻松、快速、可靠地管理网络中的 IP 地址和路由流量。您的虚拟化和云网络系统需要快速的供应生命周期;Infoblox 帮助您管理这些生命周期。与 Infoblox 配合使用时,Ansible 允许您自动化这些工作。Ansible 与 Infoblox 的集成灵活且强大:您可以使用模块或直接调用 Infoblox WAPI REST API 来自动化 Infoblox 任务。

这篇文章将引导您完成六个现实场景,在这些场景中,Ansible 和 Infoblox 可以简化您的网络任务

  1. 在一个位置创建一个提供程序,该提供程序可在角色集合中重复使用。
  2. 通过创建具有正向 DNS 区域的新子网来扩展您的网络。Infoblox 的 Ansible 模块使这个常见的两部分任务变得简单。
  3. 创建反向 DNS 区域,例如,标记来自任何没有关联地址名称的 IP 地址的电子邮件。对于旧版本的 Ansible,您必须使用对 Infoblox API 的调用来执行此任务,但从 Ansible v2.7 开始,nios_zone 模块现在支持此功能。
  4. 使用 Ansible 功能强大的 Jinja2 模板为新子网的网关地址保留主机记录。
  5. 使用循环和 host_count 在子网中创建其他主机。
  6. 管理 Infoblox Grid 以大规模自动化您的网络,其中一个 Infoblox 设备可能不够。网格在物理上隔离您的受管网络并消除单点故障。

要按照您自己的 Infoblox 设备上的这些示例进行操作,您需要安装 dynamic-infoblox 角色 并将您的 Infoblox 凭据设置为提供程序。

Infoblox 凭据和 nios_provider

[任何时候您将 Ansible 与 Infoblox 结合使用时,调用 Infoblox 查找模块 时,都必须指定 Infoblox IP、用户名和用户的密码。 我们的角色 将这些凭据统称为 nios_provider。通过将 nios_provider 字典创建为组变量,您可以在所有 playbook 和角色中一致地应用这些值,并在需要时使用一行代码引用它们。

*group_vars/all/main.yml*

nios_provider:
   #Infoblox out-of-the-box defaults specified here
    host: 192.168.1.2
    username: admin
    password: infoblox
wapi_version: v2.7

使用模块设置子网和正向 DNS 区域

准备好凭据后,您可以运行一个 playbook,该 playbook 利用 dynamic Infoblox 角色创建子网和正向 DNS 区域;Ansible 模块可以轻松地完成此操作。创建子网是一个常见的网络项目:子网允许管理员扩展网络,以响应新的公司分支机构、办公室或业务线。正向 DNS 区域建立地址名称到 IP 地址的单向映射。企业可能需要一个新的 DNS 区域来扩展其全球覆盖范围到另一个国家/地区(例如 .uk)或响应合并。此处显示的任务将 ansible_subnetansible_zone 定义为变量,因此您可以在每次创建新子网时覆盖它们。

- name: Create a test network subnet
  nios_network:
     network: "{{ ansible_subnet }}"
     comment: Test network subnet to add host records to
     state: present
     provider: "{{ nios_provider }}"

- name: "Create a forward DNS zone called {{ ansible_zone }}"
  nios_zone:
     name: "{{ ansible_zone }}"
     comment: local DNS zone
     state: present
     provider: "{{ nios_provider }}"

在此示例中,我们使用了默认的 Infoblox 视图。Infoblox 允许在单个 DNS 区域内使用多个视图。如果您想将内部流量路由到本地服务器并将外部流量路由到公共云服务器,您可以通过设计具有两个 DNS 视图的 DNS 区域来实现。这种类型的设置可确保到员工内联网的流量不会占用客户使用的服务器,从而提供更好的地理覆盖范围和更高水平的全天候客户覆盖范围。但是,对于上面的简单示例(以及后续示例),我们一直坚持使用默认视图。

使用 Infoblox API 设置反向 DNS 区域

到目前为止,您已经了解了如何使用 Ansible 模块来自动化 Infoblox 更改。我们的下一个示例展示了如何使用 Infoblox WAPI REST API 来自动化当前 Ansible 版本中可能不可用的任务。反向 DNS 区域允许客户端查找地址名称,前提是他们知道等效的 IP 地址。反向区域的重要性可以用一个常见的示例来说明:电子邮件服务器。来自没有关联地址名称的 IP 地址的传入流量通常会被标记为垃圾邮件。反向区域还可以帮助其他用例,例如收集有关访问您网站的其他企业的真实数据。

nios_zone 模块已经可以创建正向 DNS 区域,但它只能使用最新版本的 Ansible 创建反向区域。但是,您仍然可以在旧版本的 Ansible 中自动化此任务 - 只需使用 Ansible 直接对 WAPI API 进行调用即可。您可以使用 uri 模块或 shell 脚本来执行此操作。我们建议使用 uri 模块,因为它有助于更具描述性地捕获集成并支持利用标准 REST 返回代码的幂等调用。在此,uri 模块充当一个伞形模块,以简洁的方式捕获 Ansible 模块生态系统中的单个 WAPI 调用。值得注意的是,WAPI API 的工作方式与 Ansible 模块非常相似:输入 JSON 和输出 JSON。如果您以 yaml 表示 API 调用的主体,则可以轻松使用 Jinja2 过滤器(我们将在后面详细介绍)在运行时将其转换为 JSON。

- name: Create a reverse DNS zone to complement forward zone
  uri:
    url: https://{{ nios_provider.host }}/wapi/{{ wapi_version }}/zone_auth
    method: POST
    user: "{{ nios_provider.username }}"
    password: "{{ nios_provider.password }}"
    body: "{{ reverse_zone_yml | to_json }}"
    #201 signifies successful creation
    #400 signifies existing entry
    #both signify a successful WAPI call
    status_code: 201,400
    headers:
        Content-Type: "application/json"
    validate_certs: no
  register: reverse_dns_create
  changed_when: reverse_dns_create.status == 201
  vars:
    reverse_zone_yml:
      fqdn: "{{ ansible_subnet }}"
      zone_format: "IPV4"

如果您在创建任何主机记录之前建立子网、正向区域和反向区域,则您在该正向区域中创建的每个主机记录都会自动创建相应的反向区域条目!定义了网络、正向区域和反向区域后,就可以开始为新子网创建主机记录了。

使用 Jinja2 模板保留网关地址

当您开始创建主机记录时,您希望将区域中的第一个(或最后一个)主机记录保留为网关地址,即转发目标 IP 地址位于直接网络外部的数据包的地址。如前所述,您可以使用 Jinja2 过滤器通过在其上调用简短的 python 函数来操作数据;Jinja2 过滤器的语法有效地充当 linux 管道。Jinja2 过滤器是一种快速操作数据的方法,在本例中,我们使用其中的两个(请参见下面的示例)来遵守 Infoblox 网关地址命名约定。需要注意的是,相对于子网定义网关地址名称可以避免网关地址名称被覆盖,因为每个子网通常都有自己的网关地址。

- name: Create a host record for the gateway address
  nios_host_record:
     name: gateway{{ ansible_subnet | ipaddr(first_usable) |
  replace(".","_") }}.{{ ansible_zone }}
     ipv4:
        - address: "{{ gateway_address }}"
     state: present
     provider: "{{ nios_provider }}"

此任务使用此复杂的 Jinja2 表达式逐步构建网关主机名。Ansible 打包的 ipaddr 过滤器 非常通用 - 它能够完成大量的常规 IP 地址操作。例如,如果您的 IP 范围是 192.168.1.0/24 且您的 ansible_zone 是 ansible.local,则上面的任务中的过滤器将在一行中创建一个名称

  1. 表达式以“gateway”开头
  2. 中的部分执行以下操作:a. 检索 ansible_subnet 的模板化值 ansible_subnet => 198.168.1.0/24 b. 使用检索到的 ansible_subnet 值并将其提供给 ipaddr('first_usable') 过滤器插件以获取第一个可用的 IP 192.168.1.0/24 | ipaddr('first_usable') => 192.168.1.1 c. 使用下划线而不是点来格式化结果 IP 192.168.1.1 | replace('.', '_') => 192_168_1_1 d. 在子网值之前添加 . 分隔符 e. 检索 ansible_zone 的模板化值 ansible_zone => ansible.local

通过示例模板传递上面列出的值的网关主机名将是

gateway192_168_1_1.ansible.local

Jinja2 过滤器是一个复杂的 Ansible 主题;在构建您自己的 Jinja2 过滤器之前,您应该具备扎实的 Ansible 基础。当您开始创建过滤器时,您可以本地测试预期值,或者利用 Sivel 的 Ansible 模板测试器 在将过滤器用于 playbook 或角色之前查看其结果。 

Infoblox-Roles-Deep-Dive-Ansible-Template-Tester

使用循环和 host_count 生成主机记录

一旦您的网关地址被预留,您可以使用循环生成已知数量的其他主机记录。在实际场景中,您可能会在子网内生成服务器组(例如,数据库服务器、应用程序服务器等)。对于此简单的演示,您可以定义一个循环,根据用户提供的host_count值动态生成通用主机记录。此演示展示了nios_next_ip查找插件的功能,该插件可以获取单个下一个可用 IP 或一系列下一个可用 IP 来分配。在一个包含这两个任务(上面创建网关地址主机记录的任务和下面生成主机记录的任务)的 Playbook 中,如果您没有定义host_count,则 Playbook 不会创建任何其他主机记录;只会创建网关地址。

#Generating records this way should be for demo purposes
#Normal scenario would be to iterate over a dictionary/list of hosts or populate via a static csv file
- name: “Dynamically generate {{ host_count }} host records at next available ip in {{ ansible_subnet }}”
  include_tasks: host_record_generation.yml
  loop_control:
     loop_var: count
  with_sequence: start=1 end={{ host_count }}
  when: host_count is defined

如果您基于用户提供的主机数量使用 Ansible 生成主机记录,那么循环遍历主机数量是否可能在第二次运行时导致索引问题?不幸的是,确实如此,但是保留生成的宿主机总数可以解决此问题。一种方法是在控制节点上维护一个静态的总主机计数文件,将其视为真相来源。通过利用 Ansible 的查找插件功能检索其内容,每次生成主机时,此文件中的计数都会递增,因此后续的角色执行(尤其是在不同子网中自动执行的角色)不会覆盖彼此的记录!

以这种方式生成主机记录与大多数企业使用的命名约定生成主机记录不同,但它是一种使用nios_next_ip查找插件开箱即用的简单方法,可以在不同的区域和/或子网中创建一些记录。Infoblox 还支持用于静态记录的 csv 记录导入功能。

Infoblox-Roles-Deep-Dive-Records

使用 Ansible 预定义 Infoblox 网格

在前四个场景中,您已经了解了 Ansible 如何在主机和子网级别与 Infoblox 协同工作。Ansible 可以大规模地对 Infoblox 做些什么?自动化单个 Infoblox 实例可以提供价值,但生产 Infoblox 系统通常设计为网格形式。Infoblox 网站解释了 Infoblox 网格技术的全部功能。Infoblox 网格在单个或配对设备之间建立分布式关系,以消除传统 DNS、DHCP 和 IP 地址管理基础设施中固有的单点故障和其他运营风险。每个网格包含一个网格主节点和数量不等的其他网格成员和/或网格主节点候选者。网格成员仅包含完成其工作所需的部分 Infoblox 数据库。另一方面,网格主节点候选者拥有网格主节点数据库的实时完整副本,以提供灾难恢复功能。您可以使用我们的 Ansible 角色以这种方式预定义新的网格主节点候选者和网格成员

- name: Predefine a new Grid Master Candidate
  hosts: localhost
  connection: local
  roles:
    -  role: predefineGridmasterCandidate
       master_candidate_name: gmc.ansible.local
       master_candidate_address: 192.168.2.2
       master_candidate_gateway: 192.168.2.254
       master_candidate_subnet_mask: 255.255.255.0

- name: Predefine a new Grid Member
  hosts: localhost
  connection: local
  roles:
    -  role: predefineGridMember
       member_name: m3.ansible.local
       member_address: 192.168.2.3
       member_gateway: 192.168.2.254
       member_subnet_mask: 255.255.255.0

Infoblox-Roles-Deep-Dive-Members

如您从这五个示例中看到的,Ansible 和 Infoblox 协同工作以快速、轻松、可靠地管理您的网络基础设施及其承载的流量。Ansible 基于 Infoblox WAPI API 的强大功能构建。使用 Ansible 模块和对 WAPI API 的直接调用,您可以编写可重用的 Ansible 角色和 Playbook,这些角色和 Playbook 可以快速适应处理不同的网络。如果您愿意,您可以从自定义ansible-networking 存储库中的角色开始,该存储库连接了今天文章中讨论的所有 Ansible 概念。




使您的 Ansible Playbook 灵活、可维护和可扩展

使您的 Ansible Playbook 灵活、可维护和可扩展

几年来,我学习了很多技巧来帮助减轻我的工作维护负担。对我来说,拥有可维护的项目非常重要,因为我的许多项目(如托管 Apache Solr)已经运行了十多年!如果项目难以维护或难以进行重大架构更改,那么我可能会失去客户转向更灵活的竞争对手,我可能会损失金钱,并且——最重要的是——我可能会失去理智!

我今年将在 AnsibleFest Austin 上发表一个名为“使您的 Ansible Playbook 灵活、可维护和可扩展”的演讲,我想在这里总结一些主要主题。

保持组织

我喜欢摄影和自动化,因此我花费大量时间构建涉及 Raspberry Pi 和摄像头的电子项目。如果没有我使用的组织系统,将我的项目所需的正确组件放在一起将会非常令人沮丧。

类似地,在 Ansible 中,我喜欢将我的任务组织起来,以便我可以更轻松地组合它们、测试它们并管理它们,而无需花费太多精力。

我通常从一个文件中包含所有任务的 Playbook 开始。一旦我的 YAML 代码行数达到 100 行左右,我就会努力将相关的任务组分解成单独的文件,并使用include_tasks将它们包含在 Playbook 中。

在 Playbook 开始变得更加完整之后,我经常会注意到一些相关的任务集,这些任务集可以被隔离——例如安装软件、复制该软件的配置,然后启动(或重新启动)守护进程。因此,我使用ansible-galaxy init ROLE_NAME创建一个新的角色,然后将这些任务放入该角色中。

如果该角色足够通用,我将把它放在 GitHub 上并提交到 Ansible Galaxy,或者把它放在一个单独的私有 Git 存储库中。现在,我可以为该角色添加一组通用的测试(使用Molecule或其他一些测试设置),并且可以与许多项目共享该角色——甚至与完全独立的团队管理的项目共享!

然后,我通过requirements.yml文件将外部角色包含到我的项目中。对于某些项目,其中稳定性是最重要的特性,我还会为每个包含的 Ansible 角色定义版本(git ref 或标签)。对于其他项目,如果我可以为了更容易的维护而牺牲一些稳定性(例如测试 Playbook 或一次性服务器配置),我只会添加角色名称(如果不在 Galaxy 上,则添加仓库详细信息)。

对于大多数项目,我不会将外部角色(在requirements.yml中定义的角色)提交到存储库——我在我的 CI 系统中有一个任务,它在每次运行时都会重新安装这些角色。但是,在某些情况下,最好将所有角色都提交到代码库。例如,由于开发人员可以每天运行我的Drupal VM Playbook,并且这些开发人员通常不住在 Ansible Galaxy 服务器所在的位置附近,因此他们在安装所需的大量 Ansible Galaxy 角色时遇到了麻烦。因此,我将这些角色提交到代码库,现在他们不必每次构建新的 Drupal VM 实例时都等待所有角色安装。

如果您确实将角色提交到代码库,则需要有一个彻底的更新角色的过程——确保您的requirements.yml文件与已安装的角色保持同步!我经常运行ansible-galaxy install -r requirements.yml --force来强制替换代码库中的所有必需角色,并保持诚实!

简化和优化

> YAML is not a programming language.
>
> ---Jeff Geerling

人们喜欢使用 Ansible 的原因之一是它使用 YAML,并且具有声明性语法。您希望安装一个包,因此您有任务包:name=httpd state=present。您希望服务正在运行,因此您有任务服务:name=httpd state=started

在许多情况下,您需要添加更多智能。例如,如果您使用相同的角色构建 VM 和容器,并且不想在容器中启动服务,则需要添加一个when条件,例如

- name: Ensure Apache is started.
  service:
    name: httpd
    state: started
  when: 'server_type != "container"'

这种逻辑很简单,在阅读任务并弄清楚它在做什么时很有意义。但有些人可能会试图在when条件或其他 Ansible 提供对 Jinja2 和 Python 的一些访问权限的地方塞入大量花哨的逻辑,而这时事情可能会脱轨。

根据经验法则,如果您花费了超过 10 分钟的时间来处理 Playbook 中when条件中的转义引号,那么可能是时候考虑编写一个单独的模块来执行您需要为该任务执行的逻辑了。Python通常应该在单独的模块中,而不是与其余 YAML 代码内联。当然也有例外情况(例如,比较更复杂的字典和字符串),但我尽量避免在我的 Ansible Playbook 中编写任何复杂的代码。

除了避免复杂的逻辑之外,让您的 Playbook 运行得更快也很有帮助。很多时候,我会在ansible.cfg文件 defaults 部分中配置 Playbook 定时器并运行 Playbook,然后发现一个或两个任务或角色花费的时间非常长,与 Playbook 的其余部分相比。

例如,一个 Playbook 对包含数十个文件的的大目录使用了 copy 模块。由于 Ansible 在内部执行文件复制的方式,这意味着浪费了数十秒的时间等待 Ansible 通过 SSH 连接传送每个文件。

将该任务转换为使用synchronize代替可以节省 Playbook 每次运行的几秒钟。对于一次运行,这似乎并不多;但是当 Playbook 定期运行(例如,在服务器上强制执行特定配置)或作为 CI 套件的一部分运行时,帮助提高其效率非常重要。否则,这可能会在低效的代码上消耗额外的 CPU 周期,并且开发人员通常讨厌等待很长时间才能通过 CI 测试,然后才能知道他们的代码是否破坏了某些东西。




使用 Ansible 进行大规模部署

使用 Ansible 进行大规模部署

Ansible 的简单性在于易于理解、学习和共享。它是关于人的。经常兜售的“Ansible 无法扩展到超过 500 台主机”的观点被我们拥有超过 100,000 个节点受管理的客户所掩盖。但是,认为扩展仅仅是关于主机数量的想法并没有认识到更大的相关性。扩展远不止于此,扩展与您业务中的上下文息息相关。

什么是扩展?

根据大多数词典,扩展是一个名词,表示事物的相对大小或范围。

技术规模

在 IT 方面,关于“扩展”的结论通常等同于某些技术的数量。客户的常见问题可能是“我们需要 Ansible 扩展到 70,000 台主机”。

虽然我们关注了这个数字,但实际上,并不会同时对所有这些目标进行技术操作。对于如此规模的企业来说,冒所有系统都发生故障的风险,其危害实在太大。出于安全考虑,大规模的操作都是分批进行的——滚动更新不仅是一种更安全的操作方式,而且我们可以更快地看到结果。

业务功能、地理位置、应用程序和网络都会影响这个大数字,并且都可以以降低风险的方式进行“切分”——并带来实现大规模操作的额外好处。

从等式的另一面来看,技术本身也具有细微差别。与小型简单的任务相比,大型复杂的操作需要更多的资源——内存、计算能力等。我们能够并行操作的主机数量会根据需求而变化。

人力规模

在 IT 领域,至少有六种不同的方法可以实现任何目标。我们最终选择的方法可能取决于许多因素,但一个强大的影响因素将是人员。

一家初创公司可能会选择一种高级编程语言来编写他们的应用程序,因为这样可以快速轻松地上手。少量代码就能产生大量结果——这与用 C 语言甚至汇编语言编写不同!我们都知道用 C 语言编写代码会产生更快的程序,需要的计算资源更少。这将使我们能够在给定的硬件上获得更高的利用率。但编程本身可能会更慢,人才库也会更浅。为了启动一个项目,“较慢”的语言会导致更快的增长。随着业务的增长,它会添加使用现有语言的编码人员,因为他们会最快地上手。

有些技术比其他技术更难学习。但是,任何人都可以理解的语言,无论是否有现有技能,都将更容易上手。

马尔科姆·格拉德威尔的《异类:成功的故事》一书中有一章名为“稻田和数学测试”。简而言之,他告诉我们,中文数字系统让孩子们更快地掌握数学,因此他们更喜欢数学。这种享受意味着他们乐意进一步沉浸其中。很容易看出滚雪球效应。

当技术以很少的努力就能产生结果时,我们就会获得这种享受——它并不局限于儿童:)。这促使我们投入更多时间,从而更快地产生结果。

当人们喜欢使用某项技术时,在大组织中扩展该技术的使用速度更快,覆盖范围更广。随之而来的是快速采用。

Ansible 的扩展

跨组织的扩展将是特定于上下文的,但您可以从一些基本要素开始。

扩展技术

确保您使用的硬件适合用例。将提供帮助的文档……

最重要的是您管理清单的方式(您如何对主机进行分组)。花时间考虑最小可行范围。如果您必须升级整个堆栈,哪些部分可以独立于其他部分进行升级?

Ansible 从根本上来说是一个协调器——它不必执行实际操作。您可能已经拥有一个 Ansible 可以指示的工具,因此请利用这一事实,无需新的学习。您获得了所有世界的最佳成果,尤其是高级指令集是一个易于阅读的 Ansible Playbook。

扩展人力范围

在大公司中扩展任何技术都归结为两个根本的根源。

  1. 教育
  2. 组织

其他所有内容都源于这两个起点。

教育

从这里出现了两个分支——首先是采用。对于一项新技术要扎根,它需要快速启动和运行,并且易于学习。当您可以在几分钟内解决问题时,就可以轻松地向其他人展示——并且采用范围会扩大。

其次,教育需要持续进行。这就是在您所做的事情周围实施其他工具和实践可以提供帮助的地方。例如,将您的 Ansible playbook 和角色存储在源代码存储库中,可以让其他人共享和学习。我们曾经看到一个客户建立了一个很棒的系统,帮助他们的员工从同事那里学习 Ansible。新的提交必须作为“拉取请求”提交到源代码存储库,并由更有经验的员工审查。引入了并强化了一个模仿开源文化的反馈循环。我们还看到客户将提交消息推送到他们的聊天系统。另一种鼓励共享的好方法。

组织

“只要是黑色,你想要什么颜色都可以”。正如亨利·福特肯定会告诉我们的那样,统一性是可扩展性的朋友。人们喜欢有创意,完成一天的编码并坐下来欣赏完成的工作令人愉快。同时,为了扩展,我们确实需要对我们生产的内容进行一些组织。

安全、审计和问责制在大公司中都占有一席之地。我们需要能够向合适的人员授予合适的访问权限,这在很大程度上是为了防止意外发生。如果没有技术的帮助,管理对数万台设备的访问将非常麻烦。

源代码存储库、编码标准、凭据管理和访问控制都可以帮助在 Ansible 周围构建组织结构。将完成工作的简单性结合起来,但将其包裹在一个安全保护层中,以实现安全、受管理的扩展。

扩展后的 Ansible

扩展任何事物都会带来新的挑战,而不仅仅是围绕主机数量。但是,我们的客户每天都在应对许多这些挑战。如果您面临扩展挑战并希望获得帮助,请联系我们。我们的咨询团队已遍及各个业务领域,从世界上最小的公司到最大的公司。我们将有一些您可以关联的故事,并且可以帮助您解决这些难题。




Ansible Tower 高级智能清单使用

Ansible Tower 高级智能清单使用

背景

智能清单 是添加到 Red Hat Ansible Tower 3.2 中的一项功能。此功能允许您生成一个新的清单,该清单由 Ansible Tower 中其他清单中存在的主机组成。此清单始终是最新的,并使用我们称为主机过滤器的功能进行填充。主机过滤器是一种特定于域的查询语言,它混合了 Django Rest Framework GET 查询语言和添加的 JSON 查询语法。实际上,这允许您创建主机及其关系字段以及相关 JSON 结构的清单。

ansible_facts 字段是主机上的一个相关字段,由启用了事实缓存的作业模板运行(作业)填充。Ansible Tower 使用启用了事实缓存的作业模板附加了一个 Ansible 事实缓存插件。这种类型的作业模板运行调用 Ansible gather_facts 的 playbook 将导致这些事实在作业完成后保存到 Ansible Tower 数据库中。

智能清单过滤器的限制在于它仅允许对 ansible_fact JSON 数据进行相等匹配。在这篇博文中,我将向您展示如何克服此限制,并使用例如主机是否属于子网的范围查询将主机添加到智能清单中。

Ansible Tower 对象

不要再谈论它了,让我们看一个例子。我们将不得不在 Ansible Tower 中创建对象。具体来说,下表中的对象。

资源
组织 变形金刚
清单 汽车人
项目 事实
主机 擎天柱、大黄蜂、爵士
作业模板 收集清除子网set_fact_cacheable

为所有作业模板启用事实缓存

1. 事实缓存

现在,让我们做一些事情。运行收集作业模板。然后查看在 UI 中为清单 Autobots 收集到的结果事实。

Tower-Facts-2-Screen

上面是您如何在 UI 中查看事实收集过程的结果的示例。现在让我们看看如何从收集的事实中创建智能清单。

2. 我们的第一个智能清单

我们将创建一个仅包含 Red Hat 主机的智能清单。在我的示例中,擎天柱和大黄蜂都是 Red Hat 主机,而爵士是 Ubuntu 主机。

Tower-Smart-Iventory-Screen

使用主机过滤器创建智能清单:ansible_facts.ansible_distribution:RedHat

我的新智能清单 Red Hat Autobots 包含 2 台主机(见下图)。

Tower-Inventories-Screen

3. 注入 playbook 事实

我们现在将离开智能清单功能并返回到事实缓存。具体来说,我将向您展示如何在 playbook 中set_fact,并将该事实存储在 Ansible Tower 中。

运行作业模板set_fact_cacheable。以下是该运行的结果。

Tower-Jobs-Screen

现在,让我们查看此 playbook 针对的 3 台主机中的任何一台的事实。请注意,大黄蜂现在有一组新的事实(见下图)。

Tower-Facts-Screen

具体来说

a:
   b:
      c:
        - a
        - b

这些事实是由此 playbook 设置的,该 playbook 使用 set_fact Ansible 模块并设置了cacheable: true

创建智能清单

我已经向您展示了创建基于非简单相等匹配的主机事实的智能清单所需的所有部分。这些部分是

  1. 事实缓存
  2. 智能清单
  3. 注入 playbook 事实

现在我将向您展示一个使用所有这些部分构建子网内主机的智能清单的示例。这是一个很好的示例,因为基于子网选择主机是范围查询,它不是简单的相等查询。因此,我们将需要利用 3. 注入 playbook 事实来完成创建智能清单以对这些主机进行分组。

总体目标是在主机上将is_subnet设置为 True(如果主机在所需子网中),或设置为 False(如果主机不在子网中)。然后,我们可以构建一个类似于ansible_facts.is_subnet:true的智能清单主机过滤器来获取子网中的主机。下面的 playbook实现了这一点

- hosts: all
  vars:
    subnet: '172.18.0.0/16'
  tasks:
    - name: "Presume host to not belong to subnet"
      set_fact:
        is_subnet: False
        cacheable: True

    - name: "Figure out if host belongs to subnet"
      set_fact:
        is_subnet: True
        cacheable: True
      when: ansible_all_ipv4_addresses | ipaddr(subnet)

未来

目前,Ansible Tower 对象上所有传统的关联数据库字段都可以在智能清单主机筛选器查询中使用(例如,主机名、清单名称、组织描述等);与主机相关的唯一可搜索 JSON 字段是 ansible_facts 字段。我们希望将来扩展可搜索的 JSON 字段以及支持的操作符(目前我们仅支持相等)。但是,在这样做时必须认真考虑性能特征以及存储需求。




Red Hat Ansible Tower 的总体经济影响

Red Hat Ansible Tower 的总体经济影响

Red Hat Ansible Tower 的总体经济影响 是一项 Red Hat 委托 Forrester Consulting 于 2018 年 6 月发布的研究。本研究展示了 Ansible 带来的成本节约和业务收益。让我们深入了解 Ansible Tower 的功能、获得的效率、收入确认的加速以及其他切实的益处。

更快的收入确认

收入确认是业务运营的关键方面。加快收入确认的速度是每个组织都关注的事情。Forrester 对 Ansible Tower 的 TEI 观察到一家公司将交付周期缩短了 66%。想象一下,当将交付周期从几天缩短到几小时时,组织体验的功能部署速度!

系统重新配置时间也缩短了。自动化由于新错误或策略更改而导致的跨系统更改有助于减轻重新配置的成本影响。该公司发现,能够通过 Ansible 自动化重新配置系统群集的总时间节省使此类工作的员工工时减少了 94%。

TEI 还衡量了 Ansible Tower 在安全和合规性方面的收益。Ansible Tower 将员工用于修补系统的工时减少了 80%。这也意味着可以更频繁地修补系统。这有助于减少客户环境中在任何给定时刻已知漏洞的数量。

改进安全和合规性

Ansible Tower 还帮助实现跨系统采用和自动化 CIS 基准。CIS 基准是“针对各种技术组的指南,以保护系统免受当今不断变化的网络威胁”。这使接受研究访谈的客户能够应对不断变化的安全环境。使用值得信赖的自动化工作流“维护最新和最佳标准”创造了一个更安全的环境。

此外,研究发现 Ansible Tower 将安全事件响应时间缩短了 94%。当您考虑 Heartbleed 或 WannaCry 等具有重大影响的事情时,能够快速修补系统可以防止对业务连续性造成灾难性影响。Ansible Tower 还帮助实现了 GDPR 合规性。由于 Ansible Tower,修补系统的繁重任务变得非常容易。“该组织转向每月修补周期,增加了更新频率。” 最棒的是,对于接受调查的公司而言,Red Hat Ansible Tower 在没有任何额外员工的情况下实现了这些安全和合规性收益。

授权员工做更多事情

TEI 中观察到的关键优势之一是更好的员工赋能。不仅现有员工在更短的时间内完成了更多任务,而且初级员工也可以被授权承担更高级别的任务。复杂的任务可以委托给更年轻的团队成员。Ansible Tower 通过自动化消除了乏味、无聊和重复的任务。

Red Hat Ansible Tower 的易用性在本研究中得到了体现。首席基础设施架构师表示:“我们能够在不到一周的时间内使用 Tower 在我们的环境中使用开箱即用的工具。” Ansible Tower 使 Ansible 的灵活性和强大功能民主化。基础设施员工构建了功能,使最终用户能够在自己的环境中安全地操作。Ansible Tower 功能的最终用户只需要一个小时的培训即可胜任并提高工作效率。

对于 IT 组织来说,招聘正变得越来越困难。寻找和招聘人才、入职和培训新员工所需的时间会产生成本。实施 Ansible Tower 取得的成果减少了该公司对更多员工入职的紧迫性。Forrester 的 TEI 指出 Red Hat 的客户“通过自动化将服务器上线、压力测试资源和删除节点的过程,节省了 48,000 个小时的员工时间。” 假设典型美国带薪员工的年工作时间为 2,000 小时,那么实施 Ansible Tower 每年可能会节省 8 名全职员工的工时。

无需昂贵的硬件

根据 TEI,“接受访谈的组织没有购买其数据中心的品牌设备,而是创建了一个 Ansible Playbook 并使用通用 Linux 系统运行了自动化功能。与其购买其数据中心的云配置、备份等的品牌设备,客户启动了 Ansible Tower 并使用通用 Linux 系统运行了自动化功能。” 该组织避免购买 10 台品牌基础设施设备,这代表了 3 年的现值 389,707 美元。”

总之,我们认为 Red Hat Ansible Tower 可以使组织能够大规模地完成他们多年来成功完成的工作。Ansible Tower 帮助组织加速收入确认。使用 Ansible 进行自动化可以通过自动化修补和合规性任务来提高 IT 基础设施的安全性和可靠性。Ansible 可以释放员工时间,并提高所有员工的能力,以参与更高速度的改进。您今天想用 Ansible 做什么?