csmart.virt_infra

Ansible役割: 仮想インフラストラクチャ

この役割は、1台以上のKVMホスト上でネットワークとゲストを定義し、管理するためのものです。Ansibleの--limitオプションを利用して、個別に管理することもグループとして管理することもできます。

これは主に開発作業向けに設計されており、KVMホストがローカルマシンで、sudoが使え、libvirtdqemu:///systemでアクセスできますが、リモートホストでも動作します。

ゲストの状態を_実行中_、_シャットダウン_、_削除済み_、または_未定義_に設定することがサポートされています(削除してクリーンアップするため)。

ゲストのメモリ、CPU、ディスク、およびネットワークカードを、ホストグループまたは個別に設定できます。scsi_、_sata_、_virtio_、さらには nvme_(対応しているディストリビューション)を含む複数のディスクを混合することがサポートされています。

KVMホスト上にプライベートNAT libvirtネットワークを作成し、その上にVMを何台でも配置できます。ゲストはこれらのlibvirtネットワークか、既存の Linuxブリッジデバイス(例: br0)やOpen vSwitch(OVS)ブリッジを使用できます(ホスト上にブリッジを作成するわけではなく、ブリッジインターフェースが存在するかを確認します)。必要であれば、各インターフェースのネットワークカードのモデルやMACアドレスを指定できますが、デフォルトではホスト名に基づいた冪等なアドレスが使用されます。

また、KVMホスト上にルーティングされたlibvirtネットワークを作成し、その上にVMを配置することもできます。この場合、新しいブリッジが指定した名前(例: br1)で作成され、_既存の_インターフェース(例: eth0)に接続されます。必要であれば、各インターフェースのMACアドレスを指定できます。

これは様々なディストリビューションに対応しており、利便性のためにqcow2 クラウドイメージを使用しています(ただし、自分のイメージを使うこともできます)。CentOS Stream、Debian、Fedora、openSUSE、RHEL、Ubuntuでテスト済みです。

RHELの場合、ディスクの準備中にRed Hatポータルに一時的に登録するために、virt_infra_sm_creds変数を設定してください。これはvirt-builderからのフォーマットに従います。

qcow2クラウドベースイメージは、インベントリ内の変数として指定され、libvirtイメージディレクトリ(デフォルトは/var/lib/libvirt/images/)に存在する必要があります。つまり、自動的にイメージをダウンロードするわけではありません。

ゲストqcow2ブートイメージは、それらのベースイメージから作成されます。デフォルトでは、これらはクラウドイメージをバックファイルとして使用しますが、代わりにクローンすることもサポートしています。好きな数だけ追加のディスクを作成できます。また、VMが未定義のときにディスクイメージを削除するのではなく保持することも選べます。クラウド-init ISOが自動的に作成され、ブート時にゲストに接続されて設定されます。

タイムゾーンはデフォルトでKVMホストと一致し、ゲストにはansibleユーザーが使用され、KVMホスト上の公開SSHキーが設定されます(これをオーバーライドすることも可能です)。ホストエントリはKVMホストの/etc/hostsに追加され、またansibleユーザーのSSH設定を変更し、フィンガープリントをknown_hostsに追加しますので、直接SSHにアクセスできます(デプロイの一部としてテストされます)。必要があれば、ルートパスワードを設定することもできます。

これらを踏まえて、異なるサイズのOpenStack/Swift/Cephクラスターを定義し、管理することが可能です!

要件

必要なのは、KVMを実行できるLinuxホスト、いくつかのゲストイメージ、および基本的なインベントリだけです。Ansibleが他のことを行います(サポートされているディストリビューションで)。

ユーザーがAnsibleを実行できるx86_64 KVMホストが必要です。

KVMのためのハードウェアサポートがCPUに必要ですので、加速されたゲストを作成し、CPUを通過させることができます(ネストした仮想化をサポート)。

AnsibleとJinja >= 2.8が必要な場合があります。これは「equalto」比較などを行うからです。

CentOS Stream 8、Fedora 3x、Debian 10、Ubuntu Bionic/Eoan、openSUSE 15ホストでテスト済みですが、他のLinuxマシンでもおそらく動作します。

KVMホスト上にSSHキーペアを少なくとも1つ用意する必要があります(Ansibleが不足している場合は自動生成します)。リモートKVMホストの場合、ゲスト用のSSHキーにはSSHパスフレーズが必要ないことを確認してください。ローカルの場合は、sshエージェントに追加されていることを確認してください。

KVMホスト上にはいくつかのユーザースペースツールも必要です(Ansibleがサポートされているホストにインストールします)。

  • qemu-img
  • osinfo-query
  • virsh
  • virt-customize
  • virt-sysprep

使用するゲストイメージをダウンロードし(こちらが私がダウンロードしたもの)、libvirtイメージパス(通常/var/lib/libvirt/images/)に配置してください。これは指定したイメージが存在するかを確認し、見つからない場合はエラーになります。

KVMホスト

KVMホストの設定に関する指示がありますので、必要な場合はご覧ください。

注意: この役割は、KVM、libvirtd、その他の必要なパッケージをインストールし、libvirtdが実行されていることを確認します。

また、virt_infra_host_pkgs_customという変数があり、必要であればホストにインストールするパッケージのリストを受け取ります。

この変数はリスト形式である必要があり、ホストはパッケージをインストールできる必要があります。つまり、パッケージ名がホスト用に正しい必要があります。ホストがRHELで実行されている場合は登録されている必要があります。

Fedora

# SSHキーがない場合は作成します(リモートKVMホストの場合はパスフレーズを設定しないでください)
ssh-keygen

# libvirtd
sudo dnf install -y @virtualization
sudo systemctl enable --now libvirtd

# Ansible
sudo dnf install -y ansible

# その他の依存関係(プレイブックによってインストールされます)
sudo dnf install -y \
git \
genisoimage \
libguestfs-tools-c \
libosinfo \
python3-libvirt \
python3-lxml \
qemu-img \
virt-install

CentOS 7

CentOS 7は、libselinux-python3パッケージが必要になるまで機能しません。このパッケージは7.8で登場します...

使用可能になったときの手順は以下の通りです。

# SSHキーがない場合は作成します
ssh-keygen

# libvirtd
sudo yum groupinstall -y "Virtualization Host"
sudo systemctl enable --now libvirtd

# Ansibleとその他の依存関係
sudo yum install -y epel-release
sudo yum install -y python36
pip3 install --user ansible

sudo yum install -y \
git \
genisoimage \
libguestfs-tools-c \
libosinfo \
python36-libvirt \
python36-lxml \
libselinux-python3 \
qemu-img \
virt-install

CentOS Stream 8

# SSHキーがない場合は作成します
ssh-keygen

# libvirtd
sudo dnf groupinstall -y "Virtualization Host"
sudo systemctl enable --now libvirtd

# Ansible
sudo dnf install -y epel-release
sudo dnf install -y ansible

# その他の依存関係(プレイブックによってインストールされます)
sudo dnf install -y \
git \
genisoimage \
libguestfs-tools-c \
libosinfo \
python3 \
python3-libvirt \
python3-lxml \
qemu-img \
virt-install

Debian

# SSHキーがない場合は作成します
ssh-keygen

# libvirtd
sudo apt update
sudo apt install -y --no-install-recommends qemu-kvm libvirt-clients libvirt-daemon-system
sudo systemctl enable --now libvirtd

# Ansible
sudo apt install -y gnupg2
echo 'deb http://ppa.launchpad.net/ansible/ansible/ubuntu trusty main' | sudo tee -a /etc/apt/sources.list
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 93C4A3FD7BB9C367
sudo apt update
sudo apt install -y ansible

# その他の依存関係(プレイブックによってインストールされます)
sudo apt install -y --no-install-recommends \
cloud-image-utils \
dnsmasq \
git \
genisoimage \
libguestfs-tools \
libosinfo-bin \
python3-libvirt \
python3-lxml \
qemu-utils \
virtinst

Ubuntu

# SSHキーがない場合は作成します
ssh-keygen

# libvirtd
sudo apt update
sudo apt install -y --no-install-recommends libvirt-clients libvirt-daemon-system qemu-kvm
sudo systemctl enable --now libvirtd

# Ansible
sudo apt install -y software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible
sudo apt install -y ansible

# その他の依存関係(プレイブックによってインストールされます)
sudo apt install -y --no-install-recommends \
dnsmasq \
git \
genisoimage \
libguestfs-tools \
libosinfo-bin \
python3-libvirt \
python3-lxml \
qemu-utils \
virtinst

