Ansible で ESXi の「標準仮想スイッチ」「ポートグループ」「vmkernel」を自作モジュールで詳細設定する

はじめに

こんにちは。Gustavです。
今回は ESXi を Ansible で操っていきます。

皆さんは ESXi をインストールしたら次に何をされますかね?
ネットワーク設定?それとも共有ストレージ?
私はネットワーク設定からやりそうです。

さて、Ansible 公式モジュールにおいても vSphere 用のモジュールはたくさんあります。
2018/5/6現在で55個です。多いですね~。
vmware_guest なんかはお気に入りです。
vmware_guest で仮想マシン作成 ⇒ kickstart で OS インストール ⇒ Ansible で設定
というコマンド一発で簡単に OS セットアップができたり、テンプレートがあればそこからの展開なんて vmware_guest モジュールだけで簡単にできちゃいます。

話がそれてしまいました。もちろん公式モジュールにもネットワーク設定が行えるものがあります。
vmware_vswitch とか vmware_portgroup とか vmware_vmkernel とかです。
しかし、これらのモジュールには一長一短あり・・・
vmware_vswitch はポリシーの設定ができず
vmware_portgroup は作ったら削除できず(2.5から削除できるようです)
など。痒い所に手が届かなかったのです。

そして自作モジュールで対応することにしてみました。

とびっきりのクソコードたち

そして自作した愛すべきクソコードによるモジュール達がこちらです。
github.com github.com github.com

大 if 文祭りですね。これはひどい
とはいえまともにコーディングとかしたことがないのでこうなっちゃうわけです。
とりあえず動けばいいやを目指した形ですね。改善案募集です。

最初は頑張って pyvmomi 使おうかと思っていたのですが、たまたま esxcli が何で書かれているのか気になって確認したところ、python で書かれていました。
つまり ESXi には python が入っているわけです。
おうそのまま Ansible 使えるやんけ・・・という結論に至り。
esxcli とシェル芸を駆使してぶったたくモジュールが完成したのでした。

つかいかた

それでは、各モジュールの使い方を記載していきます。
公式モジュールのように pyvmomi で API を叩いているわけではないので、通常の Linux に対して利用するイメージ(SSH)でインベントリは記載頂ければ使えます。

vmware_esxcli_vswitch

必須なのは name だけです。
mtu、stateは指定しなかった場合、default 値が使用されます。
security、shaping、failover は指定しなかった場合は esxcli のデフォルトが設定されます。

vmware_esxcli_vswitch:
  name: vSwitchの名前
  mtu: MTU 1500(default) or 9000
  state: present(default) or absent
  security:
    promiscuous: 無差別モード allow or deny
    mac_change: MACアドレス変更 allow or deny
    forged_transmits: 偽装転送 allow or deny
  shaping:
    state: トラフィックシェーピングステータス enabled or disabled
    avg_bandwidth: 平均バンド幅 # Kbps
    peak_bandwidth: ピーク バンド幅 # Kbps
    burst_size: バースト サイズ # KB
  failover:
    load_balancing: ロードバランシング explicit(明示的なフェイルオーバー順序) or iphash(IP ハッシュに基づいたルート) or srcmac(発信元 MAC ハッシュに基づいたルート) or srcport(発信元ポート ID に基づいたルート)
    failure_detection: ネットワークのフェイルオーバー検出 beacon(ビーコンのみ) or link(リンク状態のみ)  
    notify_switches: スイッチへの通知 yes or no
    failback: フェイルバック yes or no
    active_link:
      - vmnic0
      - vmnic3
    standby_link:
      - vmnic1
      - vmnic4
    unuse_link:
      - vmnic2
      - vmnic5

vmware_esxcli_portgroup

こちらは name と vSwitch が必須となります。
vlan、state は指定しなかった場合、default 値が使用されます。
security、shaping、failover は指定しなかった場合、vSwitch からの継承として設定されます。
オーバーライドしたい場合は指定してください。

vmware_esxcli_portgroup:
  name: ポートグループ名
  vSwitch: vSwitch名
  vlan: VLAN ID default=0
  state: present(default) or absent
  security:
    promiscuous: 無差別モード allow or deny
    mac_change: MACアドレス変更 allow or deny
    forged_transmits: 偽装転送 allow or deny
  shaping:
    state: トラフィックシェーピングステータス enabled or disabled
    avg_bandwidth: 平均バンド幅 # Kbps
    peak_bandwidth: ピーク バンド幅 # Kbps
    burst_size: バースト サイズ # KB
  failover:
    load_balancing: ロードバランシング explicit(明示的なフェイルオーバー順序) or iphash(IP ハッシュに基づいたルート) or srcmac(発信元 MAC ハッシュに基づいたルート) or srcport(発信元ポート ID に基づいたルート)
    failure_detection: ネットワークのフェイルオーバー検出 beacon(ビーコンのみ) or link(リンク状態のみ)  
    notify_switches: スイッチへの通知 yes or no
    failback: フェイルバック yes or no
    active_link:
      - vmnic0
      - vmnic3
    standby_link:
      - vmnic1
      - vmnic4
    unuse_link:
      - vmnic2
      - vmnic5

vmware_esxcli_vmk

こちらは name と portgroup が必須となります。 state、mtu、gw、dhcpdns は指定しなかった場合、default 値が使用されます。
service_tag はもちろん複数指定可能です。
gw は esxcli network interface ipv4 set コマンドによる設定となります。
デフォルトゲートウェイの設定とは異なるのでご注意ください。

vmware_esxcli_vmk:
  name: vmkernel名
  portgroup: ポートグループ名
  state: present(default) or absent
  service_tag: VMotion(vMotion) / vSphereProvisioning(プロビジョニング) / faultToleranceLogging(Fault Tolerance のログ) / Managamanet(管理) / vSphereReplication(レプリケーション) / vSphereReplicationNFC(NFCレプリケーション) / VSAN / VSANWitness
    - Management
    - VMotion
  mtu: MTU 1500(default) or 9000
  type: dhcp or static or none
  ipv4: IP アドレス
  mask: サブネットマスク
  gw: ゲートウェイ default=0.0.0.0
  dhcpdns: yes or no(default)

おわりに

いかがでしたでしょうか。
esxcli を使っているため、GUI で設定できることは全部設定できるようになっているかと思います。
冪等性についても、今のところ保てていると思っています。
使っていただけると幸いです。