本連載では、「マニュアルやシェルスクリプトを使ったサーバ管理に課題を持つ方」を対象に、Ansibleの基本的な使い方を紹介。今回は、環境構築やリリース作業でよく使うモジュールについて、使い方とよく使う引数を紹介します。
「マニュアルやシェルスクリプトを使ったサーバ管理に課題を持つ方」を対象に、Ansibleの基本的な使い方を紹介する本連載「Ansibleで始めるサーバ作業自動化入門」。前回の「サーバ管理者も開発者も知っておきたい構成管理ツールとAnsibleの基礎知識」では、Ansibleのインストールと動作確認を行い、Ansibleの構成として、「インベントリ(Inventory)ファイル」で接続先ホストを指定し、「モジュール(Module)」を組み合わせて「プレイブック(Playbook)」と呼ばれる手順書を作成することを説明しました。
今回は、環境構築やリリース作業でよく使うモジュールについて、使い方とよく使う引数を紹介します。前回のプレイブックで利用したuserモジュールとcopyモジュールから見ていきましょう。
userモジュールはユーザーの追加や削除、所属グループの変更などを行います。userモジュールでは操作対象のユーザー名を指定する「user」引数が必須となります。
前回のプレイブックの例のように、「user」引数のみを指定した場合は指定したユーザー名のユーザーが追加された状態になります。また、ユーザーにパスワードを設定するには「password」引数を利用します。ただし、この引数にはパスワードを平文で書くことはできません。パスワードは暗号化した値を指定する必要があります。
今回はパスワードの暗号化に一般に使われている「SHA-512」というハッシュ関数を利用して暗号化する例を示します。SHA-512での暗号化は「Passlib」というPythonのライブラリを利用して行えます。
Passlibのインストールは「pip」というPythonのパッケージマネジャーを使って行えます。pipがインストールされていない場合、各OSのパッケージマネジャーからインストールしておいてください。CentOSであれば以下のコマンドでインストール可能です。
yum install python-pip
pipがインストールされていれば、以下のコマンドでPasslibがインストールできます。
pip install passlib
Passlibがインストールされたら、以下のコマンドを実行します。プロンプトに従いパスワードを入力すると、SHA-512でハッシュ化されたパスワードが表示されます。
python -c "from passlib.hash import sha512_crypt; import getpass; print sha512_crypt.encrypt(getpass.getpass())"
表示されたパスワードは以下のようにそのままプレイブックのpassword引数に指定できます。
tasks: - user: name=momo password=$6$rounds=656000$3Co6RKpfjN.qj23.
なお、新規にユーザーを追加する場合も、既存のユーザーのパスワードを更新する場合も同じく上記のプレイブックで対応できます。これは前回の連載でも触れましたが、Ansibleは冪等性を持ち、操作ではなく最終的な状態を指示するためです。
そのため、上記は「指定のユーザー名、パスワードを持つユーザーが存在するようにする」という意味のタスクになり、「既にユーザーが存在するかどうか」にかかわらず、同じ挙動となります。
userモジュールのその他の引数でよく使われるものは以下があります。
引数名 | 用途 | 記述例 |
---|---|---|
group | プライマリグループを指定 | group=wheel |
groups | サブグループを指定。カンマ区切りで複数指定可能 | groups=hoge,piyo |
state | ユーザーを追加された状態にする場合はpresent、ユーザーを存在しない状態にするにはabsentを指定(デフォルト値はpresent) | state=absent |
copyモジュールは管理ホストから被管理ホストへのファイルコピーを行います。copyモジュールはコピー元ファイルパスを表す「src」と、コピー先のファイルパスを表す「dest」引数が必須となります。
「src」で指定するコピー元ファイルパスは、プレイブックの位置から見た相対パス、絶対パスのどちらも指定可能です。もし「src」で指定したファイルパスが存在しない場合、copyモジュールの実行結果は失敗となります。
また、「src」にはファイル、ディレクトリのどちらも指定可能です。ディレクトリをコピーする場合、パスの末尾に「/」を追加することでディレクトリ内部のファイルのみをコピーできます。
なお、「dest」で指定するコピー先ファイルパスに対し存在しないディレクトリが含まれる場合、「src」で指定したものがファイルかディレクトリかで挙動が変化します。「src」にファイルを指定した場合、「dest」のパスに存在しないディレクトリがあると実行結果は失敗になります。一方、「src」にディレクトリを指定した場合は「dest」のパスに存在しないディレクトリがあっても自動で作成され、実行結果は失敗とはなりません。
copyモジュールの利用例は以下の通りです。
tasks: - name: 相対パス指定のファイルコピー copy: src=hoge.txt dest=/home/piyo/ - name: ディレクトリのコピー copy: src=/home/vagrant/fuga dest=/home/piyo/dest/ - name: ディレクトリの内部をコピー copy: src=/home/vagrant/fuga/ dest=/home/piyo/dest/
上記の例で「name」という要素をタスクに指定していますが、このように記述すると、プレイブックの実行時に以下のようにname要素で指定した値がタスクの名前として表示されます。
PLAY *********************************************************************** TASK [setup] **************************************************************** ok: [localhost] TASK [相対パス指定のファイルコピー] ***************************************** ok: [localhost]
プレイブックを作成する際はなるべくname要素を指定して何が行われているか分かりやすいようにしておいた方がよいでしょう。
もし「実行結果の表示を変えたくはないがプレイブックにコメントを残しておきたい」という場合は「#」を使うことで行末までをコメントとして扱えます。
copyモジュールの引数でよく使われるものは以下があります
引数名 | 意味 | 記述例 |
---|---|---|
backup | ファイルを上書きする際にバックアップを残すかどうか。yesを指定した場合、以下のような名称でバックアップが作成される(デフォルト値はno) piyo.txt.2016-05-02@22:26:57~ |
backup=yes |
owner | ファイルのオーナーを指定 | owner=foo |
group | ファイルのグループを指定 | group=foo |
mode | ファイルのパーミッションを指定 | mode=a+x |
remote_src | ファイルを被管理ホスト間でコピーするかどうかを指定。yesを指定した場合、srcで指定したファイルは被管理ホストのファイルが使われる(デフォルト値はno)※本記事執筆時点ではディレクトリのコピーはできず、ファイルコピーのみ可能 | remote_src=yes |
fetchモジュールは被管理ホストのファイルを取得して管理ホストに転送します。fetchモジュールでもcopyモジュールと同様に「src」「dest」引数が必須となります。「src」では被管理ホストの取得対象のファイルのパスを、「dest」では管理ホストの受信したファイルを保存するディレクトリのパスを指定します。
copyモジュールと異なり、「src」で指定したファイルが存在しない場合でもfetchモジュールは実行結果が失敗となりません。指定したファイルが存在しない場合に実行結果を失敗にしたい場合、「fail_on_missing」引数にyesを指定することでファイルがない場合にタスクを失敗させるようにできます。
また、本記事執筆時点では「src」で指定できるのはファイルのみとなっており、ディレクトリを指定して取得することはできません。ただし、ディレクトリ指定もいずれ対応予定とのことです。
fetchモジュールの利用例は以下の通りです。
tasks: - fetch: src=/home/piyo/fuga.txt dest=/home/vagrant/result/
fetchで受信したファイルについては、「dest」で指定したディレクトリ内に被管理ホストごとのディレクトリが作成され、そこに保存されます。上記のプレイブックを実行すると、管理ホストには以下のディレクトリ構成でファイルが受信されます。
/home/vagrant/result/{被管理ホスト名}/home/piyo/fuga.txt
serviceモジュールではサービスの起動、停止、自動実行の制御を行います。serviceモジュールは「name」引数と、「state」「enabled」のどちらかの引数が必須となります。
「name」引数では、httpdのような操作するサービス名を指定します。「state」はサービスの状態として以下の4つのいずれかを指定します。
値 | 用途 |
---|---|
started | もしサービスが停止していれば起動する |
stopped | もしサービスが起動していれば停止する |
restarted | 常にサービスを再起動する |
reloaded | 常にサービスの再読み込みをする |
「enabled」引数はyesを指定するとサービスの自動起動をONに、noを指定すると自動起動をOFFにできます。
serviceモジュールの利用例は以下の通りです。
tasks: - service: name=httpd state=restarted
shellモジュールは被管理ホストで任意のコマンドを実行できます。基本的には「shellモジュールは使わず、冪等性を持つ既存のモジュールを利用する」ことが望ましいですが、「既存のシェルスクリプトを使い回したい」というような場合はshellモジュールを使うことになるでしょう。
shellモジュールには必須となる引数はなく、以下のようにコンソールに書く場合と同じようにコマンドを記述でき、パイプやリダイレクトも行えます。
tasks: - shell: /home/piyo/hoge.sh > result.txt
なお、shellモジュールはコマンドの戻り値が0でない場合、タスクを失敗と見なします。戻り値が0以外でもタスクを成功として扱いたい場合の対応方法については次回の連載で扱います。
ここまで、特によく使うと思われるモジュール5つの使い方を紹介しましたがAnsibleには上記で説明した以外にも多数のモジュールがあります。全ては紹介しきれませんが、その他のモジュールで利用頻度が高いと思われるものを以下に記載します。
モジュール名 | 用途 | 記述例 |
---|---|---|
file | ファイルのオーナーやグループの設定、ファイル削除を行う | file: path=/home/piyo/fuga.sh mode=a+x |
get_url | 指定のURLからファイルをダウンロードする | get_url: url=http://releases.ansible.com/ansible/ansible-latest.tar.gz dest=/home/piyo/download / |
unarchive | 指定のファイルを解凍する | unarchive: src=/home/piyo/download/fuga.tar.gz dest=/home/piyo/unarchive/ |
yum | yumを使ってパッケージを管理する | yum: name=httpd state=latest |
apt | aptを使ってパッケージを管理する | apt: name=httpd state=latest |
Ansibleが用意しているモジュールの一覧と詳細な説明については「All Modules - Ansible Documentation」を参照してください。
次回は、プレイブックの作成に焦点を当て、変数、繰り返し実行、条件分岐といった基本的な機能を紹介します。お楽しみに。
2011年より、株式会社ビーブレイクシステムズに在籍。「あるべきものを、あるべき姿に」をモットーに、保守しやすいプログラムを書くため日々まい進中。
Copyright © ITmedia, Inc. All Rights Reserved.