cloud-init 几点笔记及 centos 莫名改 hostname 问题。

2020-04-29 10:57:37 +08:00
 atuocn

忽然惊喜的发现,自己原来写在 oschina 上的文章,找到入口了。自从它要求绑定手机后,因不想提供手机号,我再也没找到原来的文章。既然失而复得,转几个还有点价值的文章到这里,以免再次丢失。

原文写于 2017/07/18 16:29


一个奇怪的问题

前几天在 hyper-v 上搭一个 centos 虚拟机。不想一步步地安装,就用 centos 官方的 generic cloud-init enabled image 搭建了。把网络配置为 static ip 地址,然后发生一个奇怪的现象,不论怎么改 hostname,过一段时间都会自动在 hostname 后附加一个 .localdomain

改 /etc/hostname , 改 /etc/network , 改 /etc/hosts , 改 /etc/resolv.cfg ,hostnamectl 都无效。查看日志终于发现是 cloud-init 服务在修改 hostname 。只要阻止 cloud-init 服务改 hostname 就好了,可在 /etc/cloud/cloud.cfg.d 的目录下增加一个配置文件。执行:

sudo echo "preserve_hostname: 1" > /etc/cloud/cloud.cfg.d/00_preserve_hostname.cfg

或者另一个办法,把 /etc/cloud/cloud.cfg 配置文件中把一下 2 行删掉:

- set_hostname
- update_hostname

注:cloud-init 的 0.7.9 版的 changelog 中提到一条:

    set_hostname: avoid erroneously appending domain to fqdn 。 可能作为 bug 修复掉了吧[centos 7 目前(2017/7/18)使用的是 0.7.5 版]

cloud-init 文档阅读笔记

对 cloud-init 一直都比较模糊,只知道和 openstack 之类的云服务平台有关。以前下载来的虚拟机云映像文件,不知道登入密码,搜索的时候总有高手神秘的说一句 #cloud-cofig 啥啥啥的,然而具体怎么搞,一头雾水。偶只想搭个服务器,不想搞云平台,偶的笨办法就是挂载映像文件,然后操作映像里的文件-_-!!!

好吧,解决这次问题,还是阅读了一下 cloud-init 的文档,同时记点笔记。

  1. cloud-init 是个服务,装在 guest os 里,guest os 在启动的时候,对虚拟机进行必要的初始化,例如修改密码,修改配置等等。
  2. cloud-init 初始化虚拟机一个必要的事项就是如何拿到初始化的配置数据。提供配置数据的服务方叫 datasource 。根据不同的云服务平台,openstack, amz, azure 等,cloud-init 实现了不同的数据源。例如 config driver 数据源,就是生成一个磁盘映像,虚拟机启动时 cloud-init 寻找特定的文件系统,找到后获取配置数据,进行初始化。
  3. 数据源里的配置数据分为 meta-data 和 user-data 。meta-data 主要是云服务平台要用的配置,例如 server name, instance id ; user-data 则是由用户定义的虚拟机相关的配置,脚本等。
  4. 对于非云平台的情况,cloud-init 提供一种 datasource,叫 NoCloud 。借助 NoCloud,cloud-init 可也初始化虚拟机。NoCloud 有点像 config driver,然而更简单。配置文件放在一个 vfat 或 iso9660 文件系统上,文件系统的 lable 必须是 cidata 。
  5. cloud-init 服务,在 systemd 里有一个 generator,会自动的判断是否启动 cloud-init 服务。所以普通的 systemctl disable 是不能停止 cloud-init 服务。0.7.7 以上版本提供一个简单办法,放一个文件 /etc/cloud/cloud-init.disabled,就可阻止 cloud-init 。

centos 虚拟机云映像怎么改登入密码的方法来了:D

  1. 创建 2 个文件,user-data 和 meta-data 。
/user-data
/meta-data
  1. user-data 文件内容:
 #cloud-config
 password: passw0rd
 chpasswd: { expire: False }
 ssh_pwauth: True
  1. meta-data 文件内容。虚拟机实例 id 为 iid-local01,hostname 设为 cloudimg. 虚拟机根据 instance-id 判断该实例是否是第一次启动。大部分的配置数据只在第一次启动时初始化。
instance-id: iid-local01
local-hostname: cloudimg
  1. 制作一个 iso 光盘映像,在 windows 下,我使用 mkisofs.exe ,ultraiso 之类的也应该可以。seed.iso 为创建的 iso 光盘映像文件名。
mkisofs.exe -r -R -J -l -L -V cidata -o seed.iso meta-data user-data
  1. 把 seed.iso 挂载到虚拟机光盘里。启动虚拟机,cloud-init 就会自动修改密码了。
2819 次点击
所在节点    Linux
3 条回复
defunct9
2020-04-29 20:08:21 +08:00
赞之
garibellee
2023-04-13 15:46:19 +08:00
23 年了 pve7 下 centos cloud-init hostname 还是有问题创建时候 hostname 一直 localhost 但是 /etc/hosts 里面能取到 {{hostname}} {{fqdn}} ,试了 ubuntu 和 debain 都正常,还有就是( centos-cloud-init ) ipv6 不能用 dhcp ,尽量用自动,不然开机回卡在网络配置上
garibellee
2023-04-14 14:09:43 +08:00
已解决 摸鱼时间看了看 cloud-init.log 然后顺藤摸瓜改了 /usr/lib/python2.7/site-packages/cloudinit/config/cc_set_hostname.py 的代码搞定了,还是 centos 里面 cloud-init 版本低了,其他发行版 /usr/lib/python3/dist-packages/cloudinit/config/cc_set_hostname.py 这个代码跑起来没啥问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/667205

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX