问题描述
我正在使用 multipass
运行 cloudinit
并且我有一个 bash 脚本,我需要在 VM 部署一次后运行该脚本,但需要针对每个用户帐户运行。它包含简单的命令,主要用于自定义 vim 和 bash.rc
。我怎样才能做到这一点?
我尝试使用 runcmd feature of cloudinit,但它是 a bit problematic,即使像下面这样的简单命令也不会输出任何内容。
package_update: true
package_upgrade: true
packages:
- git
- openssh-server
- zip
- tree
- vim
- htop
- net-tools
- sysstat
- locate
cloud_config_modules:
- runcmd
cloud_final_modules:
- scripts-user
runcmd:
- [ ls,-l,/ ]
- [ sh,-xc,"echo $(date) ': Hello World!'" ]
- [ bash,-c,echo "=========hello world'=========" >>foo.bar]
users:
- name: aryan
lock_passwd: true
sudo: ALL=(ALL) nopASSWD:ALL
shell: /bin/bash
ssh_authorized_keys:
- ...
解决方法
这个要点在技术上是正确的,但有点误导。 runcmd
中的 cloud_config_modules
和 scripts-user
中的 cloud_final_modules
已经在 /etc/cloud/cloud.cfg
中默认指定,因此除非您想明确关闭其他正在使用的模块cloud-init(除非有充分的理由,否则您不想这样做),您不需要在 cloud-config 中指定 cloud_config_modules
或 cloud_final_modules
。
您是否在用户数据脚本的顶部包含了 #cloud-config
?如果不是,则您的云配置无效。如果您确实包含它,这些 runcmds 将全部起作用。 ls
的输出和日期/回声将在 /var/log/cloud-init-output.log
中,foo.bar
将在 /
中。如果没有,则说明您的云配置存在其他问题,或者导致 cloud-init 无法完全初始化。
在您启动的实例上,您可以运行 cloud-init status --long
以查看 cloud-init 是成功还是失败。您还可以检查 /var/log/cloud-init.log
的 Traceback
或 WARN
以了解失败的原因。搜索 rumcmd
或 scripts-user
应该会告诉您这些命令是否运行以及写入的内容在哪里。