栗ブ

筋トレが好きなWebエンジニアのアウトプット。読書感想やクソポエムなど

Ansibleとは

今更ながら業務で使用したのでメモ

概要

Ansibleとはインフラ構成管理ソフトウェアである。 Infrastructure as a Code(コードによるインフラ)として、Chef, Puppet, itamaeなどと同等のものである。 ソフトウェアはpythonで実装され、Yamlを使用しシンプルに設定を記述する事ができる。

公式ドキュメント

https://docs.ansible.com/

仕組み

Ansibleでは決まったディレクトリから情報を自動的に取得してくるため依存関係を理解しておく必要がある。 この仕組みがどのように動作するのか、しっかりと理解しておく事。

inventory

対象ホスト一覧が記述されたファイル。staging, productionなどとステージを分けてinventoryを用意する事ができ、 stg/inventory, prod/inventoryなどと管理できる。

Playbook

リモートサーバの状態を定義したYaml

Playbookの書き方

  • hosts
    • 対象ホストとなるグループを定義
  • become
    • root権限で実行するかどうか。デフォルトはrootユーザーになるため変更したい場合はbecome_userも定義する
  • become_user
    • root権限を実行するユーザー
  • vars
    • 変数の宣言。setupモジュールのようにAnsibleがデフォルトで宣言している変数もある。
  • vars_prompt
    • コマンドプロントからの入力値を変数にセットする。パスワードやデプロイリリースversionなどを入力値から受け取るなどする場合に使用する。 入力された内容を表示/非表示にするprivateオプションもある
  • tasks
    • roleで実行されるtask定義。 main.ymlが読み込まれ、残りのファイルはmain.ymlからincludeされる
  • with_items
    • 対象ユーザー一覧、対象ホスト一覧などのリストにまとめて繰り返し処理を行いたい場合などに使用する。1つ1つ似たようなタスクを記述する場合に簡潔に記述できる。
  • with_dict
    • with_itemsがリスト構造の繰り返しに対して、with_dictはマップ定義された情報を繰り返し処理する場合に使用する。
  • when
    • 特定条件のみ実行したい場合に定義するif制御構文。例: OSがCentOSだったら?、Ubuntuだったら?など。
  • 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など
  • all group
    • 対象グループ全て
  • :children
    • groupの中でさらにgroup分けができる。
  • targets.yml

参考サイト