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設定ファイルに追加されるサブネット宣言のリストが含まれます。各サブネット宣言にはipnetmaskが必要であり、他のオプションは必須ではありません。このセクションの始まりには例があり、続いてサポートされているオプションの全体的な概要があります。

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つのキーを持つ辞書のリストであり、namemacは必須です:

オプション コメント
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 role for setting up ISC DHCPD.

インストール
ansible-galaxy install bertvv.dhcp
ライセンス
other
ダウンロード
124.4k
所有者
Hi! My contribs are often related to my job (teaching Linux), but are mostly done in my free time. I can't always respond quickly to PRs and Issues. Sorry!