Ansibleを用いて具体的な処理を実施するうえで欠かせないのが、処理内容を記載する「Ansible Playbook (プレイブック)」です。以下では、Playbookについての概要とその書き方の基礎についてお伝えいたします。
プレイブック概要
プレイブックについてご説明する前に、まずはAnsibleがどのように動作しているか、改めて確認してみましょう。
Ansibleの実行順序は以下の通りです。
(1)インベントリからホストパターンに合うターゲットノードをリストアップする
(2)コントロールノードで、プレイブックをPython実行コードに変換する
(3)コントロールノードからターゲットノードにSSH接続を確立、SFTPでPythonの実行コードを送信する
(4)ターゲットノードで、Pythonの実行コードを実行し、処理した出力結果をコントロールノードに返す
(5)コントロールノード、ターゲットノードにある、Python実行コードを削除する
上記で、Ansibleに対して「こうした順番で、このような処理を行ってください」と伝えるのがプレイブックの役割です。具体的には、処理内容をYAML (.yml) で記載し、上記(2)にある通り、Pythonのコードに変換されて実行されます。なお、ネットワークモジュールなど一部のモジュールの場合は、ターゲットノードではなくコントロールノードでPyhonの実行コードが実行されます。
ちなみにYAMLは、最小限の構文で構成されているデータフォーマットで、そして多くのプログラミング言語に対応していることから、Ansible以外でも幅広く利用されています。例えば、コンテナ管理・デプロイの自動化などで用いられるKubernetesのリソースとデプロイメントにもYAMLを用いています。
このように、Ansibleにおいてプレイブックは処理実行の中核ともいえる役割があります。
プレイブックの書き方
次に、プレイブックの構成を理解したうえで、どのように書くかについて要約して解説します。
なおプレイブックでは、インデントと改行を利用して構造を表現する「ブロックスタイル」と、{ } や [ ] などを用いる「フロースタイル」を利用できますが、一般的には可読性の高いブロックスタイルが用いられます。以下の解説は、全てブロックスタイルとなります。
では、以下で全体の構成について解説します。
上記画像は、プレイブック全体を記述したものですが、「Play」が2つ存在します。1Playとは、一つのターゲット(hosts)に対する全ての処理を記載したものです。
1つのプレイブックで、複数のターゲットに対して処理を実施したい場合は、ターゲットごとに「Play」を別に記載する必要があります。上記では、hosts: all と、hosts: webserversに対して、それぞれ別なPlayで処理が記載されています。
では続いて、各セクションを見ていきましょう。
処理開始
はじめに、ブロックスタイルでは
--- (ハイフン3つ)
で開始します。
Targetsセクション
Targetsセクションは、処理を実施するターゲットノードの接続に関する情報を定義します。上記では、それぞれ別なPlayにおいて、hosts: all と、hosts: webserversがTargetsセクションに記載されています。
Varsセクション
Varsセクションは、タスクを効率化するための変数を定義します。プレイ変数と呼ばれ、以下の3つのディレクティブを用いて定義します。
- vars
- 基本の変数の定義
- vars_files
- 変数を定義した外部のYAMLファイルの複数読み込み実施
- vars_prompt
- 変数をユーザーに問い合わせ、対話入力させる。パスワードの 入力や、実行環境により異なる変数を用いる場合など。
なお、変数はVarsセクション以外でも利用可能です。
Tasksセクション
Tasksセクションには、実施したい処理内容をリストで定義します。タスクはリストの上から順番に実行されます。このため、実施したい処理を上から順番に正しく記載する必要があります。
Handlersセクション
Handlersセクションは、Tasksセクションで「notify」が指定されたタスクが更新された場合のみ実行されるセクションです。
Handlersセクションも、Tasksセクションと同様に、実行したい処理内容をリストで定義します。
ロールを用いたプレイブックの管理
Ansibleを大規模な環境で複雑な処理を実施する場合、1つのプレイブックにすべての処理を記述すると、プレイブックが肥大化して、運用管理面、または可読性の面で悪影響があります。そこで、「ロール」を用いることでこうした問題を管理できます。
ロールとは、プレイブックを複数に分割し、別のファイルとして実行・管理できる仕組みのことです。上記画像の例では、「varsセクション」「tasksセクション」「handlersセクション」をそれぞれ別のプレイブック(別のYAMLファイル)とした上で、別々の場所に保管しています。
プレイブック作成・管理における注意点
Ansibleは 、YAMLベースのプレイブックを用いて、読みやすい構文で作成できる非常にシンプルかつ強力なソリューションです。この強みを損なうことなく活用するためには、プレイブック作成において注意すべき点があります。以下では、基本中の基本である3つのポイントを紹介します。
(1)作成者以外でも読めるようにする
組織内でAnsibleに関わるどのメンバーがプレイブックを見ても、内容を理解できるように可読性を高める必要があります。具体的には、YAML作成時のルール(タスク名、変数名、インデント数など)を決めておくべきでしょう。
(2)肥大化させない
1つの大きく複雑なプレイブックを作るのではなく、用途に応じてプレイブックを分割します。これにより、運用管理の効率化に加えて、エラー箇所の特定が容易になります。
(3)シンプルに書く
処理をできるだけ簡単に記述します。簡単に記述できる内容を、複雑な記述としないよう注意しましょう。
ネットワーク自動化サービス「Automation Coordinator」
お客様ごとの最適な業務プロセスコンサルティングを含めたAnsibleによる自動化の導入(実際の運用)、ハイスキルなエンジニアによる並走型支援、クライアントワーク、チケットサポート、最終的にはお客様が自動化を自律して運用するためのスキル習得トレーニングまでをパッケージ化して提供するネットワーク運用の自動化支援サービスです。