openSUSE

JeOSを使用している場合、KVMモジュールが不足しているため、kernel-defaultにカーネルを変更する必要があります。

# SSHキーがない場合は作成します
ssh-keygen

# 適切なカーネルをインストールします
sudo zypper install kernel-default
sudo reboot

再起動後に続けます。

# libvirtd
sudo zypper install -yt pattern kvm_server kvm_tools
sudo systemctl enable --now libvirtd

# Ansible
sudo zypper install -y ansible

# その他の依存関係(プレイブックによってインストールされます)
sudo zypper install -y \
git \
guestfs-tools \
libosinfo \
mkisofs \
python3-libvirt-python \
python3-lxml \
qemu-tools \
virt-install

ルーティングされたネットワークの使用

新しく作成されたブリッジにトラフィックをルーティングするには、type: routeを指定します。このコードは、host_devパラメータによって指定された既存のインターフェースに接続された新しいブリッジbridge_devを自動的に作成します。

以下の例は、IPv4とIPv6の両方をサポートするブリッジの作成方法を示しています。

kvmhost:
  hosts:
    localhost:
      ansible_connection: local
      ansible_python_interpreter: /usr/bin/python3
      virt_infra_host_libvirt_url: qemu:///system
  vars:
    virt_infra_host_networks:
      present:
        - name: example
          domain: f901.example.com
          type: route
          host_dev: eth0
          bridge_dev: virbr1
          bridge_stp: on
          bridge_delay: 0
          mac: 52:54:00:f9:01:00
          ip_address: 10.249.1.1
          ip_netmask: 255.255.255.0
          dhcp_start: 10.249.1.11
          dhcp_end: 10.249.1.254
          ip6_address: 2001:0db8::f901:1
          ip6_prefix: 64
          dhcp6_start: 2001:0db8::f901:0000
          dhcp6_end: 2001:0db8::f901:00ff

注意:

  1. 上記のIPv6ブロック2001:0db8/32は、ドキュメンテーションのために提供されています。通常は、IPv6プロバイダーから割り当てられた独自の/48ブロックに置き換える必要があります。
  2. libvirtドキュメントで推奨されているので、ip6_prefix: 64を維持することをお勧めします。

NetworkManagerを使ったブリッジの設定

このコードは、VMをLinuxとOpen vSwitchのブリッジに接続することをサポートしていますが、これらはKVMホスト上ですでに存在している必要があります。

まず、変換したいデバイスをエクスポートします(例: eth1)。

export NET_DEV="eth1"

次に、上記のエクスポートされたデバイスの現在のNetworkManager接続をリスト表示し、後で無効にするための準備をします。

sudo nmcli con |egrep -w "${NET_DEV}"

これにより、System eth1Wired connection 1のようなものが表示される場合があり、後で参照用にエクスポートします。

export NM_NAME="Wired connection 1"
Linuxブリッジ

NetworkManagerを使用して永続的なLinuxブリッジを作成する例を示します。eth1というデバイスを取り、ブリッジに変換します。

必要なNetworkManager接続名を思い出し、以下でそれを使用します(例: Wired connection 1)。

export NET_DEV=eth1
export NM_NAME="Wired connection 1"
sudo nmcli con add ifname br0 type bridge con-name br0
sudo nmcli con add type bridge-slave ifname "${NET_DEV}" master br0

これでブリッジデバイスができます!注意が必要なのは、ブリッジには基盤デバイスとは異なるMACアドレスがあるため、特定のアドレスを期待する場合は、DHCPの静的リースを更新する必要があります。

sudo ip link show dev br0

デバイスの現在のNetworkManager設定を無効にして、ブリッジと競合しないようにします(まだ削除しないでください、SSH用に使用している場合、接続を失う可能性があります)。

sudo nmcli con modify id "${NM_NAME}" ipv4.method disabled ipv6.method disabled

ここで、単に再起動するか、現在のインターフェースを停止し、1つのコマンドでブリッジを起動することができます。ブリッジは新しいMACアドレスを持つため、新しいIPを取得します。

sudo nmcli con down "${NM_NAME}" ; sudo nmcli con up br0

デフォルトでは、LinuxブリッジはDHCPを介してアドレスを取得します。ネットワークに接続させたくない場合(他の専用インターフェースがあるかもしれない場合)、DHCPを無効にします。

