最近,Ansibleを使うようになった.ちょうどAnsibleの解説本「Ansible完全読本」が,Kindle Unlimitedで公開されていたので読んでみた.インストール方法や使い方は省いて,今後ハマりそうな点だけをメモしておく.

  • 設定ファイルは,YAML形式に準拠して記述する. 配列や連想配列を扱う際は,基本的に一行に一要素を記述する. 配列は- ,連想配列はkey: を接頭辞として,要素をその後ろに続けて書く. 空白文字が入っていないと文法エラーになるので,注意する. 例外として,=を使って,連想配列を定義できるが,文法がバラバラになってしまうので,使わない方が良い.
  • 設定ファイルを編集し,その後デーモンを再起動したい場合は,Handlerを使う. Hanlderによって,デーモンが複数回再起動することを防げる.
  • サーバに依存する値を設定ファイルに埋め込みたい場合は,Jinja2モジュールを利用する. このとき,その設定ファイルの名前に,nginx.conf.j2のように,.j2を付与する.
  • 設定ファイルがAnsibleによって編集されたことを明示するために,設定ファイルの先頭にansible_managedをコメントとして,追加しておくと良い. これは,日付などに置換される.
  • 設定ファイルを編集する際に,backup: trueとしておくと,バックアップファイルを作成できる. また,validate: ...としておくと,設定ファイルの文法エラーによるデーモンの起動失敗を未然に防げる.
  • サーバの一覧は,Inventoryファイルとして管理する. Inventoryファイルには,静的Inventoryファイルと動的Inventoryファイルがあり, ファイルに実行権限が付与されているか否かによって解釈が決定する. 静的Inventoryファイルには,ホスト名をテキストで列挙する. 一方,動的Inventoryファイルはスクリプトとして記述し,実行時にホスト名を決定する. また,タスクによって,柔軟にInventoryを操作することもできる. これは,OpenStackのAPIを叩いて新規VMを作成,その後VMを初期化したい場合などに有用である.
  • ansible-playbookコマンドは,Playbookに明示されたタスクに先立って,暗黙的にsetupタスクを実行する. setupタスクは,OSの種類やホスト名などFactと呼ばれるサーバの情報する. 対象サーバがOpenStackやAWS EC2によって管理されている場合には,Factに付加情報を追加できる.
  • Version2以降では,Taskの一層外側にBlockという概念があり, Blockごとにtry,catchおよびfinaly処理のような例外処理を記述できる.
  • さらに,Blockの外側にRoleという概念がある. 基本的には,サービスごとに独立してRoleを管理するのが良い. また,Roleを集めたAnsible Galaxyと呼ばれるリポジトリがある.
  • 共通する処理を繰り返す場合は,with_itemsなどのwith*命令を利用する. ただ,with*命令は,種類が多いので,その都度検索するのが良いかもしれない.
  • 1つサーバでだけ実行したい処理やローカル実行したい処理には,例外的に,run_oncelocal_actionを利用する.
  • SSHの同時接続数は,forksオプションによって設定する(デフォルトは5).
  • Playbookは,step実行や特定tas実行を組み合わせて開発する. もし,既存のモジュールで不十分であれば,Pythonによってモジュールを自作できる.

ディレクトリ構造

サービスごとにRoleを作っていき,site.ymlから呼び出すという構成が良い. ディレクトリ構造が複雑になるので,テンプレートをダウンロードすると良いかもしれない.

site.yml            # Playbookファイル
hosts               # Inventoryファイル
roles/
  role_name/        # Role名
    tasks/
      main.yml      # Roleを構成するタスク
    handlers/
      main.yml      # ハンドラ
    vars/
      main.yml      # 上書きしない変数
    defaults/
      main.yml      # 上書きする変数
    meta/
      main.yml      # Roleの依存関係
    files/
      index.html    # Copyで転送するファイル
    templates/
      nginx.conf.j2 # Jinja2モジュールのテンプレート群