首页 > 解决方案 > 在 YAML 中为 Ansible 循环内部变量

问题描述

所以我有一个脚本,我真的不想复制和粘贴大约 50 次。

{{item}} 建议的典型循环不起作用,因为它已经在另一个变量中......这很不幸。

我不明白为什么用这种语言做循环这么难。。

这是在 Ansible Tower 上,但它通常应该像 ansible 脚本一样工作。我可以让代码在没有循环的情况下运行,但是我在其中放入循环的那一刻就搞砸了。

这失败了:

- name: Start Instances with Persist as "No"
  ec2:
     instance_ids: "{{hostvars[groups['tag_Persist_No'][{{item}}]].ec2_id}}"
     region: us-east-1
     state: running
     wait: yes
  ignore_errors: yes
  loop:
    - 0
    - 1

这成功了:

- name: Start Instances with Persist as "No" 0
  ec2:
     instance_ids: "{{hostvars[groups['tag_Persist_No'][0]].ec2_id}}"
     region: us-east-1
     state: running
     wait: yes
  ignore_errors: yes
- name: Start Instances with Persist as "No" 1
  ec2:
     instance_ids: "{{hostvars[groups['tag_Persist_No'][1]].ec2_id}}"
     region: us-east-1
     state: running
     wait: yes
  ignore_errors: yes

错误是

template error while templating string: expected token ':'. got '}'. String: {{hostvars[groups['tag_Persist_No'][{{item}}]].ec2_id}}

标签: ansible

解决方案


这是在循环中使用 var 的正确语法:

instance_ids: "{{ hostvars[groups['tag_Persist_No'][item]].ec2_id }}"

由于您已经在 jinja2 模板表达式中,因此您只需在此处添加无关紧要的额外花括号。


推荐阅读