sudo nmcli con modify id br0 ipv4.method disabled ipv6.method disabled
インベントリでのLinuxブリッジの使用

kvmhost側のインベントリでは特に必要な操作はありません。

ブリッジに接続したいゲストのインベントリでは、virt_infra_networksの下にbr0nameとして指定します。

      virt_infra_networks:
        - name: br0
          type: bridge
Open vSwitch (OVS)ブリッジ

NetworkManagerを使用して永続的なOVSブリッジを作成する例を示します。eth1というデバイスを取り、ovs-bridgeに変換します。

OVSネットワークマネージャープラグインと共にopenvswitchも必要です(ディストリビューションに応じて置き換えます)。

sudo dnf install -y NetworkManager-ovs openvswitch
sudo systemctl enable --now openvswitch
sudo systemctl restart NetworkManager

次に、OVSブリッジを作成できます(デバイスがeth1で、既存のNetworkManager設定がWired connection 1であると仮定します)。

export NET_DEV=eth1
export NM_NAME="Wired connection 1"
sudo nmcli con add type ovs-bridge conn.interface ovs-bridge con-name ovs-bridge
sudo nmcli con add type ovs-port conn.interface port-ovs-bridge master ovs-bridge
sudo nmcli con add type ovs-interface slave-type ovs-port conn.interface ovs-bridge master port-ovs-bridge
sudo nmcli con add type ovs-port conn.interface ovs-port-eth master ovs-bridge con-name ovs-port-eth
sudo nmcli con add type ethernet conn.interface "${NET_DEV}" master ovs-port-eth con-name ovs-int-eth

デバイスの現在のNetworkManager設定を無効にして、ブリッジと競合しないようにします(まだ削除しないでください、SSH用に使用している場合、接続を失うかもしれないからです)。

sudo nmcli con modify id "${NM_NAME}" ipv4.method disabled ipv6.method disabled

ここで単に再起動するか、現在のインターフェースを停止し、1つのコマンドでブリッジを起動できます。

sudo nmcli con down "${NM_NAME}" ; sudo nmcli con up ovs-slave-ovs-bridge

デフォルトでは、OVSブリッジはDHCPを介してアドレスを取得します。ネットワークに接続させたくない場合は(他の専用インターフェースがある可能性がある)、DHCPを無効にします。

sudo nmcli con modify id ovs-slave-ovs-bridge ipv4.method disabled ipv6.method disabled

OVSツールを使用してスイッチ設定とブリッジを表示します。

sudo ovs-vsctl show
インベントリでのovs-bridgeの使用

今、kvmhostインベントリのvirt_infra_host_networksエントリでovs-bridgedeviceとして使用でき、OVS libvirtネットワークが自動的に作成されます。複数のVLANを設定し、必要であれば1つをデフォルトのネイティブとして設定できます。

VLANレンジはリストとして定義することでサポートされています。

      virt_infra_host_networks:
        present:
          - name: ovs-bridge
            bridge_dev: ovs-bridge
            type: ovs
            portgroup:
              - name: ovs-trunk
                trunk: true
                native_vlan: 1
                vlan:
                  - 1
                  - [20,29]
                  - 99
              - name: default
                native_vlan: 1
                vlan:
                  - 1
              - name: other
                native_vlan: 99
                vlan:
                  - 99

その後、VMが特定のポートグループに配置され、libvirtが自動でVMのポートを設定します。

      virt_infra_networks:
        - name: ovs-bridge
          portgroup: default
          type: ovs

VMが実行されると、sudo ovs-vsctl showコマンドでそのOVSポートを確認できます。

ゲストクラウドイメージ

これは、さまざまなディストリビューションによって提供された標準クラスターイメージを使用するように設計されています(OpenStackがいくつかの提案を提供しています)。

ゲスト用に指定するイメージが設定されたlibvirtストレージディレクトリに既に存在することを確認してください。(デフォルトは_/var/lib/libvirt/images/_)

次のゲストを正常にテストしました:

ゲストを設定し、そのIPを取得するために、どちらもcloud-initqemu-guest-agentがゲストのイメージにインストールされます。

これはvirt_infra_guest_deps変数を使用して変更またはオーバーライドできます。この変数はリストです。

