V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
atuocn
V2EX  ›  Linux

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

  •  
  •   atuocn · 2020-04-29 10:57:37 +08:00 · 2813 次点击
    这是一个创建于 1455 天前的主题,其中的信息可能已经有所发展或是发生改变。

    忽然惊喜的发现,自己原来写在 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 就会自动修改密码了。
    3 条回复    2023-04-14 14:09:43 +08:00
    defunct9
        1
    defunct9  
       2020-04-29 20:08:21 +08:00 via iPhone
    赞之
    garibellee
        2
    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
        3
    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 这个代码跑起来没啥问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5610 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 06:42 · PVG 14:42 · LAX 23:42 · JFK 02:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.