2016-05-21 2 views
2

Я пытаюсь решить, как перечислить и сделать что-то с остановленными экземплярами EC2. ec2_remote_facts - мой друг, и я могу получить от него результаты. Но в качестве незаметного noob я не могу для жизни меня разобраться, как попасть в компонент id из возвращаемого объекта. Документация является отрывочной и не охватывает то, что возвращается, и как ее использовать.Ansible 2.x: ec2_remote_facts

Вот очень простой сборник пьес я экспериментирую с:

--- 
- name: remote facts 
    hosts: localhost 

    tasks: 

    - ec2_remote_facts: 
     region: ap-southeast-2 
    register: info 

    - name: print 
    debug: var=info 

Это работает просто отлично.

Это также работает:

--- 
- name: remote facts 
    hosts: localhost 

    tasks: 

    - ec2_remote_facts: 
     region: ap-southeast-2 
    register: info 

    - name: print 
    debug: var=info.instances[0].id 

То, что я не могу получить мою голову вокруг заклинание, чтобы дать мне только элемент «ID» для всех существующих экземпляров (3), так что я могу сделать что-то еще с все они - удалить, настроить, запустить, что угодно. Я посмотрел на все конструкции цикла и с параметрами_ *, и я не могу заставить их делать то, что я хочу.

Без сомнения, это будет 'd'oh!' проблема для любого, кто знает ответ, но я боюсь, что в данный момент я просто не понимаю. Возвращаемый объект выглядит следующим образом:

ok: [localhost] => { 
    "info": { 
     "changed": false, 
     "instances": [ 
      { 
       "ami_launch_index": "0", 
       "architecture": "x86_64", 
      "client_token": "vpOGxxxxxxxxxxxxxx", 
      "ebs_optimized": false, 
      "groups": [ 
       { 
        "id": "sg-xxxxxxxx", 
        "name": "launch-wizard-3" 
       } 
      ], 
      "hypervisor": "xen", 
      "id": "i-01xxxxxxxxxxxxxxxx", 

[...]

 "tags": {}, 
     "virtualization_type": "hvm", 
     "vpc_id": "vpc-xxxxxxxx" 
    }, 
     { 
      "ami_launch_index": "1", 
      "architecture": "x86_64", 

[надрез, более 2 экземпляра]

Любые мысли людей?

+0

Что такое, что выход из? Это первый блок ('debug: var = info')? – ydaetskcoR

+0

Да. Я думал, что вставка всей продукции будет излишней. Существует объект «экземпляры», который имеет три элемента, каждый из которых начинается с «ami_launch_index» и заканчивается на «vpc_id». Для меня это похоже на массив структур, но у кажущихся ребята, похоже, есть другое слово для всего. То, что я хочу сделать, это иметь возможность ссылаться на значения «id» для всех найденных экземпляров и позже делать с ними что-то еще. Поскольку меня интересуют остановленные экземпляры, ec2.py не будет работать так, как в текущем состоянии, он не может иметь дело с остановленными экземплярами. Который я сообщил в другом месте как ошибка - это неполное. – MrChuck

ответ

0

Попробуйте это должно работать:

- ec2_remote_facts: 
     region: ap-southeast-2 
    register: info 

    - name: print 
    debug: var=item.id 
    with_items: info_instances 

Если не разделяет полный вывод debug: var=info. Так что я могу рассказать вам точный код.

Кроме того, если вы хотите использовать его с любой задачей, как ec2 для остановки экземпляра использовать его в качестве переменной {{item.instances.id}} с одной петлей with_items: info_instances

+0

Извините, он не работает ни с одним из вариантов. '- имя: печать отладки: вар = item.instances.id with_items: info_instances' дает ' TASK [печать] ******************** *********************************************** ОК: [localhost] => (item = info_instances) => { "item": "info_instances", "item.instances.id": "ПЕРЕМЕН НЕ ОПРЕДЕЛЕН!" } ' , а также другая версия. – MrChuck

+0

Обновлен код выше, можете ли вы попробовать сейчас –

1

Это немного поздно, я подозреваю, но я думаю, что вы просто забыли добавьте «{{}}» вокруг переменной with_items. Работает для меня, если я делаю, так:

ec2_remote_facts: 
     region: "{{ vpc_region }}" 
     filters: 
     instance-state-name: running 
     vpc-id: "{{ vpc_id }}"   
    register: ec2_info 

Тогда:

set_fact: 
    jenkins_master_instances: "{{ jenkins_master_instances|default([]) + [ item.id ]}}" 
with_items: "{{ ec2_info.instances }}" 

, кажется, работает для меня.

0

У вас было это с вашей второй попытки, как ни странно, у меня была такая же проблема, но для меня это показало мой опыт JSON.

Ваш второй фрагмент кода:

--- 
- name: remote facts 
    hosts: localhost 

    tasks: 

    - ec2_remote_facts: 
     region: ap-southeast-2 
    register: info 

    - name: print 
    debug: var=info.instances[0].id 

Мое дополнение:

--- 
- name: remote facts 
    hosts: localhost 

    tasks: 

    - ec2_remote_facts: 
     region: ap-southeast-2 
    register: info 

    - name: print 
    debug: var=info.instances[0].id 

    - name: Create AMI from Instance ID 
    ec2_ami: 
     aws_access_key: "{{ aws_access_key }}" 
     aws_secret_key: "{{ aws_secret_key }}" 
     region: "{{ region }}" 
     instance_id: "{{ ec2_remote_facts.instances[0].id }}"   

Приветствия для помогать мне работать это один из ха-ха.

Выход из анзибля:

(ansible27) [email protected]:/etc/ansible/playbooks$ sudo ansible-playbook ec2_facts.yml 
[WARNING]: Found both group and host with same name: localhost 


PLAY [localhost] *************************************************************** 

TASK [Gathering Facts] ********************************************************* 
ok: [localhost] 

TASK [EC2 Remote Facts.] ******************************************************* 
ok: [localhost] 

TASK [Display results in JSON format.] ***************************************** 
ok: [localhost] => { 
    "changed": false, 
    "msg": "Most upto date instance is: i-1234567abcdefg " 
} 

TASK [Create AMI from instance ID.] ******************************************** 
changed: [localhost] 

PLAY RECAP ********************************************************************* 
localhost     : ok=4 changed=1 unreachable=0 failed=0 

Для вашей проблемы цикла, я предполагаю, что это будет просто случай перехода в [1] и [2] элементе спецификаторы.

0

Это должно работать:

tasks: 

    - ec2_remote_facts: 
     region: ap-southeast-2 
     register: thefacts 

    - debug: var=item.id 
     with_items: "{{thefacts.instances}}" 

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

tasks: 

    - ec2_remote_facts: 
     region: ap-southeast-2 
     register: thefacts 

    - debug: var=item.0 
     with_together: 
     - "{{ thefacts.instances|map(attribute='id')|list }}" 
0

Потратил много времени, смотря на это, и это на самом деле очень просто с помощью фильтров анзибль Jinja2.

это должно работать:

- name: DEBUG 
    debug: 
    var: info |json_query('instances[*].id') 

Некоторые очень полезным Filtering описано здесь: http://docs.ansible.com/ansible/latest/playbooks_filters.html#other-useful-filters

Смежные вопросы