Ansible AWS создает счетчик количества тегов экземпляра - PullRequest
0 голосов
/ 05 октября 2018

У меня есть несколько экземпляров EC2, для которых мне нужно использовать Ansible для сбора фактов.Исходя из этих фактов, мне нужно создать счет количества экземпляров с конкретными тегами в формате:

{tag.value: count-of-instances-with-that-tag.value}

Так, например, тег «Роль» будет выглядеть следующим образом:

{"role1": 3,
"role2": 11,
"role3": 5}

Я достаточно хорошо понимаю часть сбора фактов:

- name: Get existing instance facts
  ec2_instance_facts:
    region: "{{ aws_region }}"
    filters:
      instance-state-name: [pending, running, stopping, stopped]
      "tag:Stack": "{{ stack }}"
      vpc-id: "{{ vpc_id }}"
  register: existing_instance_facts

Вот сокращенный пример выходных данных из вышеуказанного модуля:

TASK [vpc.ec2 : Output existing_instance_facts] **********************************

ok: [localhost] => {
    "msg": {
        "changed": false,
        "failed": false,
        "instances": [
            {
                "architecture": "x86_64",
                "ebs_optimized": false,
                "image_id": "ami-xxxxxxxxxxx",
                "instance_id": "i-xxxxxxxxxxx",
                "instance_type": "t2.micro",
                "key_name": "some_key",
                "launch_time": "2018-04-04T20:19:55+00:00"
                },
                "private_dns_name": "ip-xx-xxx-xx-xx.us-west-2.compute.internal",
                "private_ip_address": "xx.xxx.xx.xx",
                "subnet_id": "subnet-xxxxxxxxxxx",
                "tags": {
                    "Environment": "dev",
                    "Role": "role1",
                    "Stack": ""
                },
                "vpc_id": "vpc-xxxxxxxxxxxxxx"
            },
            {
                "architecture": "x86_64",
                "ebs_optimized": false,
                "image_id": "ami-xxxxxxxxxxx",
                "instance_id": "i-xxxxxxxxxxx",
                "instance_type": "t2.micro",
                "key_name": "some_key",
                "launch_time": "2018-04-04T20:19:55+00:00"
                },
                "private_dns_name": "ip-xx-xxx-xx-xx.us-west-2.compute.internal",
                "private_ip_address": "xx.xxx.xx.xx",
                "subnet_id": "subnet-xxxxxxxxxxx",
                "tags": {
                    "Environment": "dev",
                    "Role": "role1",
                    "Stack": ""
                },
                "vpc_id": "vpc-xxxxxxxxxxxxx"
            },
            {
                "architecture": "x86_64",
                "ebs_optimized": false,
                "image_id": "ami-xxxxxxxxxxx",
                "instance_id": "i-xxxxxxxxxxx",
                "instance_type": "t2.micro",
                "key_name": "some_key",
                "launch_time": "2018-04-04T20:19:55+00:00"
                },
                "private_dns_name": "ip-xx-xxx-xx-xx.us-west-2.compute.internal",
                "private_ip_address": "xx.xxx.xx.xx",
                "subnet_id": "subnet-xxxxxxxxxxx",
                "tags": {
                    "Environment": "dev",
                    "Role": "role2",
                    "Stack": ""
                },
                "vpc_id": "vpc-xxxxxxxxxxxxx"
            }

        ]
    }
}

У меня проблема в том, что я не могу понять, как использовать ansible для подсчета, ну, ничего.Вот моя задача на данный момент:

- name: "Set fact: count of existing instances by role"
  set_fact:
    count_of_tags: "{{ count_of_tags | default({}) | combine({??item.tags.Role.value?? : ??count-of-instances-with-that-tag.value?? }) }}"
  loop: "{{ existing_instance_facts.instances }}"

1 Ответ

0 голосов
/ 05 октября 2018

Предполагая, что ваши данные были правильными (то, что вы опубликовали, нет), вы можете сделать это, например, следующим образом:

- set_fact:
    counted_instances: "{{ counted_instances | default({}) | combine({item.0: item.1|length}) }}"
  loop: "{{ existing_instance_facts.instances|groupby('tags.Role') }}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...