シスプリップもゲストイメージで実行され、旧MACアドレスなどのものがクリーニングされます。

役割の変数

役割のデフォルトは、_defaults/main.yml_ファイルに設定されています。

これらは必要に応じてホストまたはホストグループレベルでオーバーライドできます。ただし、この役割は基本的にすぐに使用できるように設計されています(CentOS Stream 8のデフォルトイメージがある限り)。

---
# virt-infra Ansible役割のデフォルト
# コメントアウトされた値はオプションです

## ゲスト関連

# 有効なゲスト状態: 実行中、シャットダウン、削除済み、または未定義
virt_infra_state: "running"

# ゲストはブート時に自動起動しません
virt_infra_autostart: "no"

# デフォルトのユーザー(デフォルトではKVMホストユーザーと同じユーザーに設定されます)
virt_infra_user: "{{ hostvars[kvmhost].ansible_env.USER }}"

# デフォルトユーザーのパスワード(安全なパスワードが必要な場合はボールトを検討)
# デフォルトではルートパスワードはありません
virt_infra_password: "password"
#virt_infra_root_password:

# ゲストのVM仕様
# 有効な値はvirt-installマニュアルページを参照
virt_infra_ram: "1024"
virt_infra_ram_max: "{{ virt_infra_ram }}"
virt_infra_cpus: "1"
virt_infra_cpus_max: "{{ virt_infra_cpus }}"
virt_infra_cpu_model: "host-passthrough"
virt_infra_machine_type: "q35"

# SSHキーはリストであり、複数追加できます
# 指定されていない場合、KVMホストのすべての公開鍵がデフォルトとされます
virt_infra_ssh_keys: []

# SSHキーが指定されていないか、KVMホストに見つからない場合、これを使用して新しいキーを作成します
virt_infra_ssh_key_size: "2048"
virt_infra_ssh_key_type: "rsa"

# SSHパスワード認証を有効にするかどうか
virt_infra_ssh_pwauth: true

# ゲストのネットワーキングを設定するためにcloud-initを使用するかどうか
virt_infra_network_config: false

# ネットワークはリストであり、複数追加できます
# "type"はオプションで、"nat"と"bridge"がサポートされています
#  - "nat"がデフォルトのタイプで、libvirtネットワークであるべきです
#  - "bridge"タイプには、名前(例: "br0")としてブリッジインターフェースが必要であり、すでにKVMホストで設定されていなければなりません
# "model"もオプションです
virt_infra_networks:
  - name: "default"
    type: "nat"
    model: "virtio"

# ディスクは様々なlibvirtオプションをサポートします
# 通常は設定せず、ハイパーバイザーのデフォルトに任せます
# 有効な値はvirt-installマニュアルページを参照
virt_infra_disk_size: "20"
virt_infra_disk_bus: "scsi"
virt_infra_disk_io: "threads"
virt_infra_disk_cache: "writeback"

# ディスクはリストであり、複数追加できます
# これをオーバーライドする場合、リストの最初に'boot'デバイスを含めなければなりません
# 'name'が必要で、その他はオプション(デフォルトサイズは20GB)
# すべてのゲストには少なくともブートドライブが必要です(これはデフォルトです)
virt_infra_disks:
  - name: "boot"
    size: "{{ virt_infra_disk_size }}"
    bus: "{{ virt_infra_disk_bus }}"
#   io: "{{ virt_infra_disk_io }}"
#   cache: "{{ virt_infra_disk_cache }}"

# デフォルトのディストリビューションはCentOS Stream 8であり、ゲストまたはグループで上書きできます
virt_infra_distro_image: "CentOS-Stream-GenericCloud-8-20210603.0.x86_64.qcow2"

# "osinfo-query os"コマンドでKVMホストのサポートされているバリアントを確認します
# これはゲストにはそれほど影響しませんが、少し異なるバスが得られるかもしれません
# おそらくすべてのディストリビューションのためにこれを"centos7.0"に設定することも可能です
#virt_infra_variant: "centos7.0"

# これらのディストリビューション関連の変数は参照と利便性のためにここにあります
virt_infra_distro: "centos-stream"
virt_infra_distro_release: "8"
virt_infra_distro_image_url: "https://cloud.centos.org/centos/8-stream/x86_64/images/CentOS-Stream-GenericCloud-8-20210603.0.x86_64.qcow2"
virt_infra_distro_image_checksum_url: "https://cloud.centos.org/centos/8-stream/x86_64/images/CHECKSUM"

