Ansible Tower による VMware vSphere 環境の自動化 Part4 (構成情報取得編)

皆様こんにちは、Red Hat ソリューションアーキテクトの岡野です。
Ansible Tower による VMware vSphere の自動化の第4弾です。
前回のPart 3では、既存の vSphere クラスター環境に新規インストールした ESXi ホストを追加するシナリオを想定した Ansible Tower での自動化についてご説明しました。

今回の内容
今回、仮想マシンの作成方法を書いて一連のブログ完了!!と思っていたのですが、少し脱線して、vSphere 関連の情報取得方法についてご説明したいと思います。(^^)
次に予定している Part 5 では以下のような手順で仮想マシンの作成を行うのですが、この際にも利用しますので是非マスターしておいてください。

1. Linux 仮想マシンをテンプレートからデプロイする
2. デプロイした仮想マシンに New_VM というタグを付ける
3. 仮想マシンにタグが付いているかどうかを確認する
4. タグが付いている仮想マシンに httpd をインストールする

この手順のうち、手順 3 で、vmware_guest_info を使って仮想マシンに付与されたタグ情報の取得つまり、『構成情報の取得』を行います。

また、構成確認に関しては、vSphere だけではなく、他の環境への応用も出来ますので、ご存知ない方は是非参考にしていただけると嬉しいです。逆に、既に理解されている方は今回は読み飛ばしていただいて大丈夫です。

vSphere 環境の構成の確認
Ansible Tower はいわゆる『構成変更や新規構築』だけではなく、『構成の確認』も得意としています。
これは vSphere 環境だけの課題ではありませんが、通常の運用業務の中で構成の確認って結構手間になっているという話をよく聞きます。そういった観点でも理解しておくと価値は高いのかなと思います。♪

そもそも各端末を操作するから構成が分からなくなるんだ!
GitなどのSCMを使ってコードベースでインフラを管理すべし!!

という硬派な話も大好きなのですが、ま、その議論はちょっと横に置いておいて、Ansible Tower による vSphere 環境の構成の確認方法について学んでみましょう。♪

※今回一連のブログで利用する Playbook はこちらに公開しています。

標準仮想スイッチ (vSwitch) 情報の取得
vSphere 関連モジュールはこちらです。この中で、構成確認のモジュールには、

vmware_xxxxxxx_info

と、モジュール名の最後に、info が付いています。分かりやすいですね。♬
2年位前までは vSphere に関する構成確認のモジュールはほとんどなかったのですが、最近目に見えて増えてきています。それだけ需要があるという事なんですね。

さて、vSphere に関する質問の中で、多くいただく物の1つに、

『vSwitch の構成の確認って可能ですか?』

という物があります。ということで、vSwitch の情報取得方法から見てみる事にしましょう。vSwitch の構成確認のモジュールはこちらです。Part 4 まで読んでいただき、そろそろモジュールの見方にも慣れてきた頃でしょうか?♪

Playbook はこちらの中から factsvSS.yml を使います。

Playbook 上はホストを all で記載していますが、インベントリは Local host (つまり、Ansible Tower ですね)でお願いします。
vCenter Server の環境変数を記載していますので、Ansible Tower のジョブテンプレートの認証情報に自分自身の ssh 接続に関する認証情報だけでなく、vCenter Server の認証情報も忘れずに追加してください。

factsvSS.yml

---
- name: ESXi vSwitch Information
  hosts: all
  gather_facts: no
  tasks:
    - name: Show vss facts
      vmware_vswitch_info:
        hostname: "{{lookup('env', 'VMWARE_HOST')}}"
        username: "{{lookup('env', 'VMWARE_USER')}}"
        password: "{{lookup('env', 'VMWARE_PASSWORD')}}"
        validate_certs: False
        esxi_hostname: "{{ esxi_host }}"
      register: vss_facts
    - debug:
        var: vss_facts

構成確認モジュールが通常の構成変更系のモジュールと異なるところは、出力が必要になるというところです。
出力されないと Playbook 実行しても意味が無いですからね。(^^)

これを担当するのが、register と、- debug です。

register ・・・このモジュールから出力された戻り値を変数に入力
- debug・・・変数を指定して出力

です。

私の環境で実行したところ、以下の様な出力が得られました。
Ansible は戻り値を階層構造で入れてくれるので物凄く使いやすいです。

ok: [localhost] => {
    "vss_facts": {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/libexec/platform-python"
        },
        "changed": false,
        "failed": false,
        "hosts_vswitch_info": {
            "xxx.xxx.xxx.xxx": {                   # ---> esxi IP address 
                "vSwitch0": {
                    "mtu": 1500,
                    "num_ports": 128,
                    "pnics": [
                        "vmnic0"
                    ]
                },
                "vSwitch1": {
                    "mtu": 1500,
                    "num_ports": 128,
                    "pnics": [
                        "vmnic1"
                    ]
                }
            }
        }
    }
}

※IPアドレスなど固有情報は xxx など隠し文字にしています。

