Ansibleで自動化ファイルを構成管理する

Ansibleで大規模な開発をするには、自動化するAnsibleのファイル自体を構成管理する必要があります。playbookを共通化して使うことで、基本パーツと応用パーツを組み合わせて、効率的な自動化を実現できます。複数のパーツを決まったルールに従って作っていくことで、パーツとパーツを組み合わせて応用していくことができれば、Ansibleをうまく使えている状態になります。本記事ではAnsibleの基本構成を簡単にまとめます。

Ansibleのインベントリーファイルを作成する

インベントリファイルで何に対して自動化を行うのか対象を定義できます。定義ファイルのデフォルトを設定することもできます。一度設定すると、今後コマンドを打たずして、省略してInventoryファイルを利用できます。

[defaults]
log_path = $HOME/.ansible/ansible.log
host_key_checking = False
retry_files_enabled = False
inventory = $HOME/inventory.ini

playbookの構成

playbookは大きく4つのセクションで、基本はTargetsセクションとTasksセクションのみ記述が必須です。
非常にシンプルな構成でわかりやすいですね。

・Targetsセクション:対象が何か明記します。jinja2ファイルを挟み動的に対象を指定することもできます。
・Tasksセクション:何をするか明記します。
・Varsセクション:変数を定義します。
・Handlersセクション:Tasksセクションで実行がうまく行った時のみ実行します。TasksのNameと合わせて名前をつける必要があります。

---
- name: name
  vars:[変数]
  tasks:[何をするか]
  targets:[対象]
  handlers:[タスクが成功した場合に実行]

playbookを作ってみる

<Fileモジュール> ディレクトリやファイルを作れます。

<templateモジュール> ファイルをコピーするモジュールです。

内部で変数を使うことができ、動的な動きができます。
Copyモジュールもありますが、動的なファイルコピーができるtemplateを使いこなした方が便利です。
Jinja2テンプレートファイルを作成する必要があります。

- name: Template a file, using symbolic modes (equivalent to 0644)
  template:
    src: group_sudoers.j2
    dest: /etc/sudoers.d/user01
    owner: root
    group: root
    mode: 0400
    validate: 'visudo -cf %s'

<block> タスクをまとめることができます。ルート権限でこのタスクをやりますと言うときに、便利です。

ansible -b -m authorized_key

ansibleコマンドで試せる。
-m authorized_key:ssh-keyの配布をやってくれる。

roleによるtasksのまとめ

roleを使うことでtasksを機能ごとにまとめられます。パーツをグループ化していくことで、自動化を管理してパーツを組み合わせて使えます。構成ファイルはansible-galaxyコマンドで一括で作成することができます。

ansible-galaxy init --init-path=roles common

コマンドを実行すると以下のようなディレクトリが作成されます。テンプレートとなるこの構成を理解することで、Ansibleの基本構成でコマンドを管理しやすくなります。

roles
`-- common
    |-- README.md
    |-- defaults
    |   `-- main.yml
    |-- files
    |-- handlers
    |   `-- main.yml
    |-- meta
    |   `-- main.yml
    |-- tasks
    |   `-- main.yml
    |-- templates
    |-- tests
    |   |-- inventory
    |   `-- test.yml
    `-- vars
        `-- main.yml

基本的な3階層モデルのWebサーバを自動化する場合は以下のようにcommon,application,mariadb,nginxのようにディレクトリを作成します。共通ディレクトリでサーバレベルのことを行い、上位レベルのプロセスのインストールをapplication,mariadb,nginxのディレクトリで定義することで、IPアドレスやパラメタータレベルのものを修正するのみで、3層モデルのウェブサーバを構築することができるようになります。

roles
|-- application
|   |-- README.md
|   |-- defaults
|   |   `-- main.yml
|   |-- files
|   |-- handlers
|   |   `-- main.yml
|   |-- meta
|   |   `-- main.yml
|   |-- tasks
|   |   `-- main.yml
|   |-- templates
|   |-- tests
|   |   |-- inventory
|   |   `-- test.yml
|   `-- vars
|       `-- main.yml
|-- common
|   |-- README.md
|   |-- defaults
|   |   `-- main.yml
|   |-- files
|   |-- handlers
|   |   `-- main.yml
|   |-- meta
|   |   `-- main.yml
|   |-- tasks
|   |   `-- main.yml
|   |-- templates
|   |   `-- hosts.j2
|   |-- tests
|   |   |-- inventory
|   |   `-- test.yml
|   `-- vars
|       `-- main.yml
|-- mariadb
|   |-- README.md
|   |-- defaults
|   |   `-- main.yml
|   |-- files
|   |-- handlers
|   |   `-- main.yml
|   |-- meta
|   |   `-- main.yml
|   |-- tasks
|   |   `-- main.yml
|   |-- templates
|   |-- tests
|   |   |-- inventory
|   |   `-- test.yml
|   `-- vars
|       `-- main.yml
`-- nginx
    |-- README.md
    |-- defaults
    |   `-- main.yml
    |-- files
    |-- handlers
    |   `-- main.yml
    |-- meta
    |   `-- main.yml
    |-- tasks
    |   `-- main.yml
    |-- templates
    |-- tests
    |   |-- inventory
    |   `-- test.yml
    `-- vars
        `-- main.yml

終わりに

自動化するAnsibleのファイルを構成管理する方法をご紹介しました。一度、自動化できるファイルを作成しておくと使いまわすことができて便利です。一時的なイベントサイトの構築や検証環境構築に役立たせることができると思います。是非、お試しください。