在Ansible任务中循环遍历带有缺失键的数组

73次阅读
没有评论

问题描述

在创建一个Ansible角色以创建用户时遇到了一个问题。他想要角色能够接受一个包含字典列表的参数,如果字典中缺少某个键,那么角色应该回退到Ansible的默认值。
例如,给定以下数据:

---
users:
  - { name: foo, group: bar, create_home: no }
  - { name: goo, group: bar }

他通常会使用类似以下方式循环遍历列表:

- name: Add users
  ansible.builtin.user:
    name: "{{ item.name }}"
    groups: "{{ item.group }}"
    create_home: "{{ item.create_home }}"
    state: present
  loop: "{{ users }}"

然而,由于第二个用户的字典中不存在create_home键,会引发错误。他想知道如何使缺少的键能够回退到Ansible的默认值。

解决方案

请注意以下操作可能因Ansible版本差异而有所不同。

您可以使用Ansible的default过滤器结合omit来实现在缺失键时回退到Ansible的默认值。以下是具体的步骤:

  1. 在循环遍历时,使用default过滤器来处理缺失的键,使其回退到omit
  2. omit在Ansible中用于表示“忽略此参数”。

以下是如何在您的Ansible任务中应用此解决方案的示例:

- name: Add users
  ansible.builtin.user:
    name: "{{ item.name }}"
    groups: "{{ item.group }}"
    create_home: "{{ item.create_home|default(omit) }}"
    state: present
  loop: "{{ users }}"

在上面的示例中,我们将create_home参数的值设置为{{ item.create_home|default(omit) }}。这意味着如果create_home键不存在于字典中,那么将使用omit来忽略此参数,从而回退到Ansible的默认值。

这个方法可以确保在遇到缺失键时,Ansible不会引发错误,而是会使用默认值或忽略参数。这对于使Ansible角色更加灵活并处理不完整的输入数据非常有用。

总结

通过使用default过滤器和omit参数,您可以在Ansible任务中循环遍历带有缺失键的数组,使缺失的键能够回退到Ansible的默认值或被忽略。这有助于提高Ansible角色的灵活性和鲁棒性,使其能够处理各种不完整的输入数据情况。

正文完