## KVMホスト関連

# system libvirtインスタンスに接続する
virt_infra_host_libvirt_url: "qemu:///system"

# ディスクイメージが保存されるパス
virt_infra_host_image_path: "/var/lib/libvirt/images"

# デフォルトでqemuセキュリティドライバを無効にします
# これはディストリビューション特有の変数で上書きされます
virt_infra_security_driver: "none"

# デフォルトで仮想BMCは無効になっています
virt_infra_vbmc: false

# デフォルトではpipでインストールしますが、手動で実施する場合はこれをfalseに設定します
virt_infra_vbmc_pip: true

# デフォルトのvbmcサービス(ディストリビューションに応じて上書き可)
virt_infra_vbmc_service: vbmcd

# kvmhost上のネットワークはリストであり、複数追加できます
# kvmhost上でNATネットワークを作成したり削除したりすることができます(ブリッジの作成はサポートされていません)
# 'default'ネットワークはlibvirtに同梱されている標準のものです
# デフォルトでは、ネットワークは削除されません(空の不在リスト)
virt_infra_host_networks:
  absent: []
  present:
    - name: "default"
      type: "nat"
      ip_address: "192.168.122.1"
      subnet: "255.255.255.0"
      dhcp_start: "192.168.122.2"
      dhcp_end: "192.168.122.254"

# ISOイメージを作成するためのコマンド
virt_infra_mkiso_cmd: genisoimage

# KVMホストでチェックするためのバイナリのリスト
virt_infra_host_deps:
  - qemu-img
  - osinfo-query
  - virsh
  - virt-customize
  - virt-sysprep

# ゲストディスクにインストールするための、カンマ区切りのパッケージリスト
virt_infra_guest_deps:
  - cloud-init
  - qemu-guest-agent

依存関係

なし

例のインベントリ

別のvirt-infraリポジトリにサンプルインベントリファイルとサイトプレイブックがあり、役割を呼び出すのに役立つと思います。

インベントリは、管理の容易さのために複数のファイルに分割するのが良いでしょう。一般的な_kvmhost.yml_を作成し、各ゲストグループのための別々のインベントリファイルを作成することをお勧めします。Ansibleを実行する際には、ディレクトリ全体をインベントリソースとして含めることができます。

この役割で使用されるインベントリには、_kvmhost_というホストグループと、ゲスト用の他のホストグループを含む必要があります。

カスタム設定は、インベントリ内の各ホストまたはホストグループに提供できます。

新しいゲストグループを作成するには、インベントリディレクトリに新しいymlファイルを作成します。たとえば、OpenStack用の一連のゲストを作成したい場合、openstack.ymlファイルを作成し、必要に応じて入力することができます。

特定のホストまたはグループを管理するには、Ansibleの--limitオプションを使用してホストやホストグループを指定します(_kvmhost_グループも含める必要があります)。これにより、同じインベントリを使って異なるゲストを多く管理し、別々に管理することができます。

KVMホストは、libvirtネットワークが作成される場所であり、したがってそのホストグループの下で変数として指定されます。

以下は、YAML形式のインベントリファイル_kvmhost.yml_の例です。これは、localhostを接続先の_kvmhost_として指定しています。また、2つのネットワークが作成され(_default_と_example_)、1つが削除されています(_other_)。

---
## YAMLベースのインベントリ、参考:
## https://docs.ansible.com/ansible/latest/plugins/inventory/yaml.html
#
kvmhost:
  hosts:
    # ここにKVMホスト接続設定を記入してください
    localhost:
      ansible_connection: local
      ansible_python_interpreter: /usr/bin/python3
  vars:
    # ネットワークはリストであり、複数追加できます
    # kvmhost上でNATネットワークを作成したり削除したりできます(ブリッジの作成はサポートされていません)
    # 'default'ネットワークはlibvirtに同梱されている標準のものである
    # デフォルトでは、ネットワークは削除されません(空の不在リスト)
    virt_infra_host_networks:
      absent:
        - name: "other"
      present:
        - name: "default"
          ip_address: "192.168.112.1"
          subnet: "255.255.255.0"
          dhcp_start: "192.168.112.2"
          dhcp_end: "192.168.112.254"
        - name: "example"
          ip_address: "192.168.113.1"
          subnet: "255.255.255.0"
          dhcp_start: "192.168.113.2"
          dhcp_end: "192.168.113.99"

