てくなべ (tekunabe)

ansible / network / automation / StackStorm

[Ansible] ansible-playbook コマンドの -e (--extra-vars) オプションは変数ファイル名も指定できる

-e (--extra-vars) オプションとは

ansible-playbook コマンドには、-e(または --extra-bars という、extra vars(一番優先される変数の種類)を指定するオプションがあります。複数指定する場合は、複数の -e オプションを使用します。

ansible-playbook -i localhost, -e key1=val1 -e key2=val2 -e key3=val3


-e @ファイル名 で変数ファイルも指定できる

-e オプションの指定が多かったり、リストやディクショナリの値を指定すると、コマンドが見にくくなってしまいます。そこで、-e @ファイル名 のように指定すると、変数たちを書き出したファイルを扱うことができ、コマンドをすっきりさせることができます。 (ドキュメントやコマンドヘルプにも記載があります)

ファイルは yamljson を指定できます。 https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html?highlight=JSON#passing-variables-on-the-command-line


サンプル

  • playbook
- hosts: localhost
  gather_facts: no

  tasks:
    - name: vars test
      debug:
        var: "{{ item }}"
      loop:
        - key1
        - key2
        - key3
  • myvars.yml (変数たちを書き出したファイル)
---
key1: val1
key2: val2
key3:
  - val3_1
  - val3_2
  - val3_3
  • 実行結果
$ ansible-playbook -i localhost, varstest.yml -e @myvars.yml

PLAY [localhost] ***********************************************************

TASK [vars test] ***********************************************************
ok: [localhost] => (item=key1) => {
    "item": "key1",
    "key1": "val1"
}
ok: [localhost] => (item=key2) => {
    "item": "key2",
    "key2": "val2"
}
ok: [localhost] => (item=key3) => {
    "item": "key3",
    "key3": [
        "val3_1",
        "val3_2",
        "val3_3"
    ]
}

PLAY RECAP *****************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0

他にも変数ファイルを取り込める機能は、host_vars ディレクトリ、group_vars ディレクトリ、vars_files ディレクティブなどがありますが、この方法も選択肢として頭の隅に置いておくと良いかもしれません。

参考

qiita.com