bertvv.dhcp
Ansibleロール dhcp
ISC DHCPDをセットアップするためのAnsibleロールです。このロールの責任は、パッケージのインストールと設定の管理(dhcpd.conf(5))です。ファイアウォールの設定管理はこのロールの範囲外です。これをローカルプレイブックで行うか、別のロール(例えば、bertvv.rh-base)を使用してください。
各リリースの重要な変更については、変更ログを参照してください。
このロールを使用/気に入っていますか?スターを付けることを検討してください。このロールをAnsible Galaxyで評価し、改善点があれば問題を開くか、PRを作成してフィードバックを提供してください。ありがとうございます!
要件
特別な要件はありません。
ロール変数
このロールは、グローバルオプションを設定したり、サブネット宣言を指定したりできます。
テスト環境でのDHCPサーバの動作例については、テストプレイブックを参照してください。このセクションは、サポートされているすべてのオプションのリファレンスです。
グローバルオプション
以下の変数を設定すると、DHCP設定ファイルのグローバルセクションに追加されます。デフォルト値が指定されていない場合、その設定はdhcpd.conf(5)
から除外されます。
これらのオプションについての詳細は、dhcp-options(5)のマニュアルページを参照してください。
変数名 | コメント |
---|---|
dhcp_global_authoritative |
グローバル権威状態 (authoritative , not authoritative ) |
dhcp_global_booting |
グローバルブート設定 (allow , deny , ignore ) |
dhcp_global_bootp |
グローバルbootp設定 (allow , deny , ignore ) |
dhcp_global_broadcast_address |
グローバルブロードキャストアドレス |
dhcp_global_classes |
マッチステートメントを持つクラス定義(1) |
dhcp_global_default_lease_time |
デフォルトリース時間(秒) |
dhcp_global_domain_name_servers |
DNSサーバのIPアドレスのリスト(2) |
dhcp_global_domain_name |
クライアントがホスト名を解決する際に使用するドメイン名 |
dhcp_global_domain_search |
クライアントが非FQDNを見つけるために使用するドメインのリスト(1) |
dhcp_global_failover |
フェイルオーバーピア設定 (3) |
dhcp_global_failover_peer |
フェイルオーバーピアの名前 (例: foo ) |
dhcp_global_filename |
ブート要求用のファイル名 |
dhcp_global_includes_missing |
ブール値。 役割のファイルが欠落している場合の継続/ |
dhcp_global_includes |
含める設定ファイルのリスト(dhcp_config_dir から) |
dhcp_global_log_facility |
グローバルログ施設(例: daemon , syslog , user , ...) |
dhcp_global_max_lease_time |
最大リース時間(秒) |
dhcp_global_next_server |
PXEブートサーバのIP |
dhcp_global_ntp_servers |
NTPサーバのIPアドレスのリスト |
dhcp_global_omapi_port |
OMAPIポート |
dhcp_global_omapi_secret |
OMAPIシークレット |
dhcp_global_other_options |
任意の追加グローバルオプションの配列 |
dhcp_global_routers |
ルーターのIPアドレス |
dhcp_global_server_name |
クライアントに送信されるサーバ名 |
dhcp_global_server_state |
サービス状態(起動中、停止中) |
dhcp_global_subnet_mask |
グローバルサブネットマスク |
dhcp_custom_includes |
含めるjinja設定ファイルのリスト(dhcp_config_dir から) |
dhcp_custom_includes_modes |
目的のカスタム設定ファイルのモードのリスト |
備考
(1) このロールはマッチステートメントを持つクラスの定義をサポートしています。例:
# VirtualBox VM用のクラス
dhcp_global_classes:
- name: vbox
match: 'match if binary-to-ascii(16,8,":",substring(hardware, 1, 3)) = "8:0:27"'
クラス名はアドレスプールの定義に使用できます(下記参照)。
(2) ロール変数dhcp_global_domain_name_servers
は、リスト(複数項目がある場合)または文字列(1項目のみの場合)のいずれかとして書くことができます。以下のスニペットは、両方の例を示しています:
# 単一のDNSサーバ
dhcp_global_domain_name_servers: 8.8.8.8
# DNSサーバのリスト
dhcp_global_domain_name_servers:
- 8.8.8.8
- 8.8.4.4
(3) このロールはフェイルオーバーピアの定義もサポートしています。例:
# フェイルオーバーピア定義
dhcp_global_failover_peer: failover-group
dhcp_global_failover:
role: primary # | secondary
address: 192.168.222.2
port: 647
peer_address: 192.168.222.3
peer_port: 647
max_response_delay: 15
max_unacked_updates: 10
load_balance_max_seconds: 5
split: 255
mclt: 3600
変数dhcp_global_failover_peer
には、プールごとに使用される設定されたピア名が含まれています。フェイルオーバー宣言オプションは、変数dhcp_global_failover
で指定され、その辞書には以下のオプションが含まれます:
オプション | 必須 | コメント |
---|---|---|
address |
いいえ | このサーバのIPアドレス |
hba |
いいえ | コロンで区切られた16進数リスト |
load_balance_max_seconds |
いいえ | 負荷分散が無効になるカットオフ(推奨3〜5) |
max-balance |
いいえ | フェイルオーバープールバランスステートメント |
max-lease-misbalance |
いいえ | フェイルオーバープールバランスステートメント |
max-lease-ownership |
いいえ | フェイルオーバープールバランスステートメント |
max_response_delay |
いいえ | フェイルオーバーを開始する前に連絡を取らなかった最大秒数 |
max_unacked_updates |
いいえ | BNDUPDを送信する前に受信するBNDACKの最大数(推奨10) |
mclt |
いいえ | 最大クライアントリードタイム |
min-balance |
いいえ | フェイルオーバープールバランスステートメント |
peer_address |
いいえ | フェイルオーバーピアのIPアドレス |
peer_port |
いいえ | このサーバのポート(通常519/520または647/847) |
port |
いいえ | このサーバのポート(通常519/520または647/847) |
role |
いいえ | primary, secondary |
split |
いいえ | 負荷分散の分割(0-255) |
フェイルオーバーピアの指示は、アドレスプールの定義に含まれる必要があります(下記参照)。
サブネット宣言
ロール変数dhcp_subnets
には、DHCP設定ファイルに追加されるサブネット宣言のリストが含まれます。各サブネット宣言にはip
とnetmask
が必要であり、他のオプションは必須ではありません。このセクションの始まりには例があり、続いてサポートされているオプションの全体的な概要があります。
dhcp_subnets:
- ip: 192.168.222.0
netmask: 255.255.255.128
domain_name_servers:
- 10.0.2.3
- 10.0.2.4
range_begin: 192.168.222.50
range_end: 192.168.222.127
- ip: 192.168.222.128
default_lease_time: 3600
max_lease_time: 7200
netmask: 255.255.255.128
domain_name_servers: 10.0.2.3
routers: 192.168.222.129
サブネット宣言でサポートされているオプションのアルファベット順のリスト:
オプション | 必須 | コメント |
---|---|---|
booting |
いいえ | allow, deny, ignore |
bootp |
いいえ | allow, deny, ignore |
default_lease_time |
いいえ | このサブネットのデフォルトリース時間(秒) |
domain_name_servers |
いいえ | このサブネットのドメイン名サーバのリスト(1) |
domain_search |
いいえ | 非FQDNを解決するためのドメイン名のリスト(1) |
filename |
いいえ | ブートサーバから取得するファイル名 |
hosts |
いいえ | 各サブネットの固定IPアドレスホストのリスト、dhcp_hostsに似ている |
interface |
いいえ | サブネット宣言のinterface をオーバーライド |
ip |
はい | 必須。 サブネットのIPアドレス |
max_lease_time |
いいえ | このサブネットの最大リース時間(秒) |
netmask |
はい | 必須。 サブネットのネットマスク(ドット10進法表記) |
next_server |
いいえ | ブートサーバのIPアドレス |
ntp_servers |
いいえ | このサブネットのNTPサーバのリスト |
range_begin |
いいえ | 割り当てられる動的IPアドレスの範囲で最も低いアドレス |
range_end |
いいえ | 割り当てられる動的IPアドレスの範囲で最も高いアドレス |
ranges |
いいえ | 複数の範囲が必要な場合は、リストとして指定できます (2) |
routers |
いいえ | このサブネットのゲートウェイのIPアドレス |
server_name |
いいえ | クライアントに送信されるサーバ名 |
subnet_mask |
いいえ | サブネット宣言のnetmask をオーバーライド |
options |
いいえ | このサブネットに追加するオプションの辞書 |
サブネット内でアドレスプールを指定するには、pools
オプションを設定します。これにより、同じネットワークセグメントやサブネット内でも、別のアドレスプールを異なる扱いとして指定できます。これは、すべてのキーがオプショナルな辞書のリストです:
オプション | コメント |
---|---|
allow |
このプールに許可されたホストを指定します(1) |
default_lease_time |
このプールのデフォルトリースタイム |
deny |
このプールで許可されていないホストを指定します |
domain_name_servers |
このプールで使用されるドメイン名サーバ(1) |
failover_peer |
フェイルオーバーサーバを指定 |
max_lease_time |
このプールの最大リース時間 |
min_lease_time |
このプールの最小リース時間 |
range_begin |
このプール内の最も低いアドレス |
range_end |
このプール内の最も高いアドレス |
ranges |
複数の範囲が必要な場合はリストとして指定できます(2) |
(1) allow
およびdeny
フィールドのオプションは、dhcpd.conf(5)に記載されており、次のようになります:
booting
bootp
client-updates
known-clients
members of "CLASS"
unknown-clients
(2) 複数のサブネット範囲は、次のように指定できます:
ranges:
- { begin: 192.168.222.50, end: 192.168.222.99 }
- { begin: 192.168.222.110, end: 192.168.222.127 }
ホスト宣言
MACアドレスに基づいて固定IPアドレスを取得するホストを指定するには、dhcp_hosts
オプションを設定します。これは、次の3つのキーを持つ辞書のリストであり、name
とmac
は必須です:
オプション | コメント |
---|---|
name |
ホストの名前 |
mac |
ホストのMACアドレス |
ip |
ホストに割り当てられるIPアドレス |
hostname |
DHCPを介して割り当てられるホスト名(オプション) |
dhcp_hosts:
- name: cl1
mac: '00:11:22:33:44:55'
ip: 192.168.222.150
- name: cl2
mac: '00:de:ad:be:ef:00'
ip: 192.168.222.151
PXEBootサーバの指定
dhcp_pxeboot_server
変数を設定すると、PXEクライアントを指定したPXEBootサーバにリダイレクトしてネットワークからブートします。指定されたサーバには、期待される場所にブートイメージが必要です。例えば、bertvv.pxeserverを使用してそれを構成します。
カスタムインクルード
dhcp_custom_includes
変数にjinjaテンプレートを設定すると、カスタム設定を使用できるようになり、その後dhcpd.conf
ファイルに含まれます。テンプレートファイル名に.j2
拡張子がある場合は、ファイル名から削除され、それ以外の場合はテンプレートファイル名が宛先に保持されます。
dhcp_custom_includes:
- custom-dhcp-config.conf[.j2]
宛先カスタム設定ファイルのデフォルトモードは0644です。これを変更するには、変数dhcp_custom_includes_modes
を設定します。zip_longestフィルターがdhcp_custom_includes
変数と一緒に使用されます。
dhcp_custom_includes_modes:
- '0600'
テンプレート内で使用するために独自の変数を作成でき、完全な柔軟性を提供します。変数の競合を避けるために、このロール内で参照されていない変数を使用してください。これにより、複数の.conf
ファイルに重複した設定が作成されることを防ぎます。
dhcp_custom_hosts:
- name: Juniper1
mac: 'de:ad:c0:de:ca:fe'
ip: 192.168.35.160
options:
- name: tftp-server-name
value: 192.168.35.152
- name: host-name
value: Juniper1
- name: NEW_OP.transfer-mode
value: "http"
- name: NEW_OP.config-file-name
value: "/configurations/j1-switch.config"
最後に、jinjaテンプレートには有効なISC DHCPD構成(dhcpd.conf(5))が含まれなければなりません。これは、juniper Zero-Touch-Provisioningのためにbertvv.dhcpを使用する例です。
option space NEW_OP;
option NEW_OP.image-file-name code 0 = text;
option NEW_OP.config-file-name code 1 = text;
option NEW_OP.image-file-type code 2 = text;
option NEW_OP.transfer-mode code 3 = text;
option NEW_OP.alt-image-file-name code 4= text;
option NEW_OP.http-port code 5= text;
option NEW_OP-encapsulation code 43 = encapsulate NEW_OP;
{% if dhcp_custom_hosts is defined %}
#
# ホスト宣言
#
{% for host in dhcp_custom_hosts %}
host {{ host.name | replace (" ","_") | replace ("'","_") | replace (":","_") }} {
hardware ethernet {{ host.mac }};
{% if host.ip is defined %}
fixed-address {{ host.ip }};
{% endif %}
{% if host.options is defined %}
{% for option in host.options %}
{{ option.name }} "{{ option.value }}"
{% endfor %}
{% endif %}
}
{% endfor %}
{% endif %}
依存関係
依存関係はありません。
例プレイブック
テストプレイブックを参照してください。
テスト
このプレイブックのテストを実行するには、Molecule、VirtualBox、およびVagrantをインストールする必要があります。コマンドmolecule converge
を実行すると、IPアドレス192.168.222.2のホスト専用インターフェースを持つVirtualBox VMが作成されます。テストするには、例としてnmapのdhcp-discoverスクリプトを使用できます:
$ sudo nmap --script broadcast-dhcp-discover -e vboxnet7
Nmap 7.91を開始 ( https://nmap.org ) 2021-11-30 11:32 CET
プリスキャンスクリプトの結果:
| broadcast-dhcp-discover:
| 応答 1 of 2:
| インターフェース: vboxnet7
| 提供されたIP: 192.168.222.50
| DHCPメッセージタイプ: DHCPOFFER
| サーバ識別子: 192.168.222.2
| IPアドレスリース時間: 5m00s
| サブネットマスク: 255.255.255.0
| ドメイン名サーバ: 10.0.2.3, 10.0.2.4
| ドメイン名: example.com
| ブロードキャストアドレス: 192.168.222.255
| 応答 2 of 2:
| インターフェース: vboxnet7
| 提供されたIP: 192.168.222.50
| DHCPメッセージタイプ: DHCPOFFER
| サーバ識別子: 192.168.222.2
| IPアドレスリース時間: 5m00s
| サブネットマスク: 255.255.255.0
| ドメイン名サーバ: 10.0.2.3, 10.0.2.4
| ドメイン名: example.com
|_ ブロードキャストアドレス: 192.168.222.255
警告: ターゲットが指定されていないため、0ホストがスキャンされました。
Nmap終了: 0 IPアドレス (0ホストが稼働中) が10.19秒でスキャンされました
ライセンス
BSD
貢献
問題、機能リクエスト、アイデアは歓迎し、Issuesセクションに投稿できます。プルリクエストも大歓迎です。できれば、トピックブランチを作成し、提出時にコミットを1つにまとめて(説明的なメッセージ付き)ください。
貢献者
ansible-galaxy install bertvv.dhcp