Ansible Tower による VMware vSphere 環境の自動化 Part3

皆様こんにちは、Red Hat ソリューションアーキテクトの岡野です。
Ansible Tower による VMware vSphere の自動化の第三弾です。♪
前回のPart 2では以下を説明したしました。

・Ansible Tower のインストール
・必要なコンポーネント(vSphere Automation SDKなど)のインストール
・Playbook について
・Ansible Tower での Playbook 実行方法
・Ansible Tower による vCenter Server の環境変数の取り扱いと Playbook への入力方法
・Survey を使った変数の入力方法

今回のシナリオ
既存の vSphere クラスター環境に新規インストールした ESXi ホストを追加してみたいと思います。♬
追加にあたって、vMotion や HA が出来る様に vmkernel や共有データストアの設定を行い、最後にテスト vMotion も実行し、構成に問題がないことを確認します。

具体的には以下を実施します。

1. ESXi を vCenter Server に登録(クラスター配下に登録)
2. ESXi にライセンスを適応
3. vmnic1 が接続された標準仮想スイッチ (vSwitch1) を追加
4. vSwitch1 に vMotion 用の vmkernel ポートを追加
5. 共有ストレージとして NFS をマウント
6. テスト vMotion の実行

せっかくですので、皆さんも同じ環境を準備して実行しながら進めてみてください。♪

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

1. ESXi を vCenter Server に登録
さて、Playbook を書く必要がありますが、使うモジュール?書き方って?
そう、VMware のモジュールを眺める事から始めるんでしたね。♪

VMware モジュールも多くなってきて探しにくいですが、今回はこの中で、vmware_host を利用します。
1つ目なので、以下 Playbook の内容を説明します。

docs.ansible.com

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

---
- name: Add or Remove ESXi host to/from vCenterServer
  hosts: all
#  gather_facts: no
  tasks:
    - name: Add or Remove ESXi host to/from vCenterServer
      vmware_host:
        hostname: "{{lookup('env', 'VMWARE_HOST')}}"
        username: "{{lookup('env', 'VMWARE_USER')}}"
        password: "{{lookup('env', 'VMWARE_PASSWORD')}}"
        validate_certs: False
        datacenter_name: "{{dc_name}}"
        cluster_name: "{{cl_name}}"
        esxi_hostname: "{{esxi_host}}"
        esxi_username: "{{esxi_user}}"
        esxi_password: "{{esxi_pass}}"
        state: "{{esxi_state}}"
      delegate_to: localhost

# 以下は必須ではありませんがホスト追加時に ESXi のメンテナンスモードを自動的に解除します。
# 変数は全て上のタスクで定義されていますので新規定義は必要ありません。
    - name: Manage Maintenance Mode
      vmware_maintenancemode:
        validate_certs: False
        hostname: "{{lookup('env', 'VMWARE_HOST')}}"
        username: "{{lookup('env', 'VMWARE_USER')}}"
        password: "{{lookup('env', 'VMWARE_PASSWORD')}}"
        esxi_hostname: "{{esxi_host}}"
        state: absent
      delegate_to: localhost
      when: esxi_state == "present"

{{ }} で記載した部分は変数です。

Ansible Tower への変数への入力方法は、そう、Survey でしたね。Survey で与えるべき具体的な値はモジュールの Parameters を見ていただけると分かりますが、以下の通りです。

以下の3つは、Ansible Towerの環境変数から自動的に入力されますので Survey での指定は不要です。

・hostname: "{{lookup('env', 'VMWARE_HOST')}}"  
・username: "{{lookup('env', 'VMWARE_USER')}}"  
・password: "{{lookup('env', 'VMWARE_PASSWORD')}}"  

以下を Survey で与えます。もしくは、PoC 環境であれば、変数をやめて、Playbook の中にベタ書きしても良いと思います。

