elasticsearch,amazon-ec2,ansible,Amazon Web Services,elasticsearch,Amazon Ec2,Ansible" /> elasticsearch,amazon-ec2,ansible,Amazon Web Services,elasticsearch,Amazon Ec2,Ansible" />

Amazon web services 使用ec2结果中的Ansible set_事实。

Amazon web services 使用ec2结果中的Ansible set_事实。,amazon-web-services,elasticsearch,amazon-ec2,ansible,Amazon Web Services,elasticsearch,Amazon Ec2,Ansible,我见过几个例子,但是根据启动ec2 intances的结果设置IP是失败的。有人知道为什么吗? Iam使用ansible 2.0.1.0 在3个不同的子网中启动3个实例的任务正确地工作如下 tasks: - name: elastic instance provisioning local_action: module: ec2 region: "{{ region }}" key_name: "{{ key }}" instance_type: "{{

我见过几个例子,但是根据启动ec2 intances的结果设置IP是失败的。有人知道为什么吗? Iam使用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"}

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

- 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.0
item.1
。每个迭代提供两个项目
item.0
是索引(0,1,2,…),而
item.1
是实际内容。

我猜每次迭代只捕获最后一个项目,模块可能只返回一个项目,因此实例应始终作为
实例[0]
访问
ec2.results[2]。实例[0]。private_-ip
谢谢,我会尝试一下,我想我知道我哪里弄糊涂了。同时,iam使用ansible启动一个用户数据文件,在每台服务器上运行bash命令来配置集群。但我会改正我的错误,尝试一下。