根据 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 标签设置的值。