web-dev-qa-db-ja.com

ansibleロールの `defaults / main.yml`ファイルを複数のファイルに分割する方法は?

一部のansibleロール(例:roles/my-role/)には、かなり大きなデフォルト変数ファイル(defaults/main.yml)があります。 main.ymlをいくつかの小さなファイルに分割したいと思います。それは可能ですか?

defaults/1.ymlおよびdefaults/2.ymlファイルを作成しようとしましたが、ansibleによってロードされません。

9
myrdd

以下で説明する機能は、Ansible 2.6以降で使用可能ですが、v2.6.2でバグ修正が、v2.7で別の(マイナー)修正が適用されました。
古いバージョンのソリューションを確認するには、ポールの回答を参照してください。


defaults/main/

defaults/main.ymlを作成する代わりに、directorydefaults/main/—とすべてのYAMLファイルをそこに配置します。

  • defaults/main.ymldefaults/main/*.yml

Ansibleはそのディレクトリ内に*.ymlファイルをロードするため、roles/my-role/defaults/main/{1,2}.ymlのようにファイルに名前を付けることができます。

古いファイルdefaults/main.ymlは存在しないことに注意してください。 このGithubコメント を参照してください。


vars/main/

ところで、上記の解決策はvars/でも機能します:

  • vars/main.ymlvars/main/*.yml

詳細

この機能はv2.6で導入されました— git commitPull RequestGithubの主な問題

2つのバグ修正がありました。

20
myrdd

2.6を使用していない場合(おそらくそうする必要がありますが、常にオプションではないことを理解しています)、 include_vars が役立つ場合があります。

- name: Include vars of stuff.yaml into the 'stuff' variable (2.2).
  include_vars:
    file: stuff.yaml
    name: stuff

- name: Conditionally decide to load in variables into 'plans' when x is 0, otherwise do not. (2.2)
  include_vars:
    file: contingency_plan.yaml
    name: plans
  when: x == 0

- name: Load a variable file based on the OS type, or a default if not found. Using free-form to specify the file.
  include_vars: "{{ item }}"
  with_first_found:
    - "{{ ansible_distribution }}.yaml"
    - "{{ ansible_os_family }}.yaml"
    - default.yaml

- name: Bare include (free-form)
  include_vars: myvars.yaml

- name: Include all .json and .jsn files in vars/all and all nested directories (2.3)
  include_vars:
    dir: vars/all
    extensions:
        - json
        - jsn

- name: Include all default extension files in vars/all and all nested directories and save the output in test. (2.2)
  include_vars:
    dir: vars/all
    name: test

- name: Include default extension files in vars/services (2.2)
  include_vars:
    dir: vars/services
    depth: 1

- name: Include only files matching bastion.yaml (2.2)
  include_vars:
    dir: vars
    files_matching: bastion.yaml

ただし、これはタスクディレクティブであることに注意してください。それをデフォルトファイル自体に含めることができるほどきれいではありません。

3
Paul Hodges