Featured image of post 【失われしベストプラクティスを求めて】Ansibleでの特殊な動きをするディレクトリについて

【失われしベストプラクティスを求めて】Ansibleでの特殊な動きをするディレクトリについて

1640文字

Ansibleのディレクトリ構造

ちょっと複雑

Ansibleには、様々なディレクトリや設定ファイルが登場します。

とても便利なのですが、数が多いのでそれぞれの意味を理解するのが少し大変です。

なので今回はAnsibleで出てくる各種ディレクトリの用途についてまとめてみました。


roles内部にも似たようなディレクトリ構造を持つことが可能ですが、そちらはまた別の記事にてご紹介しようと思います

説明

前提

筆者の作業環境のAnsibleのバージョンは2.4.2.0となります。

全体像

まずは、以下のような構造で用意してみました。

ディレクトリ構造
.
├── echo.yml
├── files
│   └── local
│       └── sample
│           └── file.json
├── files.yml
├── handlers
│   └── apache
│       └── main.yml
├── inventories
│   └── local
│       ├── group_vars
│       │   ├── all.yml
│       │   └── localservers.yml
│       └── hosts
├── roles
│   ├── echo
│   │   └── hello
│   │       └── tasks
│   │           └── main.yml
│   ├── files
│   │   └── copy
│   │       └── tasks
│   │           └── main.yml
│   ├── synchronize
│   │   └── copy
│   │       └── tasks
│   │           └── main.yml
│   └── templates
│       └── copy
│           └── tasks
│               └── main.yml
├── synchronize.yml
├── templates
│   └── local
│       └── sample
│           └── file.j2
├── templates.yml
└── temporaries
    └── local
        ├── files
        │   └── sample
        │       └── file.json
        ├── synchronize
        │   └── sample
        │       └── file.json
        └── templates
            └── sample
                └── file.json

インベントリーは以下のように指定しています。

inventories/local/hosts
[allservers:children]
localservers

[localservers:children]
localserver

[localserver]
127.0.0.1

次にそれぞれのディレクトリの役割を紹介していきます。

[adsense]

group_vars

inventories/{環境}ディレクトリの中にあるgroup_varsディレクトリは、読み込んだhostsファイルにて記述したセクション単位で適用する変数を設定することが可能です。
またファイル名をall.ymlにするとグループ関係無く全てのグループに変数定義が適用されます。

まずは、今回はlocal環境のみに接続をするので、以下のように指定してみます。

inventories/local/group_vars/all.yml
---
#------------------------------------------
# 環境
#------------------------------------------
ENV: "local"

roles

rolesディレクトリは、実際にplaybookコマンドで実行する処理単位で記述したファイル群を管理するディレクトリです。
このタスクの中でshellスクリプトを実行したり、各種ansibleの標準モジュールを使ってサーバー操作をしていく事になります。
今回はサンプルとして、shellを実行するplaybook及びタスク以下のように記述してみます。

echo.yml
---
- hosts: allservers
  roles:
    - echo/hello
roles/echo/hello/tasks/main.yml
- name: Echo
  shell: echo 'Hello,World!!'
  register: result

- debug: var=result.stdout
  when: result | success
  tags:
    - always

files

filesディレクトリは主に、CopyモジュールSynchronizeモジュールを使って設定ファイル等をリモート先に配置する際のファイル群を管理するディレクトリです。Copyモジュールのsrc属性は自動的にこのfilesディレクトリの内部をデフォルトで参照します。
playbook及びタスク以下のようになります。

files.yml
---
- hosts: allservers
  roles:
    - files/copy
    - synchronize/copy

roles/files/copy/tasks/main.yml
- name: Copy
  copy:
    src={{ ENV }}/sample/file.json
    dest=temporaries/{{ ENV }}/files/sample/file.json

roles/synchronize/copy/tasks/main.yml
- name: Synchronize
  synchronize:
    src: "{{ ENV }}/sample"
    dest: "temporaries/{{ ENV }}/synchronize"

実際に実行してみましょう。

command
ansible-playbook  -i inventories/local/hosts files.yml --connection=local

結果
└── temporaries
    └── local
        ├── files
        │   └── sample
        │       └── file.json
        └── synchronize
            └── sample
                └── file.json


上記のように、正常にコピーされていると思います。。

templates

templatesディレクトリは主に、Templateモジュールを使って、ファイルの内容を動的に変えた上でリモート先に配置する際のテンプレートファイル群を管理するディレクトリです。Templateモジュールのsrc属性は自動的にこのtemplatesディレクトリの内部をデフォルトで参照します。
また、このテンプレートファイルはJinja2という形式になり、拡張子はj2となります。
playbook及びタスク以下のようになります。

templates.yml
---
- hosts: allservers
  roles:
    - templates/copy

roles/templates/copy/tasks/main.yml
- name: Template
  template:
    src: "{{ ENV }}/sample/file.j2"
    dest: "temporaries/{{ ENV }}/templates/sample/file.json"

templates/local/sample/file.j2
{
  "name": "{{ USER.NAME }}",
  "from": "templates"
}


このタスク用にlocalserverグループ用group_vars変数も追加します。

inventories/local/group_vars/localservers.yml
---
#------------------------------------------
# ユーザー
#------------------------------------------
USER:
  NAME: Ansible

では、実際に実行してみましょう。

command
ansible-playbook  -i inventories/local/hosts templates.yml --connection=local

結果
└── temporaries
    └── local
        └── templates
            └── sample
                └── file.json

temporaries/local/templates/sample/file.json
{
  "name": "Ansible",
  "from": "templates"
}

正常に変数が置換された上でコピーされていますね。

終わりに

今回はgroup_vars/roles/files/templatesディレクトリの動きについてご紹介しました。

こちらのディレクトリ構造をうまく使えばより効率的なAnsible構成を実現することが可能になりますので、是非参考にしてみてください。