Ansible——在动态清单中使用来自 Ec2 标签的条件
Ansible -- Using Conditionals from Ec2 Tags in Dynamic Inventory
我正在使用 ec2 动态清单。
我所有的 ec2 实例都标记有它们的环境。例如 tag:env = prod
或 tag:env = test
所以我的动态库存变量设置正确....
"ec2": [
"ip_10_1_1_1_ec2_internal",
"ip_10_1_1_2_ec2_internal",
"ip_10_1_1_3_ec2_internal",
"ip_10_1_1_4_ec2_internal",
"ip_10_1_1_5_ec2_internal",
"ip_10_1_1_6_ec2_internal",
"ip_10_1_1_7_ec2_internal"
],
...
"tag_env_mgmt": [
"ip_10_1_1_7_ec2_internal",
"ip_10_1_1_6_c2_internal",
"ip_10_1_1_5_ec2_internal"
],
"tag_env_prod": [
"ip_10_1_1_2_ec2_internal",
"ip_10_1_1_1_ec2_internal"
],
"tag_env_stage": [
"ip_10_1_1_3_ec2_internal",
"ip_10_1_1_4_ec2_internal"
],
所以我现在想根据某些标签设置条件。 这是我要使用的剧本条件类型,仅当标签为 "stage":
时才添加用户
---
- hosts: ec2
vars:
users:
- user1
- user2
tasks:
- name: "Create user accounts and add users to groups"
user:
name: "{{ item }}"
groups: "sudo"
with_items: "{{ users }}"
when: tag_env_stage is defined
也试过这样:
- name: "Create user accounts and add users to groups"
user:
name: "{{ item }}"
groups: "sudo"
with_items: "{{ users }}"
when: tag_env_stage
还有这个:
- name: "Create user accounts and add users to groups"
user:
name: "{{ item }}"
groups: "sudo"
with_items: "{{ users }}"
when: tag_env == stage
剧本执行失败。我收到以下错误:
error while evaluating conditional (tag_env_stage):
我检查了文档,没有发现任何突出的问题。
(https://docs.ansible.com/ansible/latest/user_guide/intro_dynamic_inventory.html)
(https://docs.ansible.com/ansible/latest/user_guide/playbooks_conditionals.html)
tag_env_prod
、tag_env_stage
是您示例中的组名。
您可以使用:
when: ('tag_env_stage' in group_names)
但这有点难看。我建议使用支持库存插件的现代 Ansible 版本(而不是传统的动态库存)。如果您的清单是使用 aws_ec2
插件生成的,您可以直接访问 tags
变量。所以你可以使用:
when: tags['env'] == 'stage'
设法让它使用以下语法。
when: hostvars[inventory_hostname].ec2_tag_env == "stage"
正如另一个答案所提到的,我试图使用 group_names
这实际上不是实例本身的标识符。 @Konstantin 的回答提供了如何处理 group_names
所以我需要使用动态清单中的 hostvars
对象。
我正在使用 ec2 动态清单。
我所有的 ec2 实例都标记有它们的环境。例如 tag:env = prod
或 tag:env = test
所以我的动态库存变量设置正确....
"ec2": [
"ip_10_1_1_1_ec2_internal",
"ip_10_1_1_2_ec2_internal",
"ip_10_1_1_3_ec2_internal",
"ip_10_1_1_4_ec2_internal",
"ip_10_1_1_5_ec2_internal",
"ip_10_1_1_6_ec2_internal",
"ip_10_1_1_7_ec2_internal"
],
...
"tag_env_mgmt": [
"ip_10_1_1_7_ec2_internal",
"ip_10_1_1_6_c2_internal",
"ip_10_1_1_5_ec2_internal"
],
"tag_env_prod": [
"ip_10_1_1_2_ec2_internal",
"ip_10_1_1_1_ec2_internal"
],
"tag_env_stage": [
"ip_10_1_1_3_ec2_internal",
"ip_10_1_1_4_ec2_internal"
],
所以我现在想根据某些标签设置条件。 这是我要使用的剧本条件类型,仅当标签为 "stage":
时才添加用户---
- hosts: ec2
vars:
users:
- user1
- user2
tasks:
- name: "Create user accounts and add users to groups"
user:
name: "{{ item }}"
groups: "sudo"
with_items: "{{ users }}"
when: tag_env_stage is defined
也试过这样:
- name: "Create user accounts and add users to groups"
user:
name: "{{ item }}"
groups: "sudo"
with_items: "{{ users }}"
when: tag_env_stage
还有这个:
- name: "Create user accounts and add users to groups"
user:
name: "{{ item }}"
groups: "sudo"
with_items: "{{ users }}"
when: tag_env == stage
剧本执行失败。我收到以下错误:
error while evaluating conditional (tag_env_stage):
我检查了文档,没有发现任何突出的问题。
(https://docs.ansible.com/ansible/latest/user_guide/intro_dynamic_inventory.html)
(https://docs.ansible.com/ansible/latest/user_guide/playbooks_conditionals.html)
tag_env_prod
、tag_env_stage
是您示例中的组名。
您可以使用:
when: ('tag_env_stage' in group_names)
但这有点难看。我建议使用支持库存插件的现代 Ansible 版本(而不是传统的动态库存)。如果您的清单是使用 aws_ec2
插件生成的,您可以直接访问 tags
变量。所以你可以使用:
when: tags['env'] == 'stage'
设法让它使用以下语法。
when: hostvars[inventory_hostname].ec2_tag_env == "stage"
正如另一个答案所提到的,我试图使用 group_names
这实际上不是实例本身的标识符。 @Konstantin 的回答提供了如何处理 group_names
所以我需要使用动态清单中的 hostvars
对象。