■ はじめに
Ansible には Ansible Tower の各オブジェクトを管理するモジュールがあります。
ワークフローを管理するモジュールは tower_workflow_template
です。
- 環境
- Ansible 2.9.0
- AWX 7.0.0
■ 環境の準備
Ansible 側に ansible-tower-cli
が必要なのでインストールします。
(venv)$ pip install ansible-tower-cli
加えて、ansible-tower-cli
をインストールした python の環境のインタープリタを変数 ansible_python_interpreter
にどこかで仕込んでおきます。
ansible_python_interpreter: /Users/akira/envs/venvs/a2900/bin/python¥¥
これを忘れると、 tower_workflow_template
モジュール実行時に、Failed to import the required Python library (ansible-tower-cli) on xxx
というエラーが発生し、「インストールしたはずなのにされてないと言われる」という状況になってしまいます。
Ansible Tower / AWX 側は特別な準備は必要ありません。
■ tower_workflow_template
モジュールの基本
tower_workflow_template
モジュールの主なオプションは以下のとおりです。
オプション名 | 概要 |
---|---|
tower_host |
Ansible Tower / AWX のホスト名 |
tower_username |
Ansible Tower / AWX ログインユーザー名 |
tower_password |
Ansible Tower / AWX ログインパスワード |
validate_certs |
SSL証明書検証の有無 |
organization |
ワークフローが所属する組織 |
name |
対象のワークフローの名前 |
schema |
ワークフロー定義の schema ファイル(後述) |
接続情報系のオプションは、他の tower_*
モジュールと共通です。また、タスクのオプションで接続情報系のオプションを指定する以外にも、指定方法はあるようです。その他のオプション含め、詳細は
tower_workflow_template
モジュールのドキュメントを参照してください。
■ schem について
tower_workflow_template
モジュールの一番のキモが schema ファイルです。
基本書式
schema ファイルは、YAML または JSON で ワークフローの定義をするファイルです。 YAMLの場合は、以下のような書式です。
- ノード種別: ノード名 条件1: - ノード種別: ノード名 条件1: - ノード種別: ノード名 - ノード種別: ノード名 条件2: - ノード種別: ノード名
ノード種別
基本書式で示した「ノード種別」には以下のような指定ができます。
GUI 上の名称 | schema 上の名称 |
---|---|
ジョブテンプレート | job_template |
ワークフローテンプレート | workflow |
プロジェクトの同期 | project |
インベントリーの動機 | inventory_source |
例えば jt1
という名前のジョブテンプレートを定義する場合は、
job_template: jt1
と指定します。
試した限り、ノード名は「名前」でも「ID」でも可能でした。
条件
基本書式で示した「条件」には以下のような指定ができます。
GUI 上の名称 | schema 上の名称 |
---|---|
常時 | always |
成功時 | success |
障害発生時 | failure |
例えば、ジョブテンプレート jt1
の実行が正常時に、ジョブテンプレート jt2
を実行したい場合は、
- job_template: jt1 success: - job_template: jt2
と指定します。
■ サンプルと実行結果の確認
Playbook
以下の Playbook を利用します。
- hosts: tower gather_facts: no connection: local vars: tower_user: userxxxxx tower_password: passxxxxx ansible_python_interpreter: /Users/akira/envs/venvs/a2900/bin/python # ^ ansible-tower-cli をインストールした環境の python を指定 # ここでなくてもインベントリファイルなどで指定しても OK tasks: - name: set wf tower_workflow_template: tower_host: "{{ ansible_host }}" tower_username: "{{ tower_user }}" tower_password: "{{ tower_password }}" validate_certs: no name: testwf schema: "{{ lookup('file', 'schema.yml') }}"
各 schema ファイルと実行結果
schema
オプションで指定すた、schema.aml
は以下の2パターン試して、それぞれ実行結果を載せます。
1: 簡単な schema
ジョブテンプレート jt1
の実行が正常時に、ジョブテンプレート jt2
を実行する、という簡単なワークフローを定義する shcema です。
- job_template: jt1 success: - job_template: jt2
この schema を利用した Playbook を実行します。
ワークフローテンプレートの定義が作成されました。
ワークフローは以下のようになりました。
2: すこし複雑な schema
様々なノード種別や条件を含めたワークフローを定義する schema です。
- job_template: jt1 success: - project: testpj always: - job_template: jt4 - job_template: jt5 - job_template: jt2 success: - job_template: jt3 failure: - job_template: jt6
この schema を利用した Playbook を実行します。
ワークフローは以下のようになりました。
※ 本当は inventory_source
も試したかったのですが、あるはずの インベントリーを指定しても tower_cli.exceptions.NotFound: The requested object could not be found.
というエラーになってしまいました。Web GUI 上でも対象のインベントリーを選択できなかったので、なにかが間違っているのかもしれないので、エラーが解消したら更新します。。
■ まとめ
tower_workflow_template
モジュールを利用して、ワークフローを作成する Playbook をご紹介しました。
schme ファイルの書き方は多少覚える必要はありますが、作成していワークフローが多くて GUI 操作がつらいときには便利そうです、
もちろん、Ansible 以外でも、tower-cli
や awx-cli
のようなコマンドラインツールでも良いかと思います。
参考
tower-cli/WORKFLOWS.rst at master · ansible/tower-cli · GitHub tower-cli/docs/source/cli_ref/examples/data at master · ansible/tower-cli · GitHub
おまけ
複数ノードが一つに合流するようなワークフローの定義は今のところできませんでした。
よこち(yokochi) @ Ansible実践ガイド 第3版 on Twitter: "tower_workflow_template モジュールではこういう合流定義できないのかな・・… "
一旦 GUIで合流 workflow 作って tower-cli で export したのをサイド適用すると別れちゃう・・ pic.twitter.com/Ie2OTEUJUP
— よこち(yokochi) @ Ansible実践ガイド 第3版 (@akira6592) November 13, 2019
[2019/11/23 追記]
tower_receive
モジュールと tower_send
モジュールを組み合わせると合流を含むワークフローを新たに作成できました。
https://tekunabe.hatenablog.jp/entry/2019/11/23/ansible_tower_workflow_exp_imptitle]