cloud-init でのカスタム・ネットワーク設定
インスタンスのカスタム・ネットワークの設定には cloud-init を 使うこともできます。
しかし、 cloud-init を使おうとする前に、これから使おうとするイメージ・ソース をどれにするかをまず決めてください。というのも、全てのイメージに cloud-init パッケージがインストールされているわけではないからです。 これを書いている時点では、 images.linuxcontainers.org で提供されている イメージには cloud-init パッケージはインストールされていません。そのため、 このガイドで説明されている設定オプションはどれも動かないでしょう。一方、 cloud-images.ubuntu.com で提供されているイメージには必要なパッケージが インストールされており、アーカイブのテンプレートディレクトリには 以下のファイル
cloud-init-meta.tpl
cloud-init-user.tpl
cloud-init-vendor.tpl
cloud-init-network.tpl
と、それ以外に cloud-init に無関係なファイルが置かれています。
cloud-images.ubuntu.com にあるイメージで提供されるテンプレートは
metadata.yaml
に以下のような設定を含んでいます。
/var/lib/cloud/seed/nocloud-net/network-config:
when:
- create
- copy
template: cloud-init-network.tpl
そのため、インスタンスを作成するかコピーすると、事前に定義したテンプレートから ネットワーク設定が新たに生成されます。
cloud-init は、network-config ファイルを使い、Ubuntu リリースに応じて ifupdown もしくは netplan のどちらかを使って、システム上の関連する設定 を行います。
デフォルトではインスタンスの eth0 インタフェースで DHCP クライアントを使うように なっています。
これを変更するためには設定ディクショナリ内の user.network-config キーを 使ってあなた自身のネットワーク設定を定義する必要があります。その設定が デフォルトの設定をオーバーライドするでしょう(これはテンプレートがそのように 構成されているためです)。
例えば、ある特定のネットワーク・インタフェースを静的 IPv4 アドレスを持ち、 カスタムのネームスペースを使うようにするには、以下のようにします。
config:
user.network-config: |
version: 1
config:
- type: physical
name: eth1
subnets:
- type: static
ipv4: true
address: 10.10.101.20
netmask: 255.255.255.0
gateway: 10.10.101.1
control: auto
- type: nameserver
address: 10.10.10.254
この結果、インスタンスの rootfs には以下のファイルが作られます。
/var/lib/cloud/seed/nocloud-net/network-config
/etc/network/interfaces.d/50-cloud-init.cfg
(ifupdown を使う場合)/etc/netplan/50-cloud-init.yaml
(netplan を使う場合)
実装詳細
cloud-init によって /var/lib/cloud/seed/nocloud-net
にある以下のファイルを使って
インスタンスの設定を生成することができます。
user-data
(必須)meta-data
(必須)vendor-data
(省略可能)network-config
(省略可能)
network-config ファイルはイメージに付属するテンプレートで提供されるデータを使って LXD によって書き出されます。これは metadata.yaml で調整されますが、 LXD に関する 限り、設定キーとテンプレートの内容はハードコーディングされていません。これは純粋に イメージのデータであり、必要なら変更できます。
- NoCloud のデータソースのドキュメント
- NoCloud データソース のソースコード
- cloud-init のユニットテスト がどの値が使用可能かについての良いリファレンスになります。
- cloud-init のディレクトリ構造
"ubuntu:" イメージソースからのイメージで提供されるデフォルトの cloud-init-network.tpl
は以下のようになっています。
{% if config\_get("user.network-config", "") == "" %}version: 1
config:
- type: physical
name: eth0
subnets:
- type: {% if config_get("user.network_mode", "") == "link-local" %}manual{% else %}dhcp{% endif %}
control: auto{% else %}{{ config_get("user.network-config", "") }}{% endif %}
テンプレートの文法は pongo2 (訳注: https://github.com/flosch/pongo2 )
テンプレート・エンジンで使われているものです。 (訳注: LXD 用に) config_get
と
いうカスタム関数が定義されており、インスタンス設定から値を取得するのに使用できます。
そのようなテンプレート構造で利用可能なオプションには以下のものがあります。
- eth0 インタフェースでデフォルトで DHCP を使用する
user.network_mode
をlink-local
に設定し、手動でネットワークを設定するuser.network-config
を定義することにより cloud-init を設定する