ただ、思ったより情報少ないですよね・・・。vSwitch に紐づく、ポートグループや vmkernel の情報も欲しい場合が多いと思いますが、こちらは別モジュールで提供。ということで、vmware_portgroup_info と、vmware_vmkernel_info モジュールを使ってさらに詳細な情報を取得してみましょう。♪

Playbook はこちらの中から factsPG.ymlfactsVMK.yml を使います。

factsPG.yml

---
- name: vSphere Port Group Infomation
  hosts: all
  gather_facts: no
  tasks:
    - name: Show Port Group Information
      vmware_portgroup_info:
        hostname: "{{lookup('env', 'VMWARE_HOST')}}"
        username: "{{lookup('env', 'VMWARE_USER')}}"
        password: "{{lookup('env', 'VMWARE_PASSWORD')}}"
        validate_certs: False
        esxi_hostname: "{{ esxi_host }}"
      register: pg_facts
    - debug:
        var: pg_facts

私の環境では以下の様な出力が得られました。

ok: [localhost] => {
    "pg_facts": {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/libexec/platform-python"
        },
        "changed": false,
        "failed": false,
        "hosts_portgroup_info": {
            "xxx.xxx.xxx.xxx": [                              # ---> ESXi Host Information / IPAddress
                {
                    "portgroup": "VM Network",
                    "vlan_id": 0,
                    "vswitch": "vSwitch0"
                },
                {
                    "portgroup": "Management Network",
                    "vlan_id": 0,
                    "vswitch": "vSwitch0"
                },
                {
                    "portgroup": "vmotion",
                    "vlan_id": 0,
                    "vswitch": "vSwitch1"
                }
            ]
        }
    }
}

次に vmkernel の情報取得です。

factsVMK.yml

---
- name: vSphere vmkernel Information
  hosts: all
  gather_facts: no
  tasks:
    - name: Show vmkernel Information
      vmware_vmkernel_info:
        hostname: "{{lookup('env', 'VMWARE_HOST')}}"
        username: "{{lookup('env', 'VMWARE_USER')}}"
        password: "{{lookup('env', 'VMWARE_PASSWORD')}}"
        validate_certs: False
        esxi_hostname: "{{ esxi_host }}"
      register: vmk_facts
    - debug:
        var: vmk_facts

実行結果

ok: [localhost] => {
    "vmk_facts": {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/libexec/platform-python"
        },
        "changed": false,
        "failed": false,
        "host_vmk_info": {
            "xxx.xxx.xxx.xxx": [                            # ---> ESXi Host Information / IP Address
                {
                    "device": "vmk0",
                    "dhcp": false,
                    "enable_ft": false,
                    "enable_management": true,
                    "enable_vmotion": false,
                    "enable_vsan": false,
                    "ipv4_address": "xxx.xxx.xxx.xxx",        # ---> ESXi Host Management Network IP Address
                    "ipv4_subnet_mask": "xxx.xxx.xxx.xxx",
                    "key": "key-vim.host.VirtualNic-vmk0",
                    "mac": "xx:xx:xx:xx:xx:xx",
                    "mtu": 1500,
                    "portgroup": "Management Network",
                    "stack": "defaultTcpipStack"
                },
                {
                    "device": "vmk1",
                    "dhcp": false,
                    "enable_ft": false,
                    "enable_management": false,
                    "enable_vmotion": true,
                    "enable_vsan": false,
                    "ipv4_address": "xxx.xxx.xxx.xxx",       # ---> for vMotion vmkernel Network IP Address
                    "ipv4_subnet_mask": "xxx.xxx.xxx.xxx",
                    "key": "key-vim.host.VirtualNic-vmk1",
                    "mac": "xx:xx:xx:xx:xx:xx",
                    "mtu": 1500,
                    "portgroup": "vmotion",
                    "stack": "defaultTcpipStack"
                }
            ]
        }
    }
}

この3つを使うと ESXi の標準仮想スイッチのネットワークの情報かなり得られますね。
ここまででくれば十分ではないでしょうか。♬

仮想マシン情報の取得
ついでにもう1つ。次回、Part 5 で利用予定の、仮想マシン情報についても取得してみましょう。
使うモジュールは vmware_guest_info で、これです。このモジュールを使うと、特定の仮想マシンの詳細情報が取得できます。似たモジュールに vmware_vm_info というのがあるのですが、こちらは個別の仮想マシン情報はほどほどに抑えて、仮想マシンの一覧を取得するモジュールです。

Playbook はこちらの中から factsGuest.yml を使います。

---
- name: Get VM Information
  hosts: all
  gather_facts: no
  tasks:
    - name: Show VM Infotmation
      vmware_guest_info:
        hostname: "{{lookup('env', 'VMWARE_HOST')}}"
        username: "{{lookup('env', 'VMWARE_USER')}}"
        password: "{{lookup('env', 'VMWARE_PASSWORD')}}"
        validate_certs: False
        datacenter: DC
        tags: yes
        name: "{{ vm_name }}"
      register: vm_facts
    - debug:
        var: vm_facts

