根据 AWS 标签分配 ansible 变量
Assign ansible vars based on AWS tags
我正在尝试找出一种方法,根据我在 AWS 中的标签在 Ansible 中分配变量。我正在试验 ec2_remote_tags
但它返回的信息比我需要的多得多。似乎应该有更简单的方法来做到这一点,我只是没有想到它。
例如,如果我有一个名为 function
的标签,它使用动态库存创建 tag_function_api
组,并且我想将变量 function
分配给值 api
.关于执行此操作的有效方法有什么想法吗?
我已经成功地用值列表制作了一个标签字典:
- hosts: localhost
tasks:
- ec2_remote_facts:
region: eu-west-1
register: ec2_facts
# get all possible tag names
- set_fact: tags="{{ item.keys() }}"
with_items: "{{ ec2_facts.instances | map(attribute='tags') | list }}"
register: tmp_tags
# get flattened list of tags (for some reason lookup() returns string, so we use with_)
- assert: that=true
with_flattened: "{{ tmp_tags.results | map(attribute='ansible_facts.tags') | list }}"
register: tmp_tags
# get unique tag names
- set_fact: tags="{{ tmp_tags.results | map(attribute='item') | list | unique }}"
- set_fact: my_tags="{{ {} }}"
# get all possible values for a given tag
- set_fact:
my_tags: "{{ my_tags | combine( {''+item: ec2_facts.instances | map(attribute='tags.'+item) | select('defined') | list | unique}) }}"
with_items: "{{ tags }}"
- debug: var=my_tags
根据我在此处找到的更多信息,能够使其正常工作:https://groups.google.com/forum/#!topic/ansible-project/ES2CjMPps3M
这是对我们有用的代码:
- name: Retrieve all tags on an instance
ec2_tag:
region: '{{ ec2_region }}'
resource: '{{ ec2_id }}'
state: list
aws_access_key: "{{ ANSIBLE_IAM_KEY }}"
aws_secret_key: "{{ ANSIBLE_IAM_SECRET }}"
register: ec2_facts
- name: register variables based on tag
set_fact:
tt_function: "{{ ec2_facts.tags.Function }}"
tt_release: "{{ ec2_facts.tags.Release }}"
tt_client: "{{ ec2_facts.tags.Client }}"
如果您使用的是 Ansible 的 ec2.py
动态清单脚本,它会以 ec2_tag_<tag name> = <tag value>
的形式将所有标签用作主机变量。它还将所有 EC2 主机添加到组 ec2
.
因此,如果您的 EC2 实例有一个标签 AwesomeVariable = "Greatness"
,并且您希望将该值分配给 Ansible 主机变量 stupendous
,您可以这样做:
- name: Register variables based on tags
set_fact:
stupendous: "{{ ec2_tag_AwesomeVariable }}"
when: "'ec2' in group_names"
在此运行后,您可以为您的 EC2 主机使用变量 stupendous
,它具有为 AwesomeVariable
标签设置的值。
我正在尝试找出一种方法,根据我在 AWS 中的标签在 Ansible 中分配变量。我正在试验 ec2_remote_tags
但它返回的信息比我需要的多得多。似乎应该有更简单的方法来做到这一点,我只是没有想到它。
例如,如果我有一个名为 function
的标签,它使用动态库存创建 tag_function_api
组,并且我想将变量 function
分配给值 api
.关于执行此操作的有效方法有什么想法吗?
我已经成功地用值列表制作了一个标签字典:
- hosts: localhost
tasks:
- ec2_remote_facts:
region: eu-west-1
register: ec2_facts
# get all possible tag names
- set_fact: tags="{{ item.keys() }}"
with_items: "{{ ec2_facts.instances | map(attribute='tags') | list }}"
register: tmp_tags
# get flattened list of tags (for some reason lookup() returns string, so we use with_)
- assert: that=true
with_flattened: "{{ tmp_tags.results | map(attribute='ansible_facts.tags') | list }}"
register: tmp_tags
# get unique tag names
- set_fact: tags="{{ tmp_tags.results | map(attribute='item') | list | unique }}"
- set_fact: my_tags="{{ {} }}"
# get all possible values for a given tag
- set_fact:
my_tags: "{{ my_tags | combine( {''+item: ec2_facts.instances | map(attribute='tags.'+item) | select('defined') | list | unique}) }}"
with_items: "{{ tags }}"
- debug: var=my_tags
根据我在此处找到的更多信息,能够使其正常工作:https://groups.google.com/forum/#!topic/ansible-project/ES2CjMPps3M
这是对我们有用的代码:
- name: Retrieve all tags on an instance
ec2_tag:
region: '{{ ec2_region }}'
resource: '{{ ec2_id }}'
state: list
aws_access_key: "{{ ANSIBLE_IAM_KEY }}"
aws_secret_key: "{{ ANSIBLE_IAM_SECRET }}"
register: ec2_facts
- name: register variables based on tag
set_fact:
tt_function: "{{ ec2_facts.tags.Function }}"
tt_release: "{{ ec2_facts.tags.Release }}"
tt_client: "{{ ec2_facts.tags.Client }}"
如果您使用的是 Ansible 的 ec2.py
动态清单脚本,它会以 ec2_tag_<tag name> = <tag value>
的形式将所有标签用作主机变量。它还将所有 EC2 主机添加到组 ec2
.
因此,如果您的 EC2 实例有一个标签 AwesomeVariable = "Greatness"
,并且您希望将该值分配给 Ansible 主机变量 stupendous
,您可以这样做:
- name: Register variables based on tags
set_fact:
stupendous: "{{ ec2_tag_AwesomeVariable }}"
when: "'ec2' in group_names"
在此运行后,您可以为您的 EC2 主机使用变量 stupendous
,它具有为 AwesomeVariable
标签设置的值。