てくなべ (tekunabe)

ansible / network automation / 学習メモ

[ansible] ansible-runner で ansilbe-playbook コマンドのオプションを指定する --cmdline オプション

この記事は、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 ファイルに書く方法もあります。