问题描述
在创建一个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的默认值。以下是具体的步骤:
- 在循环遍历时,使用
default
过滤器来处理缺失的键,使其回退到omit
。 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角色的灵活性和鲁棒性,使其能够处理各种不完整的输入数据情况。
正文完