本連載では、「マニュアルやシェルスクリプトを使ったサーバ管理に課題を持つ方」を対象に、Ansibleの基本的な使い方を紹介。今回は、プレイブックを再利用しやすくするための機能と、「ロール」と呼ばれる推奨ディレクトリ構成、共有サービスAnsible Galaxyの使い方を紹介します。
「マニュアルやシェルスクリプトを使ったサーバ管理に課題を持つ方」を対象に、Ansibleの基本的な使い方を紹介する本連載「Ansibleで始めるサーバ作業自動化入門」。前回の「Ansibleを効果的に使うのに欠かせないPlaybookの基本的な書き方まとめ」は変数の利用や条件分岐といったAnsibleのプレイブック作成に欠かせない基本的な機能を説明しました。
今回はより良いプレイブックを作成するため、プレイブックを再利用しやすくするための機能と、「ロール」と呼ばれる推奨ディレクトリ構成を紹介します。
また、ロールを知ることで、全世界のAnsibleユーザーがプレイブックを共有する「Ansible Galaxy」というコミュニティを利用できるようになります。Ansible Galaxyから目的の処理を行うためのプレイブックを見つけられれば、自分でプレイブックを作成する手間が少なくなります。
このAnsible Galaxyの基本的な使い方と、自作のプレイブックを登録する手順も後半に紹介します。
連載の前回では、変数やタスクを全て、1つのプレイブックに書いていました。しかし、これでは変数の値だけ変えたい場合でも、完成したプレイブックを書き換えなければなりません。また、巨大なプレイブックは単純に読みづらくなります。そのため、適切な単位でプレイブックを分割する必要があります。
まずは、変数を別ファイルに外出しする方法を紹介します。以下は前回の記事で使った修正前のプレイブックです。
- 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 }}/
変数を別ファイルに外出しできたように、タスクについても別ファイルに外出しできます。これにより、いくつかの意味のある固まりの処理をつなげてプレイブックを作ることができます。
今回は先ほどのプレイブックのuserモジュールとcopyモジュールの実行をそれぞれ別ファイルから参照するようにしてみます。
まず、変数を別ファイルに外出しした場合と同様に、適当なファイルを作成し、タスク定義部の内容を移します。今回はadd_user.ymlとcopy_file.ymlの2つのファイルを作成しました。
それぞれのファイルの中身は以下の通りです。
- user: name={{ user_name }}
- copy: src= /home/foo/bar.txt dest=/home/{{ user_name }}/
そして、最初のプレイブックで「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を使ってタスクを利用する際、引数として「変数名=値」を渡すことで、個別に変数の値を指定できます。これにより、以下のように同一タスクを異なる変数で実行することなどが可能です。
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"
上記のようにさまざまな方法で変数を定義できますが、変数名がぶつかった場合の優先度は以下の通りです(数字が小さい方が優先度高)。
Copyright © ITmedia, Inc. All Rights Reserved.