Ansible理解した(再)

概要

Ansibleは、宣言的な記述をもとに対象サーバの状態を整えるための構成管理ツール。
yamlで記述する。

構成要素

  • Playbook
    Playの集合体で、どのPlayをどの順番で実行するかを記述する。

  • Play
    対象のホスト(またはホストグループ)に対して実行するタスクやRoleの集合を定義する。ここで「どのホストにどの処理を実行するか」が決まる。

  • Task
    実際の操作単位で、Ansibleの各モジュールを呼び出す命令。つまり、Taskはモジュールを実行するための設定(引数やオプションなど)を記述したもの。
    → モジュールはTaskが実行する実体という位置づけ。

  • Module
    タスクで呼び出される実際の処理コード。ファイル操作やサービスの起動など、システムに対する具体的な操作を担う。

  • Handler
    基本はTaskと同じ形式だが、Taskが「変更」を検知した場合にのみ実行される特殊なTask。たとえば、設定ファイル変更後のサービス再起動など。

  • Role
    単なるTaskの集合だけでなく、Task以外にもハンドラー、変数、テンプレート、ファイルなどをまとめた再利用可能な構成要素。複数のPlaybook間で同じ処理を簡単に共有できるようにするための仕組み。

  • Inventory
    管理対象のホストやホストグループを定義するファイル。Playbookの実行対象を決定する。

実際の運用の話

Playbookの運用

  • playbook.ymlを用意することが多い。
    • このplaybook.ymlを実行することで、システム全体が定義した状態になるようにPlayを記述しておく。
      • とりあえずこれを実行すれば、コード=システムの状態を達成できるような作り。→冪等性の担保によるもの。
  • playbooks/配下にplaybook.ymlを用意することがある。
    • 単発で実行するやつ。
      • 例: システムの停止起動を複数台に対してまとめて実行するsystem-reboot.ymlとか

Roleの運用

  • 使いまわせるように、Roleだけを切り出して別のリポジトリとするのがベストプラクティスっぽい(要参考文献)
    • 例: logrotateの設定を入れるRoleを単一のリポジトリとすることで、別のシステムのplaybookから参照できるようにする
    • どうやってPlaybookのリポジトリからRoleを参照するのか?→ansible-galaxy install

ansible-galaxy

  • Roleにはコミュニティによって作成・公開されているものがある。
  • ansible-galaxy install -r requirements.yml で、requirements.ymlに記載したRoleのリポジトリをダウンロードし利用できるようになる。
    • Macの場合、デフォルトでは~./ansible/roles/
  • コミュニティのものだけでなく、GitHubのオーガニゼーションにある非公開リポジトリなんかも指定できる。
    • リモートリポジトリとバージョンを指定する仕組み。
      • Roleの改修をPlaybookでテストするには、バージョンタグつけてリリース→ansible-galaxy installの手順を踏むことになる。