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
インベントリーは以下のように指定しています。[allservers:children]
localservers
[localservers:children]
localserver
[localserver]
127.0.0.1
次にそれぞれのディレクトリの役割を紹介していきます。
group_vars
inventories/{環境}ディレクトリの中にあるgroup_varsディレクトリは、読み込んだhostsファイルにて記述したセクション単位で適用する変数を設定することが可能です。
またファイル名をall.ymlにするとグループ関係無く全てのグループに変数定義が適用されます。
まずは、今回はlocal環境のみに接続をするので、以下のように指定してみます。---
#------------------------------------------
# 環境
#------------------------------------------
ENV: "local"
roles
rolesディレクトリは、実際にplaybookコマンドで実行する処理単位で記述したファイル群を管理するディレクトリです。
このタスクの中でshellスクリプトを実行したり、各種ansibleの標準モジュールを使ってサーバー操作をしていく事になります。
今回はサンプルとして、shellを実行するplaybook及びタスクを以下のように記述してみます。---
- hosts: allservers
roles:
- echo/hello- 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及びタスクは以下のようになります。---
- hosts: allservers
roles:
- files/copy
- synchronize/copy- name: Copy
copy:
src={{ ENV }}/sample/file.json
dest=temporaries/{{ ENV }}/files/sample/file.json- name: Synchronize
synchronize:
src: "{{ ENV }}/sample"
dest: "temporaries/{{ ENV }}/synchronize"
実際に実行してみましょう。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及びタスクは以下のようになります。---
- hosts: allservers
roles:
- templates/copy- name: Template
template:
src: "{{ ENV }}/sample/file.j2"
dest: "temporaries/{{ ENV }}/templates/sample/file.json"{
"name": "{{ USER.NAME }}",
"from": "templates"
}
このタスク用にlocalserverグループ用group_vars変数も追加します。
---
#------------------------------------------
# ユーザー
#------------------------------------------
USER:
NAME: Ansibleでは、実際に実行してみましょう。ansible-playbook -i inventories/local/hosts templates.yml --connection=local└── temporaries
└── local
└── templates
└── sample
└── file.json{
"name": "Ansible",
"from": "templates"
}
正常に変数が置換された上でコピーされていますね。
終わりに
今回はgroup_vars/roles/files/templatesディレクトリの動きについてご紹介しました。
こちらのディレクトリ構造をうまく使えばより効率的なAnsible構成を実現することが可能になりますので、是非参考にしてみてください。
