連載
» 2016年10月05日 05時00分 UPDATE

Ansibleで始めるサーバ作業自動化入門(4):Playbookを再利用しやすくするRoleの基本と共有サービスAnsible Galaxyの使い方 (1/4)

本連載では、「マニュアルやシェルスクリプトを使ったサーバ管理に課題を持つ方」を対象に、Ansibleの基本的な使い方を紹介。今回は、プレイブックを再利用しやすくするための機能と、「ロール」と呼ばれる推奨ディレクトリ構成、共有サービスAnsible Galaxyの使い方を紹介します。

[今泉俊幸,株式会社ビーブレイクシステムズ]

 「マニュアルやシェルスクリプトを使ったサーバ管理に課題を持つ方」を対象に、Ansibleの基本的な使い方を紹介する本連載「Ansibleで始めるサーバ作業自動化入門」。前回の「Ansibleを効果的に使うのに欠かせないPlaybookの基本的な書き方まとめ」は変数の利用や条件分岐といったAnsibleのプレイブック作成に欠かせない基本的な機能を説明しました。

 今回はより良いプレイブックを作成するため、プレイブックを再利用しやすくするための機能と、「ロール」と呼ばれる推奨ディレクトリ構成を紹介します。

 また、ロールを知ることで、全世界のAnsibleユーザーがプレイブックを共有する「Ansible Galaxy」というコミュニティを利用できるようになります。Ansible Galaxyから目的の処理を行うためのプレイブックを見つけられれば、自分でプレイブックを作成する手間が少なくなります。

 このAnsible Galaxyの基本的な使い方と、自作のプレイブックを登録する手順も後半に紹介します。

プレイブックを再利用しやすくするための分割方法

 連載の前回では、変数やタスクを全て、1つのプレイブックに書いていました。しかし、これでは変数の値だけ変えたい場合でも、完成したプレイブックを書き換えなければなりません。また、巨大なプレイブックは単純に読みづらくなります。そのため、適切な単位でプレイブックを分割する必要があります。

「vars_files」を使った変数定義の分割

 まずは、変数を別ファイルに外出しする方法を紹介します。以下は前回の記事で使った修正前のプレイブックです。

- hosts: all
  become: yes
  become_user: root
  vars:
    user_name: piyo
  tasks:
    - user: name={{ user_name }}
    - copy: src= /home/foo/bar.txt dest=/home/{{ user_name }}/

 上記で定義している変数user_nameを別ファイルから参照するようにしてみます。まず、適当なファイルを作成し、変数定義部の内容を移します。今回はファイル名を「vars.yml」としました。vars.ymlの中身は以下の通りです。

user_name: piyo

 そして、最初のプレイブックのvars要素を「vars_files」に変更し、変数定義をしていた箇所に読み込むファイル名を指定します。修正後のプレイブックは以下の通りです(4〜5行目が変更箇所)。

- hosts: all
  become: yes
  become_user: root
  vars_files:
    - vars.yml
  tasks:
    - user: name={{ user_name }}
    - copy: src= /home/foo/bar.txt dest=/home/{{ user_name }}/

「include」を使ったタスクの分割

 変数を別ファイルに外出しできたように、タスクについても別ファイルに外出しできます。これにより、いくつかの意味のある固まりの処理をつなげてプレイブックを作ることができます。

 今回は先ほどのプレイブックのuserモジュールとcopyモジュールの実行をそれぞれ別ファイルから参照するようにしてみます。

 まず、変数を別ファイルに外出しした場合と同様に、適当なファイルを作成し、タスク定義部の内容を移します。今回はadd_user.ymlとcopy_file.ymlの2つのファイルを作成しました。

 それぞれのファイルの中身は以下の通りです。

- user: name={{ user_name }}
add_user.yml
- copy: src= /home/foo/bar.txt dest=/home/{{ user_name }}/
copy_file.yml

 そして、最初のプレイブックで「include」モジュールを利用し、ファイルからタスクを読み込ませるようにします。修正後のプレイブックは以下の通りです(7〜8行目が変更箇所)。

- hosts: all
  become: yes
  become_user: root
  vars_files:
    - var.yml
  tasks:
    - include: add_user.yml
    - include: copy_file.yml

変数の値を設定するさまざまな方法

 先ほどvars_filesを使って変数を別ファイルから参照する方法を紹介しましたが、変数定義はその他にもさまざまな方法があるため、ここで併せて紹介します。

変数パラメータ付きinclude

 includeを使ってタスクを利用する際、引数として「変数名=値」を渡すことで、個別に変数の値を指定できます。これにより、以下のように同一タスクを異なる変数で実行することなどが可能です。

  tasks:
    - include: add_user.yml user_name=hoge
    - include: add_user.yml user_name=piyo

ホスト/グループごとに変数を定義する

 本番環境とテスト環境でリリースに使うファイルの名称が異なるといったことがあるかと思います。そのような場合はホスト、グループごとの変数定義を使うと便利です。

 ホスト、グループごとの変数定義を行うには2種類の方法があります。

 1つ目は、インベントリファイルに直接記載する方法です。ホストごとにenv_nameという変数を定義する例は以下のようになります。

production env_name=prod
test env_name=test

 グループごとに変数を定義したい場合は以下のように[グループ名:vars]を使います。

[test]
example1
example2
 
[test:vars]
env_name=test

 2つ目はホスト、グループごとに専用のファイルを作成する方法です。プレイブックと同じディレクトリに「host_vars」「group_vars」ディレクトリを作り、その中にホスト名、グループ名と同名のファイルを作成すると、その中の変数の値が使われます。

 ホストごとに変数を定義する場合のディレクトリ例は以下の通りです。

setup.yml
hosts
host_vars/
  - production
  - test

 上記のproduction、testファイルの中身はvars_filesで読み込むファイルと同様の形式となり、以下のように変数とその値を記述します。

env_name: prod

コマンド実行時に引数で指定する

 一時的に変数の値を変更したく、ファイルの値を書き換えたくないような場合、ansible-playbookコマンドでプレイブックを実行する際に変数の値を指定可能です。以下のように「--extra-vars」引数を使うことで、変数の値を指定できます。

$ ansible-playbook -i hosts setup.yml --extra-vars "user_name=hoge"

Tips:変数の優先度

 上記のようにさまざまな方法で変数を定義できますが、変数名がぶつかった場合の優先度は以下の通りです(数字が小さい方が優先度高)。

  1. --extra-varsでの指定
  2. include時の指定
  3. vars_filesでのファイルからの読み込み
  4. vars_promptでの定義
  5. varsでの定義
  6. hosts_varsでの定義
  7. group_varsでの定義
  8. インベントリファイルのホストごとの定義
  9. インベントリファイルのグループごとの定義
       1|2|3|4 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。