根据AWS标记分配ansible vars

时间:2016-09-09 13:48:10

标签: amazon-web-services ansible boto

我正在尝试找出一种基于我在AWS中使用的标签在Ansible中分配变量的方法。我正在试验template <size_t N> void copyWithBoundaryCheck(char (&destination)[N]) { printf( "Correct parameter of size %zu\n", N ); }; ,但它返回的信息比我需要的还要多。似乎应该有一种更简单的方法来做到这一点,我只是没想到它。

例如,如果我有一个名为ec2_remote_tags的标记使用动态广告资源创建function组,并且我想将变量tag_function_api分配给值function。有效方法的任何想法吗?

3 个答案:

答案 0 :(得分:2)

我设法制作了带有值列表的标签:

- 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

答案 1 :(得分:0)

能够根据我在此处找到的更多信息来实现此目的: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 }}"

答案 2 :(得分:0)

如果您使用的是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"

运行此命令后,您可以将变量stupendous用于EC2主机,并为其变量AwesomeVariable设置值。