はじめてのAnsible #2 Playbook分割編

前回はAnsibleやYAMLの基本的な使い方について書きましたが、今回はPlaybookを分割する方法について取り上げます。

例えば「Apacheをインストールするタスク集」「MySQLを設定するタスク集」などを作っておけば、必要なファイルをチョイスするだけで環境が構築できるというわけです。

Playbookを分割する

このまま1つのPlaybookで運用することもできますが、次第に以下のような欲求が出てきます。

  1. 特定の定形処理をPlaybook化したい
  2. 複数のPlaybookを作成すると重複する変数やタスクが出てくる
  3. 重複する部分をなくして管理を楽にしたい!

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で読み込んだファイルへは、これまで紹介したvarsvars_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

なお同じ変数名を複数箇所で定義した場合、優先順位の強い物に上書きされます。上記の例の場合は以下のようになります(上にあるほど優先順位が高い)。

  1. C
  2. B
  3. A

実際にそれぞれのファイル名を変更して実験してみるとわかると思います。詳しくは公式ドキュメントVariable precedence: Where should I put a variable?の項目を参照ください。

個人的にはAよりもBの方が強いのが意外でした。

続き

blog.katsubemakito.net

参考ページ

Ansible実践ガイド 第3版 (impress top gear)
北⼭ 晋吾 佐藤 学 塚本 正隆 畠中幸司 横地 晃
インプレス (2019-10-18)
売り上げランキング: 12,343