前回はAnsibleやYAMLの基本的な使い方について書きましたが、今回はPlaybookを分割する方法について取り上げます。
例えば「Apacheをインストールするタスク集」「MySQLを設定するタスク集」などを作っておけば、必要なファイルをチョイスするだけで環境が構築できるというわけです。
Playbookを分割する
このまま1つのPlaybookで運用することもできますが、次第に以下のような欲求が出てきます。
- 特定の定形処理をPlaybook化したい
- 複数のPlaybookを作成すると重複する変数やタスクが出てくる
- 重複する部分をなくして管理を楽にしたい!
Ansibleには外部のファイルにあるタスクや変数を読み込む機能がありますのでこいつを利用してやります。
taskを別ファイルにする
以下のファイルのtaskを別のファイルにしてみます。
- hosts: servers remote_user: ansibleman become: yes tasks: #-- 現在日時を出力 --# - name: Write date shell: date >> ansible.txt #-- メモリ使用量をを出力 --# - name: Write Memory shell: free >> ansible.txt
タスクを保存したファイルを格納するtasks
という名前のディレクトリを作成し、各タスク毎にファイルを分割しました。
~/📁 ansible1st 📒 ansible.cfg 📒 playbook.yml 📁 inventory 📒 production 📁 tasks 📒 write-date.yml ★ 📒 write-memory.yml ★
tasks/write-date.yml
現在の日時を出力します。これまで散々登場してきたヤツですw
- name: Write date shell: date >> ansible.txt
tasks/write-memory.yml
こちらは現在のメモリ使用量を記録します。
- name: Write Memory shell: free >> ansible.txt
playbook.yml
include_tasks
で外部のタスクを読み込んで、そのまま実行することができます。
- hosts: servers remote_user: ansibleman become: yes tasks: - include_tasks: tasks/write-date.yml - include_tasks: tasks/write-memory.yml
変数を別ファイルにする
タスクだけではなく変数も外部から読み込んでくることができます。
今度は以下のPlaybookを分割します。
- hosts: servers remote_user: ansibleman become: yes vars: logfile: ansible.txt tasks: - name: Write date shell: date >> {{ logfile }}
変数を保存したファイルを格納するvars
という名前のディレクトリを作成し、external_vars.yml
というファイルに変数を外出ししてみます。
~/📁 ansible1st 📒 ansible.cfg 📒 playbook.yml 📁 inventory 📒 production 📁 vars 📒 external_vars.yml ★
vars/external_vars.yml
こちらはそのまま変数を書いてあげるだけです。
logfile: ansible.txt
playbook.yml
変数を呼び出したいPlaybookでvars_files
にファイルのパスを書いてあげれば完了です。
- hosts: servers remote_user: ansibleman become: yes vars_files: - vars/external_vars.yml tasks: - name: Write date shell: date >> {{ logfile }}
ご覧の通りvars_files
は配列となってますので、同様の書式で一度に複数のファイルを読み込むことが可能です。
taskの外部ファイルへ変数を渡す
include_tasks
で読み込んだファイルへは、これまで紹介したvars
やvars_files
で渡すことができます。またinclude_tasks
の箇所で直接変数を定義することも可能です。
- hosts: servers remote_user: ansibleman become: yes vars: file: bar # A vars_files: - vars/external_vars.yml # B tasks: - include_tasks: tasks/write-date.yml vars: file: hoge.txt # C - include_tasks: tasks/write-memory.yml vars: file: huga.txt # C
なお同じ変数名を複数箇所で定義した場合、優先順位の強い物に上書きされます。上記の例の場合は以下のようになります(上にあるほど優先順位が高い)。
- C
- B
- A
実際にそれぞれのファイル名を変更して実験してみるとわかると思います。詳しくは公式ドキュメントのVariable precedence: Where should I put a variable?の項目を参照ください。
個人的にはAよりもBの方が強いのが意外でした。
続き
参考ページ
インプレス (2019-10-18)
売り上げランキング: 12,343