プライベートDHCP
ベースのネットワークのDebianGNU/Linuxシステムでdnsmasq(8)
を構成しようとしています。ローカルの手動セットアップ中(dnsmasq
istelfをインストールした後)、次の行を含めることができます。
_prepend domain-name-servers 127.0.0.1;
_
_/etc/dhcp/dhclient.conf
_で、ネットワークを再起動します。これには、_/etc/resolv.conf
_のローカルホストが含まれ、準備が整います。 (参照: http://wiki.debian.org/HowTo/dnsmasq#Local_Caching )
ただし、特にconfiguration-managmentソフトウェアを使用している場合に、同じことをリモートで実行しようとすると、ネットワーク接続が失われます。目標はネットワークの再起動ではなく、_resolv.conf
_ ..を更新することなので、
ネットワーク接続を稼働させたまま、dhclient(8)
に_resolv.conf
_を強制的に更新するにはどうすればよいですか?
[編集]
以下で私のために働いたスクリプトを見つけてください:
_if grep '^\s*nameserver\>.\+\<127\.0\.0\.1\>' /etc/resolv.conf >/dev/null; then
: # do nothing
else
grep -v '^\s*nameserver\>' /etc/resolv.conf > /tmp/resolv.conf.new
echo "nameserver 127.0.0.1" >> /tmp/resolv.conf.new
grep '^\s*nameserver\>' /etc/resolv.conf >> /tmp/resolv.conf.new
mv -f /tmp/resolv.conf.new /etc/resolv.conf
fi
_
それはちょっと厄介です-そして私はまだより良い解決策を探しています。
Ansibleを介してdnsmasqを設定するときに同じ問題に直面しました。 Debian jessieでは、dhclient.confを更新して次のことを行うことができます。
/usr/bin/killall dhclient
dhclient INTERFACE
または、必要に応じて:
dhclient -x
dhclient INTERFACE
これにより、リースの有効期限が切れて別のIPアドレスを取得しない限り、接続が切断されることはありません。
あなたは構成管理について言及しています。 ansibleを使用している場合、これが私のプレイブックの関連部分です。
tasks:
- name: Ensure a correct resolv.conf
template: src=templates/resolv.conf.j2 dest=/etc/resolv.conf
- name: Ensure dhclient config wont mess up my resolv.conf
template: src=dhclient.conf.j2 dest=/etc/dhcp/dhclient.conf
notify: Kill dhclient
handlers:
- name: Kill dhclient
command: /usr/bin/killall dhclient
ignore_errors: yes
changed_when: false
Dhclientを強制終了した後、再起動しないことに注意してください。これは私の環境ではうまく機能しますが、YMMVです。スクリプトをコピーしてdhclientの停止/開始を処理する別のタスクを追加し、ハンドラーからそのタスクを呼び出すことができます(おそらく、{{ansible_default_ipv4.interface}}
を使用してインターフェイスの名前を取得することもできます)。
私のdhclient.conf
テンプレートは次のようなものです。
send Host-name = gethostname();
request subnet-mask, broadcast-address, time-offset, routers, Host-name, interface-mtu, rfc3442-classless-static-routes, ntp-servers, dhcp6.fqdn, dhcp6.sntp-servers;
したがって、ほとんどの場合、デフォルトのDebianのdhclient.conf
は、DNS関連のディレクティブを使用していません。