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 で設定できることは全部設定できるようになっているかと思います。
冪等性についても、今のところ保てていると思っています。
使っていただけると幸いです。