この記事は、Ansible Advent Calendar 2021 (Adventar版) 11日目の記事です。
はじめに
ansible-playbook
コマンドのオプションを ansible-runner
経由の Playbook 実行(ansible-runner run
コマンド) でも指定したいことはないでしょうか。
以下のように、一部は対応したオプションが用意されています。
ansible-playbook コマンド |
ansible-runner コマンド |
---|---|
-l , --limit |
--limit |
-f , --forks |
--forks |
-v |
-v |
(参考)ansible-runner run -h
の抜粋
...(略)... -v increase the verbosity with multiple v's (up to 5) of the ansible-playbook output (default=None) ...(略)... Ansible Options: control the ansible[-playbook] execution environment --limit LIMIT matches Ansible's ```--limit``` parameter to further constrain the inventory to be used (default=None) --cmdline CMDLINE command line options to pass to ansible-playbook at execution time (default=None) --hosts HOSTS define the set of hosts to execute against (default=None) Note: this parameter only works with -m or -r --forks FORKS matches Ansible's ```--forks``` parameter to set the number of concurrent processes (default=None)
しかし、タグを指定する -t
オプションなど、その他多くの ansible-playook
コマンドのオプションに対応したものはありません。
そんなときに利用できるのが ansble-runner run
コマンドの --cmdline
オプションです。
--cmdline '-t tag1'
のように指定します。簡単な利用例で説明します。
- 環境
- ansible-core 2.12.1
- ansible-runner 2.1.1 (2.0.2 までは
--cmdline
オプションが効かないのでご注意ください)
サンプル
Playbook
--- - hosts: localhost gather_facts: false connection: local tasks: - name: test debug ansible.builtin.debug: msg: "{{ greeting }}" tags: - tag1 - name: test debug 2 ansible.builtin.debug: msg: debug2 tags: - tag2
コマンド実行結果
--cmdline '-e greeting=hello -t tag1'
を指定しています。(後述しますが-e
に関しては別の方法でも渡せます)
$ ansible-runner run . -p playbooks/test.yml --cmdline '-e greeting=hello -t tag1' PLAY [localhost] *************************************************************** TASK [test debug 1] ************************************************************ ok: [localhost] => { "msg": "hello" } PLAY RECAP ********************************************************************* localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
コマンドで渡したエクストラ変数 greeting
の値 hello
が適用されて、タグ tag1
がついているタスクのみが実行されたことが分かります。
--cmdline
の後の値は、クォーテーションの囲い方や中に含まれる値によっては、エスケープする必要があるのでご注意ください。
(参考)オプションではなくファイルで用意する場合
コマンドオプションではなく、env/cmdline
というファイルに書いておく方法もあります。
例:
-t tag1
コマンドラインのエスケープが必要で面倒なときは、こちらの方法のほうが良いかも知れません。
また、エクストラ変数(-e
)に限れば、env/extravars
ファイルに書く方法もあります。