Ansible的变量似乎在set_fact中消失了

时间:2018-10-19 16:34:43

标签: ansible jinja2

是否存在一些奇怪的Ansible行为,这意味着清单主机名仅在某些情况下有效?

这是我正在处理的剧本的一部分,第一个调试语句显示正确的值,但是set_fact然后选择一个空列表,然后在第二个调试任务中选择该列表。

由于某些原因,完全相同的表达式debugset_fact中的行为有所不同,我不知道为什么。就像inventory_hostname任务中未定义set_fact一样(而且我什至会收到一条消息,提示我在两种情况下都标记“ | first”过滤器,就像我最终想要做的那样。

- name: debug it
  debug:
    var: all_tagged_droplets.json.droplets | selectattr('name', 'equalto', '{{inventory_hostname}}') | list

- name: find the right droplet
  set_fact: 
    droplet: "{{ all_tagged_droplets.json.droplets | selectattr('name', 'equalto', '{{inventory_hostname}}') | list }}"

- name: debug it
  debug:
    var: droplet

是否有关于如何将数据获取到更合理的变量的指针?

1 个答案:

答案 0 :(得分:0)

哦,我太傻了。

我尝试两次评估inventory_hostname!因为在第二种情况下,整个表达式都需要{{ ... }},所以我忘记将其从变量中删除。

正确的答案是:

- name: debug it
  debug:
    var: all_tagged_droplets.json.droplets | selectattr('name', 'equalto', '{{inventory_hostname}}') | list

- name: find the right droplet
  set_fact: 
    droplet: "{{ all_tagged_droplets.json.droplets | selectattr('name', 'equalto', inventory_hostname) | list }}"

- name: debug it
  debug:
    var: droplet

看到set_fact行中的表达式是固定的。