2016-02-11 192 views
0

您好我需要编写一个Ansible代码来启动EC2实例并以循环方式将其分配给可用子网。手动创建的VPC只有1个,但根据启动的基础设施,子网的数量会有所不同。 我的hosts文件看起来像这样使用Ansible启动EC2实例并动态分配子网

[ABC-database] 
ABCDB01 

[ABC-application] 
ABCFE0[1:2] 
ABCBE0[1:2] 

[cassandra] 
CASS0[1:3] 

我也写代码来创建子网文件

subnet1: subnet-7284c12b 
subnet2: subnet-fd363e98 
subnet3: subnet-c892bfbf 

我所要做的就是在同一时间拿起一个实例,拿起每个实例all.yml中的配置,并以循环(循环)方式将其分配给每个子网。

目前我写了一个shell脚本来做到这一点。该脚本会计算子网文件中子网的数量,并在每次调用时返回一个新的子网ID。

我被困在这之后。 如何在启动ec2实例时调用此脚本?下面的代码抛出一个错误“next_subnet”未定义

- name: Launch instances. 
    local_action: 
    command: ./get_next_available_subnet.sh 
    register: next_subnet 
    module: ec2 
    region: "{{ region }}" 
    keypair: "{{ keypair }}" 
    instance_type: "{{item.instance_type}}" 
    image: "{{image_id}}" 
    vpc_subnet_id: "{{ next_subnet.stdout }}" 
    count: 1 
    wait: yes 
    with_items: "{{component_list}}" 

有一个不太混乱的方式来实现这一目标?

回答

1

您的playbook合并了两个任务,因此当您尝试运行ec2任务时,next_subnet变量未注册。

更改你的剧本这个解决了眼前的问题:

- name: Get next subnet 
    local_action: 
    command: ./get_next_available_subnet.sh 
    register: next_subnet 

- name: Launch instances 
    local_action: 
    ec2: 
     region: "{{ region }}" 
     keypair: "{{ keypair }}" 
     instance_type: "{{item.instance_type}}" 
     image: "{{image_id}}" 
     vpc_subnet_id: "{{ next_subnet.stdout }}" 
     count: 1 
     wait: yes 
    with_items: "{{component_list}}" 

然而,这则不仅使剧本跑,而不是你想要的。如果你增加了count数量,每个实例仍然被放在同一个子网中,因为next_subnet变量只被注册一次,然后在一个循环中使用它。

假设您可以反复调用您的脚本,它将通过可用的子网ID进行轮换,那么您只需要迭代第一个任务即可获得可用于第二个任务的结果列表,如下所示:

- name: Get next subnet 
    local_action: 
    command: ./get_next_available_subnet.sh 
    register: next_subnet 
    with_items: component_list 

- name: Launch instances 
    local_action: 
    ec2: 
     region: "{{ region }}" 
     keypair: "{{ keypair }}" 
     instance_type: "{{item.1.instance_type}}" 
     image: "{{image_id}}" 
     vpc_subnet_id: "{{ item.0.stdout }}" 
     count: 1 
     wait: yes 
    with_together: 
    - next_subnet 
    - component_list 

意味着你的shell脚本输出是这样的:

$ ./get_next_available_subnet.sh 
subnet-7284c12b 
$ ./get_next_available_subnet.sh 
subnet-fd363e98 
$ ./get_next_available_subnet.sh 
subnet-c892bfbf 
$ ./get_next_available_subnet.sh 
subnet-7284c12b 

然后第一个任务的next_subnet的变量,任务结果列表登记,这将有stdout的关键和子网ID的值。第二项任务然后使用with_together loop循环访问该子网ID列表以及实例列表。

+0

非常感谢:) – mp123