ホーム > 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上の仮想マシン)
- AlmaLinux release 9.0 (Emerald Puma)
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
コメント