こちらは、CentOS Stream 8ゲストグループを定義している_guest.yml_という名前のゲストインベントリの例です。

---
## YAMLベースのインベントリ、参考:
## https://docs.ansible.com/ansible/latest/plugins/inventory/yaml.html
#
simple:
  hosts:
    centos-simple-[0:2]:
      ansible_python_interpreter: /usr/libexec/platform-python

VMがすべて同じであることを望む場合は、ホストグループレベルで変数を設定します。要求に応じて特定のホストのために個別に変数をオーバーライドすることがまだ可能です。

以下は、さまざまなホストグループと個別ホスト変数を設定する例です。

---
## YAMLベースのインベントリ、参考:
## https://docs.ansible.com/ansible/latest/plugins/inventory/yaml.html
#
example:
  hosts:
    centos-7-example:
      virt_infra_state: shutdown
      virt_infra_timezone: "Australia/Melbourne"
      ansible_python_interpreter: /usr/bin/python
      virt_infra_networks:
        - name: "br0"
          type: bridge
        - name: "extra_network"
          type: nat
          model: e1000
        - name: ovs-bridge
          portgroup: ovs-portgroup
          type: ovs
      virt_infra_disks:
        - name: "boot"
        - name: "nvme"
          size: "100"
          bus: "nvme"
    centos-8-example:
      virt_infra_timezone: "Australia/Adelaide"
      ansible_python_interpreter: /usr/libexec/platform-python
    opensuse-15-example:
      virt_infra_distro: opensuse
      virt_infra_distro_image: openSUSE-Leap-15.1-JeOS.x86_64-15.1.0-OpenStack-Cloud-Current.qcow2
      virt_infra_variant: opensuse15.1
      virt_infra_disks:
        - name: "boot"
          bus: "scsi"
    ubuntu-eoan-example:
      virt_infra_cpu: 2
      virt_infra_distro: ubuntu
      virt_infra_distro_image: eoan-server-cloudimg-amd64.img
      virt_infra_variant: ubuntu18.04
  vars:
    virt_infra_ram: 1024
    virt_infra_disks:
      - name: "boot"
      - name: "data"
        bus: "sata"
    virt_infra_networks:
      - name: "example"
        type: nat

複数のKVMホスト

複数のKVMホストを指定することもできます。

---
kvmhost:
  hosts:
    kvmhost1:
    kvmhost2:
    kvmhost3:
  vars:
    ansible_python_interpreter: /usr/bin/python3
    virt_infra_host_networks:
      absent: []
      present:
        - name: "default"
          ip_address: "192.168.112.1"
          subnet: "255.255.255.0"
          dhcp_start: "192.168.112.2"
          dhcp_end: "192.168.112.254"

VMを特定のKVMホストに配置するには、kvmhost変数を追加し、それに_kvmhost_グループからのホスト名を設定します。

たとえば、CentOS Stream 8のホストを3つのKVMホストに分散して配置する場合は以下のようになります。

---
simple:
  hosts:
    simple-centos-[1:2]:
      kvmhost: kvmhost1
    simple-centos-[3:4]:
      kvmhost: kvmhost2
    simple-centos-[5:6]:
      kvmhost: kvmhost3
  vars:
    ansible_python_interpreter: /usr/libexec/platform-python
    virt_infra_distro_image: "CentOS-Stream-GenericCloud-8-20210603.0.x86_64.qcow2"

VMに対してkvmhostが指定されていない場合は、kvmhostグループの最初のホスト(すなわちkvmhost[0])にデフォルトで配置されます。これはもともとの役割の動作です。

バリデーションチェックは、すべてのKVMホストが有効であり、VMのために指定されたKVMホストが_kvmhost_グループに含まれていることを確認するよう更新されています。

特定のKVMホストにVMをグループ化したい場合は、子グループを作成し、子グループレベルでkvmhostを指定してください。

再び、CentOS Stream 8ゲストを例に示します。

