【Ansible Tower/AWX】別プレイブックを呼び出す方法


この記事はプロモーションを含みます。

Ansible

ホーム > Ansible Tower・AWX リファレンス

Ansible(AWX/Tower)環境で、特定のプレイブックから、別のプレイブックを呼び出す方法を解説します。

はじめに・テスト環境について

本記事では、あるプレイブックから、別のプレイブックを呼び出すことが出来る、以下の2つのモジュールの使い方について説明します。

  • include_tasks
  • import_tasks

以下は、テスト環境の構成情報です。

  • コントロールノード
    • Ansible AWX 15.0.1
  • ターゲットノード
    • AlmaLinux release 9.0 (Emerald Puma)
      (VirtualBox 7.0上の仮想マシン)

include_tasksとimport_tasksの違い

include_tasksとimport_tasksのどちらも別のプレイブックを呼び出すモジュールですが、ここでは、この2つのモジュールにどのような違いがあるかを説明します。

この2つのモジュールの大きな違いは、with系のディレクティブと組み合わせて使用出来るか、出来ないかです。それぞれ、下記のようになります。

  • with系のディレクティブと組み合わせることが出来る → include_tasks
  • with系のディレクティブと組み合わせることが出来ない → import_tasks

上記以外にも細かな違いがあるかもしれませんが、あまり意識したことはありません。

では、「include_tasks」だけを使用すればいいのでは?と考える方もいるかと思います。
確かに、include_tasksのみでも、処理を記述することは可能ですが、
with系のディレクティブと組み合わせて、別のプレイブックを呼び出す場合は「include_tasks」、
組み合わせずに別プレイブックを呼び出す場合は「import_tasks」という風に使い分けることで、
プレイブックの解析時などに役立つ場面も多いかと思います。
なので、実装時のルールとして、使い分けることをお勧めします。

import_tasksの使い方

ここでは、import_tasksを使用して、別のプレイブックを呼び出す方法を説明します。

書式

import_tasksの書式です。

import_tasks: 呼び出すプレイブック名

サンプル

サンプルのソースコードです。
11行目で、親プレイブックである「parent.yml」から、子プレイブックである「child.yml」を呼び出しています。それ以外の処理としては、メッセージを出力するのみです。

親プレイブック:parent.yml(呼び出す側)

---
- hosts: all
  gather_facts: False
  tasks:

  - name: "【親プレイブック】処理開始"
    debug:
      msg: "親プレイブックの処理を開始します。"

  - name: "子プレイブックの呼び出し"
    import_tasks: child.yml

  - name: "【親プレイブック】処理終了"
    debug:
      msg: "親プレイブックの処理を終了します。"

子プレイブック:child.yml(呼び出される側)

---
- name: "【子プレイブック】処理実行"
  debug:
    msg: "プレイブックが呼び出されました。"

実行結果

サンプルの実行結果です。
先に親プレイブックの処理が始まり、途中で、子プレイブックが呼び出されていることが分かります。

SSH password: 
BECOME password[defaults to SSH password]: 

PLAY [all] *********************************************************************

TASK [【親プレイブック】処理開始] ***********************************************************
ok: [STKPUB002] => {
    "msg": "親プレイブックの処理を開始します。"
}

TASK [【子プレイブック】処理実行] ***********************************************************
ok: [STKPUB002] => {
    "msg": "プレイブックが呼び出されました。"
}

TASK [【親プレイブック】処理終了] ***********************************************************
ok: [STKPUB002] => {
    "msg": "親プレイブックの処理を終了します。"
}

PLAY RECAP *********************************************************************
STKPUB002                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

include_tasksの使い方

ここでは、include_tasksを使用して、別のプレイブックを呼び出す方法を説明します。
普通に使用した場合は、import_tasksと同じ挙動になるので、今回は「with_sequence」と組み合わせて使用してみます。

書式

include_tasksの書式です。

include_tasks: 呼び出すプレイブック名

サンプル

サンプルのソースコードです。
11行目で、親プレイブックである「parent.yml」から、子プレイブックである「child.yml」を呼び出しています。
また、12行目のwith_sequenceで、呼び出し処理を3回実行しています。
それ以外の処理としては、メッセージを出力するのみです。

親プレイブック:parent.yml(呼び出す側)

---
- hosts: all
  gather_facts: False
  tasks:

  - name: "【親プレイブック】処理開始"
    debug:
      msg: "親プレイブックの処理を開始します。"

  - name: "子プレイブックの呼び出し"
    include_tasks: child.yml
    with_sequence: start=1 end=3

  - name: "【親プレイブック】処理終了"
    debug:
      msg: "親プレイブックの処理を終了します。"

子プレイブック:child.yml(呼び出される側)

---
- name: "【子プレイブック】処理実行"
  debug:
    msg: "プレイブックが呼び出されました。"

実行結果

サンプルの実行結果です。
先に親プレイブックの処理が始まり、途中で、子プレイブックが呼び出されていることが分かります。
また、with_sequenceにより、子プレイブックが3回呼び出されていることも分かりますね。

SSH password: 
BECOME password[defaults to SSH password]: 

PLAY [all] *********************************************************************

TASK [【親プレイブック】処理開始] ***********************************************************
ok: [STKPUB002] => {
    "msg": "親プレイブックの処理を開始します。"
}

TASK [子プレイブックの呼び出し] ************************************************************
included: /tmp/awx_156_81bhx2_1/project/child.yml for STKPUB002
included: /tmp/awx_156_81bhx2_1/project/child.yml for STKPUB002
included: /tmp/awx_156_81bhx2_1/project/child.yml for STKPUB002

TASK [【子プレイブック】処理実行] ***********************************************************
ok: [STKPUB002] => {
    "msg": "プレイブックが呼び出されました。"
}

TASK [【子プレイブック】処理実行] ***********************************************************
ok: [STKPUB002] => {
    "msg": "プレイブックが呼び出されました。"
}

TASK [【子プレイブック】処理実行] ***********************************************************
ok: [STKPUB002] => {
    "msg": "プレイブックが呼び出されました。"
}

TASK [【親プレイブック】処理終了] ***********************************************************
ok: [STKPUB002] => {
    "msg": "親プレイブックの処理を終了します。"
}

PLAY RECAP *********************************************************************
STKPUB002                  : ok=8    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

import_tasksでwith系のディレクティブを使用した時のエラー

import_tasksとwith系のディレクティブを組み合わせて使用すると、以下のようなエラーが発生します。
エラーの内容としては、import_tasksではループ処理を行えないので、include_tasksを使用して下さいというものです。

ERROR! You cannot use loops on 'import_tasks' statements. You should use 'include_tasks' instead.

The error appears to be in '/tmp/awx_155_3l0gui03/project/parent.yml': line 10, column 5, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

  - name: "子プレイブックの呼び出し"
    ^ here

コメント

タイトルとURLをコピーしました