【发布时间】:2020-07-30 10:52:05
【问题描述】:
我对 Ansible 比较陌生,我很难理解如何执行以下场景: 我有一个带有 AWS 安全组名称的数组,如下所示
['Security-Group-Name1', 'SecurityGroup-Name2', 'SecurityGroup-Name3']
但是,我想要的是拥有一组 SecurityGroupId。使用 Ansible,我可以选择 ec2_group_info 作为检索有关安全组的信息的选项。到目前为止一切顺利...
现在是我的问题。我需要使用 ec2_group_info 遍历上面的数组,设置我需要的安全组的名称并将检索到的 Id 返回到一个新数组中,所以最后我有这样的东西。
['Security-Group-Id1', 'SecurityGroup-Id2', 'SecurityGroup-Id3']
我知道我需要使用带有某种动态索引的循环。但我不太清楚如何在 Ansible 中执行此操作。
我知道 Ansible Docs 的最新循环部分,我发现它们不仅仅是令人困惑...... https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html
编辑:
这是根据需要工作的当前代码:
- name: Installing pip if not existing on host
pip:
name: boto3
- name: Get SecurityGroupId information
ec2_group_info:
filters:
group_name: ['SG-One', 'SG-Two']
vpc_id: 'vpc-id'
register: my_groups
- set_fact:
my_group_ids: '{{ my_groups.security_groups | map(attribute="group_id") | list }}'
- debug:
msg: "{{ my_groups }}"
- debug:
msg: "{{ my_group_ids }}"
这是结果:
TASK [Gathering Facts] ***************************************************
ok: [localhost]
TASK [machine-provisioning : Installing pip if not existing on host] ************
ok: [localhost]
TASK [machine-provisioning : Get SecurityGroupId information] *************************
ok: [localhost]
TASK [machine-provisioning : set_fact] *********************************
ok: [localhost]
TASK [machine-provisioning : debug] ***********************************************
ok: [localhost] => {
"msg": [
"sg-00000000",
"sg-11111111"
]
}
【问题讨论】:
-
group_name: "['SG-One', 'SG-Two']"不是list,它是一个包含python-y 语法的字符串;具有讽刺意味的是,由于 yaml 的工作方式,如果您只是删除外部的",它将变成一个列表 -
我对此感到非常困惑的是,我需要在为动态变量使用括号时添加外部“,但在引用 yaml 中的列表时不需要它。谢谢,我会试试这个。
-
是的,你需要加上引号,因为 (deep sigh) jinja2 使用
{作为其插值语法的开始字符,但是那个字符也是合法的 yaml,所以 yaml 解析器认为 @987654331 @ 是"thing": {},但有一个虚假的主体(因为在 JSON 中你不能拥有{ {。如果你在 ansible 体验的早期就被卡住了,你真的应该停下来阅读教程 -
如果“null 是十亿美元的错误”,那么 Dag 选择使用 jinja2 而不自定义其变量和块语法是 ansible 的“百万美元错误”;他们实际上确实允许您 customize it for templates,这只是 ansible 本身就是愚蠢的
-
只是想让您知道这是有效的,非常感谢您的建议,我将开始阅读一些教程以更好地了解语法规则的工作原理,再次感谢!
标签: amazon-web-services loops ansible aws-security-group