csmart.virt_infra
Ansible役割: 仮想インフラストラクチャ
この役割は、1台以上のKVMホスト上でネットワークとゲストを定義し、管理するためのものです。Ansibleの--limit
オプションを利用して、個別に管理することもグループとして管理することもできます。
これは主に開発作業向けに設計されており、KVMホストがローカルマシンで、sudo
が使え、libvirtd
にqemu:///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で登場します...
- https://bugzilla.redhat.com/show_bug.cgi?id=1719978
- https://bugzilla.redhat.com/show_bug.cgi?id=1756015
使用可能になったときの手順は以下の通りです。
# 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
注意:
- 上記のIPv6ブロック2001:0db8/32は、ドキュメンテーションのために提供されています。通常は、IPv6プロバイダーから割り当てられた独自の/48ブロックに置き換える必要があります。
- libvirtドキュメントで推奨されているので、
ip6_prefix: 64
を維持することをお勧めします。
NetworkManagerを使ったブリッジの設定
このコードは、VMをLinuxとOpen vSwitchのブリッジに接続することをサポートしていますが、これらはKVMホスト上ですでに存在している必要があります。
まず、変換したいデバイスをエクスポートします(例: eth1
)。
export NET_DEV="eth1"
次に、上記のエクスポートされたデバイスの現在のNetworkManager接続をリスト表示し、後で無効にするための準備をします。
sudo nmcli con |egrep -w "${NET_DEV}"
これにより、System eth1
やWired 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
の下にbr0
をname
として指定します。
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-bridge
をdevice
として使用でき、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/_)
次のゲストを正常にテストしました:
- CentOS 7
- CentOS Stream 8
- Fedora 33
- Fedora 34
- Debian 10
- Ubuntu 18.04 LTS
- Ubuntu 20.04 LTS
- openSUSE 15.3 JeOS
ゲストを設定し、そのIPを取得するために、どちらもcloud-init
とqemu-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