5

いくつかのドキュメントを調べた後、with_itemsforは使用できないと結論付けました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.

何か考え/アイデアはありますか?

4

3 に答える 3

2

非常に大まかな概念実証。それが機能するかどうか、私は興味がありました。

主な問題は、動的に作成されたプレイブックがタスク内から呼び出され、その stdout がメインの Ansible ログに入らないことです (メインのプレイブックの変数に登録して、そのように表示できます)。エラーは親プレイブックに伝播します。

主なプレイブック:

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

あなたのケースでは全体的に面倒な価値はないと思いますが、このように他の方法では解決できない問題の場合、有望に見えます。

于 2016-08-22T08:34:25.643 に答える
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

于 2016-08-22T23:12:23.013 に答える
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
于 2016-08-22T09:07:36.330 に答える