Ansible: Excel 設定書からのリモート実行

Ansible などの IaC (Infrastructure as Code) では、yml 形式のファイルが設定書そのものであり、従来のExcel形式の設定書は廃止してしまうことが究極の理想形です。
しかし、パラメータを決定するのがクライアントである場合には、 Excel 形式の設定書に書いてもらうのが現実的です。
ここでは、Excel形式の設定書に書かれたパラメータを、Ansible で扱える変数に変換する方法を説明します。

全体の流れは次のようになります。

  1. Excel を csv ファイルに変換
  2. csv ファイルを Ansible ホスト変数に変換
  3. Ansible でホスト変数をターゲットに適用する。

1. Excel を csv に変換

Excelの設定書は以下のような形式にします。

ABCD
1ansible_ipparam1param2param3
2192.168.1.1x1y1z1
3192.168.1.2x2y2z2

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 の変数として使用する方法でした。