我尝试创建一个ansible playbook来动态查找与AWS标记匹配的任何实例,创建一个ELB,然后将实例添加到它。到目前为止,我已经成功地为一组标签和一个ELB创建了这些标签。
我试图找出为任意数量的代码运行此操作的最佳方法,而不预先指定我的变量function
和release
。
例如,function
和release
变量将在vars文件中定义。
function:
- api
- webapp
- mysql
release:
- prod
- stage
- dev
我的剧本看起来像这样。我正在努力寻找一种通过变量列表循环整个剧本的方法。如果我在第一个任务中添加with_items
,它会循环整个任务,然后转移到下一个任务,而这个任务无法完成我想要的任务。
- ec2_remote_facts:
filters:
instance-state-name: running
"tag:Function": "{{ function }}"
"tag:Release": "{{ release }}"
region: us-east-1
register: ec2instance
- local_action:
module: ec2_elb_lb
name: "{{ function }}-{{ release }}"
state: present
instance_ids: "{{ item.id }}"
purge_instance_ids: true
region: us-east-1
subnets:
- subnet-1
- subnet-2
listeners:
- protocol: https
load_balancer_port: 443
instance_port: 80
ssl_certificate_id: "{{ ssl_certificate_id }}"
health_check:
ping_protocol: http
ping_port: 80
ping_path: "/status"
response_timeout: 3
interval: 5
unhealthy_threshold: 2
healthy_threshold: 2
access_logs:
interval: 5
s3_location: "{{ function }}-{{ release }}-elb"
s3_prefix: "logs"
with_items: ec2instance.instances
答案 0 :(得分:1)
我能想到的最简单的事情是参数化包括。
制作单次拍摄的任务列表,例如elb_from_tagged_instances.yml
。
然后在循环中使用main.yml
制作include
:
- include: elb_from_tagged_instances.yml function={{item[0]}} release={{item[1]}}
with_together:
- "{{function}}"
- "{{release}}"
如果你不需要以某种方式交叉交叉函数/发布,我会用一个dict列表替换两个list function / release并迭代它。
UPDATE:嵌套循环示例获得9对:
---
- hosts: localhost
connection: local
vars:
functions:
- api
- webapp
- mysql
releases:
- prod
- stage
- dev
tasks:
- include: include_z1.yml function="{{item[0]}}" release="{{item[1]}}"
with_nested:
- "{{functions}}"
- "{{releases}}"
另请注意,您应该为列表和参数(我的示例中使用function
和functions
(复数)使用不同的名称,以避免递归模板。