---
simple:
  hosts:
    simple-centos-[1:6]:
  vars:
    ansible_python_interpreter: /usr/libexec/platform-python
    virt_infra_distro_image: "CentOS-Stream-GenericCloud-8-20210603.0.x86_64.qcow2"
  children:
    simple_kvmhost1:
      hosts:
        simple-centos-[1:2]:
      vars:
        kvmhost: kvmhost1
    simple_kvmhost2:
      hosts:
        simple-centos-[3:4]:
      vars:
        kvmhost: kvmhost2
    simple_kvmhost3:
      hosts:
        simple-centos-[5:6]:
      vars:
        kvmhost: kvmhost3

例のプレイブック

Ansibleをシンプルで論理的な手順に保ち、あまり巧妙にならないように努めました。それでも、プレイブックはかなり特定のものです。

KVMホストで実行できるタスクがいくつかあり、他のタスクは特定の順序で実行される必要があります。

以下のコードは、KVMホストとゲスト設定での多くの検証チェックを実行し、正しくない部分を捕捉しようとします。

以下は、役割を呼び出すプレイブック_virt-infra.yml_の例です。

---
- hosts: all
  gather_facts: no
  roles:
    - ansible-role-virt-infra

クラウドイメージの取得

プレイブックを実行する前に、CentOS Stream 8クラウドイメージをダウンロードします。

curl -O https://cloud.centos.org/centos/8/x86_64/images/CentOS-Stream-GenericCloud-8-20210603.0.x86_64.qcow2
sudo mv -iv CentOS-Stream-GenericCloud-8-20210603.0.x86_64.qcow2 /var/lib/libvirt/images/

プレイブックの実行

次に、上記のインベントリを使用して_kvmhost_と_simple_グループのゲストに対してAnsibleプレイブックを実行します(_kvmhost_と_simple_の両方のホストグループに制限をかけています)。

ansible-playbook \
--ask-become-pass \
--inventory ./inventory.d \
--limit kvmhost,simple \
./virt-infra.yml

コマンドラインでさまざまなゲスト設定をオーバーライドすることもできます。

ansible-playbook \
--ask-become-pass \
--limit kvmhost,simple \
./virt-infra.yml \
-e virt_infra_root_password=password \
-e virt_infra_disk_size=100 \
-e virt_infra_ram=4096 \
-e virt_infra_ram_max=8192 \
-e virt_infra_cpus=8 \
-e virt_infra_cpus_max=16 \
-e '{ "virt_infra_networks": [{ "name": "br0", "type": "bridge" }] }' \
-e virt_infra_state=running

クリーンアップ

ホストグループ内のゲストを削除するには、それらを指定し(または特定のホスト)、コマンドライン引数として_virt_infra_state=undefined_を渡すことができます。

これにより、ゲストの状態が未定義にオーバーライドされ、存在する場合は削除されます。

たとえば、_simple_ホストグループ内のすべてのVMを削除するためには以下のようになります。

ansible-playbook \
--ask-become-pass \
--inventory simple.yml \
--limit kvmhost,simple \
--extra-vars virt_infra_state=undefined \
./virt-infra.yml

単にシャットダウンしたい場合は、代わりに_virt_infra_state=shutdown_を試してください。

たとえば、単に_simple-centos-2_ホストをシャットダウンしたい場合は以下のようになります。

ansible-playbook \
--ask-become-pass \
--inventory simple.yml \
--limit kvmhost,simple-centos-2 \
--extra-vars virt_infra_state=shutdown \
./virt-infra.yml

セットアップ後の構成

インフラがセットアップされたら、同じインベントリに対して別のプレイブックを実行して、それらのマシンで任意の作業を行うことができます...

---
- hosts: all,!kvmhost
  tasks:
    - name: すべてのパッケージをアップグレード
      package:
        name: '*'
        state: latest
      become: true
      register: result_package_update
      retries: 30
      delay: 10
      until: result_package_update is succeeded

    - name: パッケージをインストール
      package:
        name:
          - git
          - tmux
          - vim
        state: present
      become: true
      register: result_package_install
      retries: 30
      delay: 10
      until: result_package_install is succeeded

ライセンス

GPLv3

著者情報

Chris Smart https://blog.christophersmart.com

プロジェクトについて

Define and manage guests and networks on a KVM host with Ansible

インストール
ansible-galaxy install csmart.virt_infra
ライセンス
gpl-3.0
ダウンロード
1.2k
所有者
Just another Linux guy.