普通にISOからインストールした環境でなく、クラウドイメージなどからcloud-init使ってプロビジョニングしたOSの場合、/etc/hostsファイルは外部管理となって直接編集してもOS起動時に所定の内容に上書きされる。
平たく言うと、以下の仕掛けで作った環境ではこの動作になる。
/etc/hostsファイルを見れば変更したい場合にどうすれば良いかはコメントに記載があるのでその通りにすればいいけど、とりあえず備忘録。
対処方法としては2通り。
テンプレートを変更する
/etc/hostsファイルに書かれてる(a)の方法。
/etc/hostsファイルでなく別のファイルをメンテナンスする。
# a.) make changes to the master file in /etc/cloud/templates/hosts.redhat.tmpl
これはディストリビューションによってファイルは異なる。
DebianやUbuntuであればファイル名はhosts.debian.tmplで、Fedoraであれば上記と同じくhosts.redhat.tmplが使用される。
中身はJinja2テンプレートで記載できるが、hostsに書きたいエントリがあれば末尾に追記しておけば、OS起動時にはこのテンプレートファイルから/etc/hostsファイルが生成される。
cloud-initからhostsファイル管理を除外する
/etc/hostsファイルに書かれてる(b)の方法。
この方法は/etc/hostsファイルを直接メンテできるようになる。
# b.) change or remove the value of 'manage_etc_hosts' in # /etc/cloud/cloud.cfg or cloud-config from user-data
/etc/cloud/cloud.cfgファイルの該当の設定をコメントアウトすることで、OS起動時のcloud-initによる/etc/hostsを更新する処理を停止できる。
…なんだけど、手元の環境(RHEL9 / Fedora40 / Ubuntu 22.04 / Ubuntu 24.04)ではファイル内にmanage_etc_hostsに関する記述が無い。
試した限りでは、似たような雰囲気の設定である、cloud_config_modulesのリストにあるupdate_etc_hostsを削除すれば良い。
cloud_init_modules: - migrator - seed_random - bootcmd - write_files - growpart - resizefs - disk_setup - mounts - set_hostname - update_hostname - update_etc_hosts # この行を削除かコメントアウトする - ca_certs - rsyslog - users_groups - ssh
これで、/etc/hostsファイルを直接編集してもOSリブートでリセットされなくなる。
実際の設定がコメントと異なるのはcloud-initか何かのバージョンかな?