実行結果は以下の通りです。仮想マシン名の変数には、Webserver-1 を入力して実行しています。

ok: [localhost] => {
    "vm_facts": {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/libexec/platform-python"
        },
        "changed": false,
        "failed": false,
        "instance": {
            "annotation": "",
            "current_snapshot": null,
            "customvalues": {},
            "guest_consolidation_needed": false,
            "guest_question": null,
            "guest_tools_status": "guestToolsRunning",
            "guest_tools_version": "10346",
            "hw_cluster": "CL",
            "hw_cores_per_socket": 1,
            "hw_datastores": [
                "NFS"
            ],
            "hw_esxi_host": "xxx.xxx.xxx.xxx",      # ---> ESXi IP Address
            "hw_eth0": {
                "addresstype": "assigned",
                "ipaddresses": [
                    "xxx.xxx.xxx.xxx",                  # ---> VM IPv4 Address
                    "xxxx::xxxx:xxxx:xxxx:xxxx"          # ---> VM IPv6 Address
                ],
                "label": "Network adapter 1",
                "macaddress": "xx:xx:xx:xx:xx:xx",
                "macaddress_dash": "xx-xx-xx-xx-xx-xx",
                "portgroup_key": null,
                "portgroup_portkey": null,
                "summary": "VM Network"
            },
            "hw_files": [
                "[NFS] Webserver-1/Webserver-1.vmx",
                "[NFS] Webserver-1/Webserver-1.nvram",
                "[NFS] Webserver-1/Webserver-1.vmsd",
                "[NFS] Webserver-1/vmware-3.log",
                "[NFS] Webserver-1/vmware-2.log",
                "[NFS] Webserver-1/vmware-1.log",
                "[NFS] Webserver-1/vmware.log",
                "[NFS] Webserver-1/Webserver-1.vmdk"
            ],
            "hw_folder": "/DC/vm",
            "hw_guest_full_name": "Red Hat Enterprise Linux 7 (64-bit)",
            "hw_guest_ha_state": null,
            "hw_guest_id": "rhel7_64Guest",
            "hw_interfaces": [
                "eth0"
            ],
            "hw_is_template": false,
            "hw_memtotal_mb": 1024,
            "hw_name": "Webserver-1",
            "hw_power_status": "poweredOn",
            "hw_processor_count": 1,
            "hw_product_uuid": "423cba51-9668-0eb5-a156-191d252fd625",
            "hw_version": "vmx-13",
            "instance_uuid": "503cc8df-24b5-8019-77d9-cc6ae9ca08da",
            "ipv4": "xxx.xxx.xxx.xxx",
            "ipv6": null,
            "module_hw": true,
            "moid": "vm-3170",
            "snapshots": [],
            "tags": [
                "New_VM"                      # ---> このタグ情報 Part 5 で使います!!
            ],
            "vimref": "vim.VirtualMachine:vm-3170",
            "vnc": {}
        }
    }
}

結構色々見えると思いませんか。♪

まとめ
さて、Part 4 如何でしたでしょうか。お楽しみいただけましたでしょうか?今回は、vSphere 環境の中で良く質問をいただく、標準仮想スイッチと仮想マシンに関する情報を取得してみました。info 系のモジュールは非常に充実してきていますので、上記したもの以外にも、分散仮想スイッチや、クラスター、データストア、仮想マシンのスナップショットなどなど様々な情報を取得する事が出来ます。さらに、この Info 系のモジュール、Playbook の書き方も、各モジュール間でほとんど違いがありません。

凄く良く似てますよね。基本は、

・モジュール指定
・オプションをいくつか指定
・結果を変数に入れる
・表示

だけです。1つ Playbook を書くことができれば、他の Info 系のモジュールもすぐに応用できると思います。
とても簡単で分かりやすいと思いませんか?これが私が Ansible にハマっている理由の一つです。♬

さて、いよいよ次回は、一連のブログ、最終回・・・、の予定です。
仮想マシンの作成と仮想マシン内のアプリケーションの設定をやってみましょう!!

Ansible Tower のバイナリーと評価ライセンスは以下から取得可能です。是非使ってみてください!!

・Ansible Tower バイナリーダウンロードはこちらから
・Ansible Towerの評価ライセンスはこちらから
 ※Customer Portal のアカウント作成が必要です。

(2020年8月4日追記)
一連のブログが終了しましたので、各回に対するダイレクトのリンクを貼っておきます。

Part1:Ansible Tower で vSphere の何をどうやって自動化できるのか
Part2:vSphere モジュールを使った Playbook の書き方とAnsible Tower での実行方法について
Part3:Ansible Tower を使った ESXi ホストの自動構築とvMotion による確認
Part5:仮想マシンの作成とアプリケーションの構築・設定、ダイナミックインベントリの利用、仮想マシン情報(タグ情報)の取得について

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。