如何使用 cloudinit 运行自定义安装命令/脚本

问题描述

我正在使用 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_modulesscripts-user 中的 cloud_final_modules 已经在 /etc/cloud/cloud.cfg 中默认指定,因此除非您想明确关闭其他正在使用的模块cloud-init(除非有充分的理由,否则您不想这样做),您不需要在 cloud-config 中指定 cloud_config_modulescloud_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.logTracebackWARN 以了解失败的原因。搜索 rumcmdscripts-user 应该会告诉您这些命令是否运行以及写入的内容在哪里。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...