Ansible などの IaC (Infrastructure as Code) では、yml 形式のファイルが設定書そのものであり、従来のExcel形式の設定書は廃止してしまうことが究極の理想形です。
しかし、パラメータを決定するのがクライアントである場合には、 Excel 形式の設定書に書いてもらうのが現実的です。
ここでは、Excel形式の設定書に書かれたパラメータを、Ansible で扱える変数に変換する方法を説明します。
全体の流れは次のようになります。
- Excel を csv ファイルに変換
- csv ファイルを Ansible ホスト変数に変換
- Ansible でホスト変数をターゲットに適用する。
1. Excel を csv に変換
Excelの設定書は以下のような形式にします。
A | B | C | D | |
1 | ansible_ip | param1 | param2 | param3 |
2 | 192.168.1.1 | x1 | y1 | z1 |
3 | 192.168.1.2 | x2 | y2 | z2 |
1行目が、パラメータの名前です。
ansible_ip パラメータは各ターゲットサーバーの IP アドレスで、2行目以降に各ターゲットサーバーのパラメータを1行ずつ書いています。
ターゲット 192.168.1.1 のパラメータが、
- ansible_ip = 192.168.1.1
- param1 = x1
- param2 = y1
- param3 = z1
ターゲット 192.168.1.2 のパラメータが、
- ansible_ip = 192.168.1.2
- param1 = x2
- param2 = y2
- param3 = z2
これを、csv形式で保存します。ここでは、parameter.csv とします。
2. csv ファイルを Ansible ホスト変数に変換
下の記事で書いた通り、host_vars ディレクトリ (名前は固定) の下の [ホスト名 or IP アドレス] ファイルでは、そのホストのみに適用される変数 (ホスト変数) が定義されます。
>> Ansible のおすすめディレクトリ構造・変数の設定
下の Playbook で、parameter.csv から 192.168.1.1 と 192.168.1.2 のホスト変数ファイルを作成します。
---
- name: Create host_vars files (yml) from csv
hosts: localhost
tasks:
- name: read csv file
read_csv:
path: parameter.csv
register: parameters
delegate_to: localhost
- name: Delete existing host_vars files
file:
path: ~/ansible/project01/host_vars/{{ item.ansible_ip }}.yml
state: absent
loop:
"{{ parameters.list }}"
- name: Ensure file already exists at host_vars files to work around 'invalid selinux context' issue
file:
path: ~/ansible/project01/host_vars/{{ item.ansible_ip }}.yml
state: touch
loop:
"{{ parameters.list }}"
- name: Create host_vars files (yml)
blockinfile:
marker: "# {mark} Parameters from csv"
block: "{{ root | to_nice_yaml }}"
path: ~/ansible/project01/host_vars/{{ item.ansible_ip }}.yml
vars:
root:
"{{ item }}"
loop:
"{{ parameters.list }}"
この Playbook を csv2yml.yml として parameter.csv と同じ場所に保存し、csv2yml.yml を実行することで、project01 の host_vars に、ホスト変数を生成します。
ansible-playbook csv2yml.yml
生成されたホスト変数 host_vars/192.168.1.1 の中身は次のようになります。
# BEGIN Parameters from csv
ansible_ip: 192.168.1.1
param1: x1
param2: y1
param3: z1
# END Parameters from csv
19~24行目で、一旦、空のファイルを作成することで、「invalid selinux context」のエラーを回避しています。
- name: Ensure file already exists at host_vars files to work around 'invalid selinux context' issue
file:
path: ~/ansible/project01/host_vars/{{ item.ansible_ip }}.yml
state: touch
loop:
"{{ parameters.list }}"
また、yml ファイルへの出力には、blockinfile モジュールを使用しています。
blockinfile:
marker: "# {mark} Parameters from csv"
block: "{{ root | to_nice_yaml }}"
path: ~/ansible/project01/host_vars/{{ item.ansible_ip }}.yml
これにより、例えば、後から 192.168.1.1 ファイルに手動で変数を追加する場合、「#BEGIN Parameters from csv」~「#END Parameters from csv」の外側に定義しておけば、csv2yml.yml を複数回実行した場合でも、影響は受けません。
# BEGIN Parameters from csv
ansible_ip: 192.168.1.1
param1: x1
param2: y1
param3: z1
# END Parameters from csv
custom_param: xx1 ← csv2yml.yml を複数回実行しても、ここは残る。
3. Ansible でホスト変数をターゲットに適用する
以上のようににホスト変数を生成することで、下の記事で書いた通り、project01 の各ターゲット用の変数として使用することができます。
>> Ansible のおすすめディレクトリ構造・変数の設定
以上、Excel の設定書を Ansible の変数として使用する方法でした。