Ansible-跳过dict中未定义的变量

Ansible-跳过dict中未定义的变量,ansible,Ansible,我正在使用ipa_用户模块设置用户。存在强制使用新密码的变量PassSwarm。 对于一些用户(当var不在dict中时),我希望在迭代中跳过它,但它总是失败 这是我剧本中的片段。Ansible版本是2.7 任务: 注意:我尝试了以下方法: with_dict: "{{ipausers|default({})}}" ignore_errors: yes 如果不成功则存在忽略模块参数的错误 password: "{{ item.value.password|default(omit) }}"

我正在使用ipa_用户模块设置用户。存在强制使用新密码的变量PassSwarm。 对于一些用户(当var不在dict中时),我希望在迭代中跳过它,但它总是失败

这是我剧本中的片段。Ansible版本是2.7

任务:

注意:我尝试了以下方法:

with_dict: "{{ipausers|default({})}}"  
ignore_errors: yes
如果不成功

则存在忽略模块参数的错误

password: "{{ item.value.password|default(omit) }}"

要使剧本或角色可重用,最好在任务中声明模块的所有参数以及不需要的默认(忽略)参数。

如果要在未定义密码时完全跳过
ipa\u用户
模块执行,请检查
when
子句中是否存在该参数:

when: item.value.password | default('') | length > 0
如果要执行
ipa_user
模块而不为用户指定密码(如果不存在密码),请在模块参数中使用:

password: "{{ item.value.password | default(omit) }}"

注意:可以删除当前的
when
子句。当你在一个dict上循环并稍后检查循环中的当前键是否是该dict的一部分时,它将始终返回true。

现在不确定它是否会对你有很大帮助,但对于其他人来说,除了偶然发现这篇文章之外,我最后针对类似的问题给出了如下内容。我用的是Ansible 2.7.8

- name: Creating user accounts...
  user:
    name: "{{ item.name }}"
    state: "{{ item.state }}"
    comment: "{{ item.comment | default(omit) }}"
    group: "{{ item.groups is defined | ternary((item.groups|default([]))[0], omit) }}"
    groups: "{{ item.groups | default(omit) }}"
    password: "{{ item.password_hash | default(omit) }}"
    uid: "{{ item.uid | default(omit) }}"
  with_items: "{{ managed_users }}"
解决办法是
group:“{item.groups已定义|三元((item.groups | default([]))[0],省略)}”

如果
不在
中,则Ansible将省略此任务的组部分,但jinja2将评估
项。组[0]
。因此,为了实现这一点,我们必须使用
item.groups | default([])
,因此当没有定义组时,jinja2使用空列表,而不是抛出一个
“dict object”没有属性的错误。省略部分类似于
默认(省略)
过滤器,其中Ansible只是从任务中省略选项

Lubo的问题稍微简单一些,所以只使用默认(省略)过滤器应该可以工作。也就是说,因为需要密码,所以整个任务都应该使用条件跳过

- name: adding ipa users
  ipa_user:
    name: "{{ item.value.login }}"
    state: "{{ item.value.state }}"
    givenname: "{{ item.value.givenname }}"
    sn: "{{ item.value.surname }}"
    mail: "{{ item.value.mail }}"
    telephonenumber: "{{ item.value.telephonenumber }}"
    title: "{{ item.value.title }}"
    password: "{{ item.value.password | default(omit) }}" #<-- would be omitted
    ipa_host: ipa.gdi.telekom.de
    ipa_user: admin
    ipa_pass: "{{ ipa_pass }}"
  with_dict: "{{ipausers}}"
  when: item.key in ipausers.keys() and item.key.password is defined #<-- second check for when password is not defined.
  register: output_ipa_users
-名称:添加ipa用户
ipa_用户:
名称:“{item.value.login}”
状态:“{item.value.state}”
givenname:“{{item.value.givenname}”
序号:“{item.value.namite}”
邮件:{{item.value.mail}}
电话号码:“{item.value.telephonenumber}”
标题:{{item.value.title}}

密码:{{item.value.password}默认值(省略)}谢谢。我对ansible playbook没有任何错误——检查
(省略),但最后它不起作用,因为密码不能为空。在循环过程中是否有机会忽略它,因为密码不是必填字段?我给出的第二个解决方案是,如果没有给出密码,则完全忽略它。请在此处定义“不工作”(例如错误日志等…)其内容(减少):
失败:[localhost](--{“更改”:false,“item”:{“key”:“xyz”,“value”:{“givenname”:“xyz”,“login”:“xyz”,“mail”:[“example@example.com“],”密码“:”,”状态“:”当前“,”姓氏“:”xyz“,”电话号码“:[“+4”],”头衔“:”DevOps工程师“}},,”消息“:“response user_mod:无需执行任何修改”}
(真实数据已替换)。因此,密码为空,这就是问题所在。这与您最初的问题完全不同。在您的问题中,密码未定义。在您的注释中,密码为空字符串。在这种情况下,密码不会被忽略。
- name: Creating user accounts...
  user:
    name: "{{ item.name }}"
    state: "{{ item.state }}"
    comment: "{{ item.comment | default(omit) }}"
    group: "{{ item.groups is defined | ternary((item.groups|default([]))[0], omit) }}"
    groups: "{{ item.groups | default(omit) }}"
    password: "{{ item.password_hash | default(omit) }}"
    uid: "{{ item.uid | default(omit) }}"
  with_items: "{{ managed_users }}"
- name: adding ipa users
  ipa_user:
    name: "{{ item.value.login }}"
    state: "{{ item.value.state }}"
    givenname: "{{ item.value.givenname }}"
    sn: "{{ item.value.surname }}"
    mail: "{{ item.value.mail }}"
    telephonenumber: "{{ item.value.telephonenumber }}"
    title: "{{ item.value.title }}"
    password: "{{ item.value.password | default(omit) }}" #<-- would be omitted
    ipa_host: ipa.gdi.telekom.de
    ipa_user: admin
    ipa_pass: "{{ ipa_pass }}"
  with_dict: "{{ipausers}}"
  when: item.key in ipausers.keys() and item.key.password is defined #<-- second check for when password is not defined.
  register: output_ipa_users