在ansible中创建动态角色

时间:2016-08-22 05:37:36

标签: ansible yaml ansible-role

在完成几个文档之后,我得出结论,我不能将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.

任何想法/想法?

3 个答案:

答案 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