在完成几个文档之后,我得出结论,我不能将with_items
用于roles
。
因此,我创建了一个filter_plugin
来生成角色的词典列表。
这是我的Play
:
---
- name: Boostrap vpc and subnets with route table
hosts: localhost
connection: local
gather_facts: no
pre_tasks:
- include_vars: ec2_vars/common/regions.yml
- include_vars: environment.yml
roles:
- {
role: vpc,
ec2_region: 'ap-southeast-2'
}
- {
role: vpc,
ec2_region: "ap-southeast-1",
}
- {
role: vpc,
ec2_region: "us-west-2",
}
我想动态生成上述角色,为此我创建了一个filter_plugin
,它生成了一个字典列表,并且工作正常。
这是我的插件:
# this is for generating vpc roles
def roles(ec2_regions):
return [{'role': 'vpc', 'ec2_region': ec2_region} for ec2_region in ec2_regions]
class FilterModule(object):
def filters(self):
return {'vpcroles': roles}
我的计划是生成以下角色:
roles: "{{ EC2_REGIONS | vpcroles }}"
其中EC2_REGIONS
为['ap-southeast-2', 'us-east-1']
但是角色不是这样的。
我收到以下错误:
ERROR! A malformed role declaration was encountered.
任何想法/想法?
答案 0 :(得分:2)
我的同事向我展示了实现动态role
的方法。就是这样。
目录结构:
- vpc.yml
|
- roles/vpc/tasks/main.yml
|
- roles/vpc/tasks/real.yml
播放 - vpc.yml
:
---
- name: Boostrap vpc and subnets with route table
hosts: localhost
connection: local
gather_facts: no
vars:
pre_tasks:
- include_vars: environment.yml
roles:
- { role: "vpc", ec2_regions: "{{ EC2_REGIONS }}"}
角色 - roles/vpc/tasks/main.yml
:
- include: real.yml ec2_region="{{ _region }}"
with_items: "{{ ec2_regions }}"
loop_control:
loop_var: _region
然后在roles/vpc/tasks/real.yml
答案 1 :(得分:1)
非常粗略的概念验证。我很好奇,如果它能起作用,那就好了。
主要问题是从任务内部调用动态创建的playbook,其stdout不会进入主Ansible日志(可以在主playbook的变量中注册并显示为这样)。错误传播到父级剧本。
主要剧本:
---
- hosts: localhost
connection: local
vars:
params:
- val1
- val2
tasks:
- template:
src: role_call.yml.j2
dest: ./dynamic/role_call.yml
- command: ansible-playbook ./dynamic/role_call.yml
templates/role_call.yml.j2
文件中的动态剧本模板:
- hosts: localhost
connection: local
roles:
{% for param in params %}
- { role: role1, par: {{param}} }
{% endfor %}
roles/role1/tasks/main.yml
:
- debug: var=par
我猜可以使用单独的ansible-playbook
作为参数调用内部ansible.cfg
命令,以将日志保存到其他文件。
总的来说,在你的情况下总是不值得麻烦,但是对于一个无法解决的问题,like this看起来很有希望。
答案 2 :(得分:1)
您可以使用虚拟主机作为解决方法:
---
- hosts: localhost
vars:
ec2_regions:
- ap-southeast-2
- ap-southeast-1
- us-west-2
tasks:
- add_host: name=vpc_{{ item }} ansible_connection=local group=vpcs ec2_region={{ item }}
with_items: "{{ ec2_regions }}"
- hosts: vpcs
roles:
- role: my_role