AnsibleでExcelファイルからパラメータを抽出する

# はじめに
AnsibleにはCSVファイルのパラメータをリスト/辞書データとして抽出できる[read_csvモジュール](https://docs.ansible.com/ansible/latest/modules/read_csv_module.html)が存在します。
一方、Excelファイルから抽出できるモジュールは公式には無いのですが、GitHubにmamullen13316さんが公開している`xls_to_facts`モジュールがあったので試してみました。

[GitHub - mamullen13316/ansible_xls_to_facts](https://github.com/mamullen13316/ansible_xls_to_facts)

# 使い方

- openpyxlをインストール
  
```
$ sudo pip install openpyxl
```

- [こちら](https://qiita.com/tech_kitara/items/be06704807bf03d57d48#%E4%BD%BF%E3%81%84%E6%96%B9)を参考に、GitHubからのデータ取得、モジュールの格納、パスの追加を実施


# Playbook

- タスク(1)  
`xls_to_facts`モジュールの`src`アーギュメントで、Excelファイルの格納先を指定。  
今回は、GitHub上の[サンプル](https://github.com/mamullen13316/ansible_xls_to_facts/blob/master/example.xlsx)を使わせて頂きました。
- タスク(2)  
全データを表示。
- タスク(3)  
`json_query`フィルターを使い、ホスト名`Switch-1`の管理IPアドレスを表示。

```yml:playbook_xls_to_facts1.yml
---

- hosts: localhost
  gather_facts: no
  connection: local

  tasks:
    - name: read excel spreadsheet and return facts   # (1)
      xls_to_facts:
        src: example.xlsx
      register: result

    - name: display all facts   # (2)
      debug:
        msg: "{{ result }}"

    - name: display the ip address of specific hostname   # (3)
      debug:
        msg: "{{ result | json_query('ansible_facts.spreadsheet_Sheet1[?Hostname==`Switch-1`].Mgmt_ip') }}"
```

# 実行結果
タスク(2)を見ると、Excelの各シートのパラメータが`spreadsheet_{シート名}`の値として出力されています。
またタスク(3)で想定通り`Switch-1`の管理IPアドレスが表示されました。

```
$ ansible-playbook playbook_xls_to_facts1.yml 
 [WARNING]: provided hosts list is empty, only localhost is available. Note that the
implicit localhost does not match 'all'


PLAY [localhost] ***************************************************************************

TASK [read excel spreadsheet and return a list] ********************************************
ok: [localhost]

TASK [display all facts] *******************************************************************
ok: [localhost] => {
    "msg": {
        "ansible_facts": {
            "spreadsheet_Sheet1": [
                {
                    "Hostname": "Switch-1",
                    "Mgmt_ip": "10.0.0.1"
                },
                {
                    "Hostname": "Switch-2",
                    "Mgmt_ip": "10.0.0.2"
                },
                {
                    "Hostname": "Switch-3",
                    "Mgmt_ip": "10.0.0.3"
                }
            ],
            "spreadsheet_Sheet2": [
                {
                    "Description": "To Spine-1",
                    "Interface": "Ethernet1/1",
                    "Interface_IP": "192.168.100.1/30"
                },
                {
                    "Description": "To Spine-2",
                    "Interface": "Ethernet1/2",
                    "Interface_IP": "192.168.100.5/30"
                }
            ]
        },
        "changed": false,
        "failed": false
    }
}

TASK [display the ip address of specific hostname] *****************************************
ok: [localhost] => {
    "msg": [
        "10.0.0.1"
    ]
}

PLAY RECAP *********************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
```