Ansible 2.x:ec2_remote_facts

时间:2016-05-21 00:26:28

标签: loops amazon-ec2 ansible

我正在尝试解决如何列出并使用EC2已停止的实例执行某些操作。 ec2_remote_facts是我的朋友,我可以从中获得结果。但作为一个安心的菜鸟我不能为我的生活找到如何获得返回对象的'id'组成部分。文档是粗略的,不包括返回什么类型的东西以及如何使用它。

这是我正在尝试的非常基本的剧本:

---
- 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)所以我可以对所有这些实例做其他事情 - 删除,配置,启动等等。我已经看过所有循环结构和with_ *选项,我无法让它们做任何我想做的事。

毫无疑问,这将是''哦!'任何知道答案的人都会遇到问题,但我现在担心的是我不知道答案。返回的对象如下所示:

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", 

[snip,另外2个实例]

有人想过吗?

6 个答案:

答案 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 }}"

似乎对我有用。

答案 1 :(得分:1)

这应该有效:

  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 }}"

答案 2 :(得分: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

答案 3 :(得分: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 }}"        

欢呼帮助我解决这个问题哈哈。

Ansible的输出:

 (ansible27) user@user:/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]元素说明符的情况。

答案 4 :(得分:0)

花了很多时间研究这个问题,使用Ansible Jinja2过滤器实际上非常简单。

这应该有效:

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

这里描述的一些非常有用的过滤:http://docs.ansible.com/ansible/latest/playbooks_filters.html#other-useful-filters

答案 5 :(得分:0)

感谢@ hit3k

我对您的代码做了一些更改,以使其在Ansible 2.7.10下工作

- name: print the variable name
  debug: msg= "{{ item.0 }}"
  with_items: "{{ ec2_metadata.instances|map(attribute='instance_id')|list }}"

结果:

ok: [vpc.prod.dr] => (item=i-0739f6a14abc1e7d9) => {}
ok: [vpc.prod.dr] => (item=i-04dd1eab60bc03488) => {}
ok: [vpc.prod.dr] => (item=i-09702b90ed31cf00f) => {}
ok: [vpc.prod.dr] => (item=i-05bcaf44b1598aadd) => {}
ok: [vpc.prod.dr] => (item=i-085bfe50d2c6e5c88) => {}
ok: [vpc.prod.dr] => (item=i-0237a96d2e8869d13) => {}
ok: [vpc.prod.dr] => (item=i-0769c21225acfac01) => {}
ok: [vpc.prod.dr] => (item=i-09c55f3c6776ff263) => {}
ok: [vpc.prod.dr] => (item=i-0e8faa6ffb085558f) => {}
ok: [vpc.prod.dr] => (item=i-07e68c8c201fc6021) => {}
ok: [vpc.prod.dr] => (item=i-011a94a276e70d92c) => {}
ok: [vpc.prod.dr] => (item=i-05672115214b129bd) => {}
ok: [vpc.prod.dr] => (item=i-0cbe6652ee855f14d) => {}
ok: [vpc.prod.dr] => (item=i-055ff968821cca086) => {}
ok: [vpc.prod.dr] => (item=i-0c9a7db7a8142c240) => {}
ok: [vpc.prod.dr] => (item=i-02ca647fe24ad6c56) => {}
ok: [vpc.prod.dr] => (item=i-054542fcef48629a0) => {}
ok: [vpc.prod.dr] => (item=i-0a095641b04538a73) => {}
ok: [vpc.prod.dr] => (item=i-05434bac67259041c) => {}