・datacenter_name: "{{dc_name}}" ---> ESXi ホストを追加する vCenter Server のデータセンター名  
・cluster_name: "{{cl_name}}" ---> ESXi ホストを追加する vCenter Server のクラスター名  
・esxi_hostname: "{{esxi_host}}" ---> 追加する ESXi のホスト名・IPアドレス  
・esxi_username: "{{esxi_user}}" ---> 追加する ESXi のユーザー  
・esxi_password: "{{esxi_pass}}" ---> 追加する ESXi のパスワード  
・state: "{{esxi_state}}"   ---> ESXi を追加 (present) or 削除 (absent)

Survey の設定方法、Playbook のAnsible Tower での実行方法に関して不明な方はこちら[Part2] (https://rheb.hatenablog.com/entry/ansible_tower_vmware_part2)をご確認ください。

state 変数を、presentabsent に変更して実行してみてください。

追加だけではなく、削除も簡単に行えるのが分かると思います。

ここで、vSphere 環境を良く触っている方であれば、特に削除時の動作に驚くのではと思います。
vSphere のクラスター環境からホストを削除する際、vSphere の場合、まずメンテナンスモードに変更する必要がありますよね。vmware_host モジュールでは削除時、自動的にメンテナンスモードに変更してくれます。凄く便利だと思いませんか?♪

逆に、vmware_host モジュールだけで削除・追加を行うと、メンテナンスモードのまま追加されます。(^^)
そのため、vmware_maintenancemode モジュールを使って、ESXi ホスト追加時に、メンテナンスモードを自動的に解除するように Playbook を書いてます。

追加も削除もすごく簡単だと思いませんか?実は、私、Ansible 使うようになってから、vSphere Client で操作するのが凄く面倒になりました。人ってホント一度楽すると元には戻れませんよね。♪

2. ESXi にライセンスを適応
モジュールは vcenter_license です。
Playbook はこちらの中から license.yml を使います。

---
- name: Add or Remove ESXi host to/from vCenterServer
  hosts: all
  gather_facts: no
  tasks:
    - name: Manage ESXi Lisence
      vcenter_license:
        hostname: "{{lookup('env', 'VMWARE_HOST')}}"
        username: "{{lookup('env', 'VMWARE_USER')}}"
        password: "{{lookup('env', 'VMWARE_PASSWORD')}}"
        validate_certs: False
        esxi_hostname: "{{esxi_host}}"
        license: xxxxx-xxxxx-xxxxx-xxxxx-xxxxx
        state: present
      delegate_to: localhost

license の xxxx... のところにはご自身の管理する ESXi ホストの License を入れてくださいね。♪
こちらは今まで一連のBlog読んでいただいた方であれば簡単だと思います。
細かい説明は行いません。Survey で与えるのは、License を与える ESXi ホスト名のみです。

実はこの、License 適応、vSphere 環境における『Ansible でこれできますか?』の質問の中で多い物の一つです。
どうでしょう?簡単ですよね。♪

3. vmnic1 が接続された標準仮想スイッチ (vSwitch1) を追加
モジュールは vmware_vswitch です。
Playbook はこちらの中から manageVSS.yml を使います。

---
- name: Manage VSS
  hosts: all
  gather_facts: no
  tasks:
  - name: Standard Switch Config
    vmware_vswitch:
      esxi_hostname: "{{esxi_host}}"
      hostname: "{{lookup('env', 'VMWARE_HOST')}}"
      username: "{{lookup('env', 'VMWARE_USER')}}"
      password: "{{lookup('env', 'VMWARE_PASSWORD')}}"
      validate_certs: no
      switch: "{{vss_name}}"
      nics: "{{vmnic_name}}"
      mtu: 1500
      state: "{{vss_state}}"
    delegate_to: localhost

こちらも・・・、vSphere 環境で標準仮想スイッチ作成したことのある方であれば簡単だと思います。
細かい説明は割愛させていただきますね。

4. vSwitch1 に vMotion 用の vmkernel ポートの追加
モジュールは vmware_vmkernel です。

今回の中で、この vmkernel モジュールが一番わかりにくいと思います。
と言うのも、ポートグループが無いと、vmkernel ポートが作成できないから・・・。

ちなみに、ポートグループを作成するモジュールは vmware_portgroup です。
vSphere Client を使って vmkernel ポートを作成する際は、ウィザードで一発作成可能ですよね・・・、ちょっとこの点はいけてないかなと感じるところです。Ansible 2.4 のころからVMwareのモジュール沢山触ってますが、感覚的に、VMware のモジュールの中ではこのモジュールが一番出来が悪いです。

ま、文句言っても仕方ないので、以下の順に作成します。♪

  1. vmware_portgroup モジュールを使ってポートグループを作成
  2. vmware_vmkernel モジュールで vmkernel ポートを作成

という2段構えになります。

この様に通り組み合わることにより問題なく動作します。
書いてあることは vSphere の管理者であればそれほど難しくないと思います。

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

# This Playbook requires Ansible 2.5 or later, would not work on previous versions such as 2.4.x
# まずポートグループを作成し、その後、VMkernel ポートの作成を行います。
#  最初のタスクで when の条件文を入れているのは、 vmkernel ポート削除も実行可能な Playbook になっているためです。
#  vmkernel 作成の際のみこのポートグループ作成のタスクが実行され、削除の際は実行されません。
---
- name: Manage VMKernel Port
  hosts: all
  tasks:
  - name: Portgroup Create
    vmware_portgroup:
      hosts: "{{esxi_host}}"
      hostname: "{{lookup('env', 'VMWARE_HOST')}}"
      username: "{{lookup('env', 'VMWARE_USER')}}"
      password: "{{lookup('env', 'VMWARE_PASSWORD')}}"
      portgroup_name: "{{pg_name}}"
      state: "{{vmk_state}}"
      switch_name: "{{vss_name}}"
      validate_certs: no
      vlan_id: 0
    delegate_to: localhost
    when: vmk_state == "present"

# 作成したポートグループを vMotion 用のVMkernelとして設定する
  - name: vmkernel Config
    vmware_vmkernel:
      esxi_hostname: "{{esxi_host}}"
      hostname: "{{lookup('env', 'VMWARE_HOST')}}"
      username: "{{lookup('env', 'VMWARE_USER')}}"
      password: "{{lookup('env', 'VMWARE_PASSWORD')}}"
      validate_certs: no
      vswitch_name: "{{vss_name}}"
      state: "{{vmk_state}}"
      portgroup_name: "{{pg_name}}"
      device: vmk1
      network:
        type: 'static'
        ip_address: "{{ip_address}}"
        subnet_mask: "{{subnet}}"
      enable_vmotion: "{{vmotion}}"
      enable_ft: no
      enable_mgmt: no
      enable_vsan: no
    delegate_to: localhost

# こちらは vmkernel ポート削除の際にポートグルーも削除するための追加タスクです。
# vmkernel の削除まで自動化したい際は入れておいてください。追加だけであれば必要ありません。
  - name: Portgroup Delete
    vmware_portgroup:
      hosts: "{{esxi_host}}"
      hostname: "{{lookup('env', 'VMWARE_HOST')}}"
      username: "{{lookup('env', 'VMWARE_USER')}}"
      password: "{{lookup('env', 'VMWARE_PASSWORD')}}"
      portgroup_name: "{{pg_name}}"
      state: "{{vmk_state}}"
      switch_name: "{{vss_name}}"
      validate_certs: no
      vlan_id: 0
    when: vmk_state == "absent"

5. 共有ストレージとして NFS をマウント
モジュールは vmware_host_datastore です。
Playbook はこちらの中から mount-nfs.yml を使います。

NFSマウントだけであれば凄く簡単なのですが、削除も考慮に入れますので、メンテンナンスモードへの移行なども入ってます。

---
- name: Manage Datastore for ESXi
  hosts: all
  tasks:
# NFS をアンマウントする際に必要なメンテナンスモードへの移行のためのタスクです
# NFS 追加だけであれば必要ありません
# when で "nfs_state" を "absent" で指定しているのは、アンマウント時のみ実行するためです
  - name: Manage Maintenance Mode
    vmware_maintenancemode:
      hostname: "{{lookup('env', 'VMWARE_HOST')}}"
      username: "{{lookup('env', 'VMWARE_USER')}}"
      password: "{{lookup('env', 'VMWARE_PASSWORD')}}"
      validate_certs: False
      esxi_hostname: "{{esxi_host}}"
      evacuate: yes
      state: present
    delegate_to: localhost
    when: nfs_state == "absent"

# NFS をマウント・アンマウントするタスクです
  - name: Manage NFS Datastore
    vmware_host_datastore:
      esxi_hostname: "{{esxi_host}}"
      hostname: "{{lookup('env', 'VMWARE_HOST')}}"
      username: "{{lookup('env', 'VMWARE_USER')}}"
      password: "{{lookup('env', 'VMWARE_PASSWORD')}}"
      datastore_name: "{{nfs_name}}"
      datastore_type: nfs
      nfs_path: "{{nfs_path}}"
      nfs_server: "{{nfs_server}}"
      state: "{{nfs_state}}"
      validate_certs: no
    delegate_to: localhost

# メンテナンスモードを解除するタスク。NFS 削除の際に必要。追加だけなら必要ありません。
  - name: Manage Maintenance Mode
    vmware_maintenancemode:
      hostname: "{{lookup('env', 'VMWARE_HOST')}}"
      username: "{{lookup('env', 'VMWARE_USER')}}"
      password: "{{lookup('env', 'VMWARE_PASSWORD')}}"
      validate_certs: False
      esxi_hostname: "{{esxi_host}}"
      evacuate: yes
      state: absent
    delegate_to: localhost

6. テスト vMotion の実行
最後に、ESXi がきちんと構成されていることを仮想マシンの vMotion により試します。
モジュールは vmware_vmotion です。
Playbook はこちらの中から vmotion-test.yml を使います。

---
- name: Config check by vMotion
  hosts: all
  gather_facts: no
  tasks:
  - name: Test vMotion after ESXi Config
    vmware_vmotion:
      validate_certs: False
      hostname: "{{lookup('env', 'VMWARE_HOST')}}"
      username: "{{lookup('env', 'VMWARE_USER')}}"
      password: "{{lookup('env', 'VMWARE_PASSWORD')}}"
      vm_name: testvm
      destination_host: "{{esxi_host}}"
    delegate_to: localhost

さて、これで、ESXi の構築が終了です!

Ansible Tower のワークフローテンプレート
上記 Playbook を一つずつ Ansible Tower のジョブテンプレートで実行しても良いのですが、Ansible Tower のワークフローテンプレートを使って一気に実行してみましょう。♪

ワークフローテンプレートの作成方法は以下の通りです。

f:id:hokn5:20200710225942p:plain

通常のジョブ添付テートと似てますね。
これを使って以下の様なジョブテンプレートのフローを作ります。

f:id:hokn5:20200710230608p:plain

上記 Playbook は作成だけではなく削除にも対応していますので、全ての state 変数を absent に設定すると、ESXi ホストが初期状態に戻り、vCenter Server から削除されます。
※ License の削除には対応していません。

まとめ
さて、Part 3 如何でしたでしょうか。今回は、既存環境への ESXi ホストの追加のシナリオを想定しその方法をご説明しました。お楽しみいただけましたでしょうか?

今回実行した内容は vSphere Client でも出来るのですが、構築した後の vMotion での確認などすべて自動化できるところ、また繰り返し作業が簡単確実に行えるところが Ansible Tower の良いところかなと思います。

次回は、仮想マシンの作成と仮想マシン内のアプリケーションの設定についてご説明します。

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

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

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

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

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