使用ec2结果中的Ansible set_fact。

时间:2016-03-21 13:54:21

标签: amazon-web-services elasticsearch amazon-ec2 ansible

我已经看过几个例子,但是从启动ec2内容的结果中设置IP是失败的。有谁知道为什么? 我使用ansible 2.0.1.0

在3个不同子网中启动3个实例的任务核心工作如下。

  tasks:
- name: elastic instance provisioning
  local_action:
    module: ec2
    region: "{{ region }}"
    key_name: "{{ key }}"
    instance_type: "{{ instance_type }}"
    image: "{{ image }}"
    user_data: "{{ lookup('file', '/etc/ansible/host_vars/elasticsearch/user_data') }}"
    key_name: "{{ key }}"
    wait: yes
    count: 1
    group: ["{{ main_sg }}", "{{ jenkins_sg}}"]
    instance_tags:
       Name: elastic-test-cluster
       class: database
       environment: staging
    vpc_subnet_id: "{{ item }}"
    assign_public_ip: no
  with_items:
     - "{{ private_subnet_1 }}"
     - "{{ private_subnet_2 }}"
     - "{{ private_subnet_3 }}"
  register: ec2
- debug: msg="{{ ec2.results[0].instances[0].private_ip }}"

我可以调试并获得预期的结果

TASK [debug]    
ok: [localhost] => {
"msg": "10.1.100.190"
}

但剧本中的下一部分失败了。

- name: Add Ip for each Server
  set_fact:
    instance_private_ip0: "{{ ec2.results[0].instances[0].private_ip }}"
    instance_private_ip1: "{{ ec2.results[1].instances[1].private_ip }}"
    instance_private_ip2: "{{ ec2.results[2].instances[2].private_ip }}"
  register: result
- debug: var=result

调试的结果如下。不知道该怎么做。

fatal: [localhost]: FAILED! => {"failed": true, "msg": "list object has no element 1"}

1 个答案:

答案 0 :(得分:0)

您还可以循环上一个任务的结果:

- name: Add Ip for each Server
  set_fact:
    instance_private_ip{{ item.0 }}: "{{ item.1.instances[0].private_ip }}"
  with_indexed_items: "{{ ec2.results }}"

不要在这里混淆item.0item.1The with_indexed_items loop每次迭代提供两个项目。 item.0是索引(0,1,2,...),item.1是实际内容。