てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] Ansible で Ansible Tower / AWX のワークフローを作成する(tower_workflow_template モジュール編)

■ はじめに

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 を実行します。

ワークフローテンプレートの定義が作成されました。

f:id:akira6592:20191114084934p:plain
ワークフローテンプレートが作成された

ワークフローは以下のようになりました。

f:id:akira6592:20191114085054p:plain
簡単なワークフロー

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 を実行します。

ワークフローは以下のようになりました。

f:id:akira6592:20191114090145p:plain
すこし複雑なワークフロー

※ 本当は inventory_source も試したかったのですが、あるはずの インベントリーを指定しても tower_cli.exceptions.NotFound: The requested object could not be found. というエラーになってしまいました。Web GUI 上でも対象のインベントリーを選択できなかったので、なにかが間違っているのかもしれないので、エラーが解消したら更新します。。


■ まとめ

tower_workflow_template モジュールを利用して、ワークフローを作成する Playbook をご紹介しました。

schme ファイルの書き方は多少覚える必要はありますが、作成していワークフローが多くて GUI 操作がつらいときには便利そうです、

もちろん、Ansible 以外でも、tower-cliawx-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 モジュールではこういう合流定義できないのかな・・… "

[2019/11/23 追記] tower_receive モジュールtower_send モジュールを組み合わせると合流を含むワークフローを新たに作成できました。 https://tekunabe.hatenablog.jp/entry/2019/11/23/ansible_tower_workflow_exp_imptitle]