Ansibleとは
今更ながら業務で使用したのでメモ
概要
Ansibleとはインフラ構成管理ソフトウェアである。
Infrastructure as a Code
(コードによるインフラ)として、Chef, Puppet, itamaeなどと同等のものである。
ソフトウェアはpythonで実装され、Yamlを使用しシンプルに設定を記述する事ができる。
公式ドキュメント
仕組み
Ansibleでは決まったディレクトリから情報を自動的に取得してくるため依存関係を理解しておく必要がある。 この仕組みがどのように動作するのか、しっかりと理解しておく事。
inventory
対象ホスト一覧が記述されたファイル。staging, productionなどとステージを分けてinventoryを用意する事ができ、
stg/inventory
, prod/inventory
などと管理できる。
Playbook
リモートサーバの状態を定義したYaml
Playbookの書き方
- hosts
- 対象ホストとなるグループを定義
- become
- root権限で実行するかどうか。デフォルトはrootユーザーになるため変更したい場合は
become_user
も定義する
- root権限で実行するかどうか。デフォルトはrootユーザーになるため変更したい場合は
- become_user
- root権限を実行するユーザー
- vars
- 変数の宣言。
setupモジュール
のようにAnsibleがデフォルトで宣言している変数もある。
- 変数の宣言。
- vars_prompt
- コマンドプロントからの入力値を変数にセットする。パスワードやデプロイリリースversionなどを入力値から受け取るなどする場合に使用する。
入力された内容を表示/非表示にする
private
オプションもある
- コマンドプロントからの入力値を変数にセットする。パスワードやデプロイリリースversionなどを入力値から受け取るなどする場合に使用する。
入力された内容を表示/非表示にする
- tasks
- roleで実行されるtask定義。
main.yml
が読み込まれ、残りのファイルはmain.ymlからincludeされる
- roleで実行されるtask定義。
- with_items
- 対象ユーザー一覧、対象ホスト一覧などのリストにまとめて繰り返し処理を行いたい場合などに使用する。1つ1つ似たようなタスクを記述する場合に簡潔に記述できる。
- with_dict
with_items
がリスト構造の繰り返しに対して、with_dict
はマップ定義された情報を繰り返し処理する場合に使用する。
- when
- block
- 複数のタスクに同一条件を
when
で記述すると記述が冗長になってしまうため、blockを使用し条件判定を一箇所にする事が出来る。
- 複数のタスクに同一条件を
Module
Module
とはユーザーを追加する、ファイルをコピーする、httpd・redis-serverなどサービスを管理する、任意のshellを実行する、などの冪等性を持った操作をする機能。
こういった便利なモジュールがあらかじめたくさん用意されている。
どんなModuleがあるかは公式ドキュメントを読む事。
冪等性
Ansibleでは冪等性(べきとうせい)といって、リモートホストの状態を一定に保つためのポリシーが特徴として挙げられる。 原則としてPlaybookは繰り返し実行してもリモートホストの状態が変更されないように記述する
Role
RoleとはPlaybookで読み込むモジュール。Playbookは複数のRoleを読み込むことができ、
構成する内容を適切な粒度のRoleに分割してインクルードする形でPlaybookを構成するのが良い
Roleには推奨ディレクトリ構成
という指針がある。
Roleディレクトリ構成
Roleディレクトリの推奨構成は以下のようになっている。 この命名ルールに従う事でRoleを実行時に自動でtasks, varsなどがincludeされ実行される。 vars, defaultsは共に変数を宣言するものであるが、共通の変数はdefaultsに記述し、ここの変数はvarsに記述出来る。 同じ変数宣言がある場合は、varsが優先的に使用される。
filesはcopyモジュールを使用した際に、files配下に配置したファイルをパス指定なしにファイル名のみで利用できる。
roles/ - {ロール名}/ - tasks/ - main.yml - vars/ - main.yml - defaults/ - main.yml - files/
Roleの実行
Roleを実行する場合は、tasksディレククティブではなくrolesディレクティブでRole名を記述し実行する。
Roleの構成
- vars_files
- vars.ymlなどに変数宣言を分割管理出来る
- include
- includeを使用すると、user_add.yml, copy_file.ymlなどとタスク定義を分割管理出来る。これにより汎用的なタスクを再利用出来る。 includeしたファイルに変数をセットする事も可能
Ansible Galaxy
Ansible Galaxyとは、Ansibleコミュニティによって色々なRoleが公開されているサイト
debug Module
debug出力用のmodule
- debug: msg: "{{ var1 }}"
ansible-playbookコマンドには-v
オプションが存在する。
-vv
,-vvv
まであり、verboseが多いほど詳細な実行ログを出力する。
用語
- group
- inventoryはgroup化できる
- 例: web, batch, db, web-resourceなど
- inventoryはgroup化できる
- all group
- 対象グループ全て
- :children
- groupの中でさらにgroup分けができる。
- targets.yml