AnsibleでCisco IOSの機器のホスト名を大文字に統一する

# 1. はじめに
そういう時があるかどうかは分かりませんが、多数のネットワーク機器を導入していて、なぜかホスト名の大文字小文字が統一されておらず、それを大文字に統一して設定したい、ということにします。

1台ずつ手作業で再設定するのは大変なので、TeraTermマクロで自動化してもよいのですが、せっかくAnsibleにネットワーク機器対応のモジュールがあるので、AnsibleでCiscoの機器に対して大文字統一化やってみることにします。

# 2. Playbookの作成
以下のようなPlaybookを作成します。
ポイントは★で示した、jinja2のフィルタでコンフィグからhostnameを抽出して`upper`で大文字に変換するところです。

```yaml:upper_hostname.yml
---
- hosts: cisco  # インベントリファイルで 192.168.1.1（とりあえず1台）を[cisco]グループで定義済み
  gather_facts: no
  connection: local

  tasks:
    - name: show running-config   # runnning-config を取得するタスク
      ios_command:
        commands:
          - show running-config   # コマンドを実行
        provider: "{{ cli }}"
      register: result

    - name: get hostname          # running-configからホスト名を取得して大文字にしてからファクトに保存しておく
      set_fact: hostname_upper="{{ result.stdout[0] | regex_search('hostname (.+)', '\\1') | first | upper }}"   # ★

    - name: DEBUG                   # 大文字変換したホスト名をデバッグ表示
      debug: var=hostname_upper

    - name : set hostname to upper  # 大文字変換したホスト名で再設定する
      ios_config:
        lines:
          - hostname {{ hostname_upper }}
        provider: "{{ cli }}"
      notify: save config           # 変更があったら以下で定義するhandler「save config」を呼び出す
      register: result

    - name: DEBUG
      debug: var=result

  handlers:
    - name: save config             # コンフィグを保存する
      ios_command:
        commands:
          - write memory
        provider: "{{ cli }}"
      register: result
    - name: DEBUG
      debug: var=result

  vars:
    cli:   # 認証情報を定義しておく
      host:     "{{ inventory_hostname }}"
      username: "{{ ansible_user }}"
      password: "{{ ansible_password }}"
      authorize: true
      auth_pass: "{{ cisco_enable_secret }}"

```


# 3.Playbookの実行
## 3.1. 事前確認
実行前に現在のホスト名を確認します。現在は小文字の「switch-01」です。

```text:事前確認
switch-01#sh run | inc hostname
hostname switch-01
```

## 3.2 Playbookの実行

Playbookを実行します。

```text:Playbookの実行
user@ubuntu-vm:/etc/ansible$ ansible-playbook upper_hostname.yml

PLAY [cisco] *******************************************************************

TASK [show running-config] *****************************************************
ok: [192.168.1.1]

TASK [get hostname] ************************************************************
ok: [192.168.1.1]

TASK [DEBUG] *******************************************************************
ok: [192.168.1.1] => {
    "hostname_upper": "SWITCH-01"         # 大文字変換後のホスト名
}

TASK [set hostname to upper] ***************************************************
changed: [192.168.1.1]

TASK [DEBUG] *******************************************************************
ok: [192.168.1.1] => {
    "result": {
        "changed": true,
        "responses": [
            ""
        ],
        "updates": [
            "hostname SWITCH-01"          # 実行されたコマンド
        ]
    }
}

RUNNING HANDLER [save config] **************************************************
ok: [192.168.1.1]

PLAY RECAP *********************************************************************
192.168.1.1               : ok=6    changed=1    unreachable=0    failed=0
```
正常に実行されたようです。

## 3.3 事後確認
実行後のホスト名を確認します。

```text:事後確認
SWITCH-01#sh run | inc hostname
hostname SWITCH-01
```

無事に大文字になりました。
なお、この状態で、もう一度Playbookを実行すると、すでにホスト名が大文字に
なっているため、`hostname`コマンドは実行されず、コンフィグの保存コマンドも
実行されません

```text:再実行時結果の抜粋
(省略)
PLAY RECAP *********************************************************************
192.168.1.13               : ok=5    changed=0    unreachable=0    failed=0
```

# 4. [応用] 小文字に統一したい場合
大文字ではなく小文字に統一する場合は、Playbook中の
`| upper `の部分を`| lower `にします。


```