我目前正在处理CoreOS,到目前为止,我认为我有了整体的想法和概念.我还没有得到的一件事就是执行cloud-init
.
我知道这cloud-init
是一个为CoreOS做一些配置的过程.我还不明白的是......
cloud-init
?在第一次启动?每次开机?...?cloud-init
知道在哪里找到它的配置数据?我已经看到有config-drive
,这完全有道理,但这是唯一的方法吗?user-data
文件的作用究竟是什么?...?我正在使用AWS Cloudformation为我的Web应用程序设置网络基础结构的许多元素(VPC,安全组,子网,自动调节组等).我希望整个过程自动化.我想点击一个按钮,然后能够启动整个事情.
我已经成功创建了一个Cloudformation模板,用于设置所有这些网络基础架构.但是,EC2实例目前在没有任何所需软件的情况下启动.现在我想弄清楚如何最好地在他们身上获得该软件.
为此,我正在使用Packer.io创建AMI .但有些人反而催促我使用Cloud-Init.我应该使用什么启发式方法来决定将哪些内容融入AMI和/或通过Cloud-Init配置什么?
例如,我想预先配置EC2实例以允许me(saqib
)在没有自己笔记本电脑密码的情况下登录.因此EC2必须有用户.该用户必须具有主目录.并且在该主目录中必须存在.ssh/known_hosts
包含加密代码的文件.我应该将这些目录烘焙到AMI吗?或者我应该使用cloud-init来设置它们?我该如何决定这个和其他类似的案例呢?
packer amazon-web-services cloud-init aws-cloudformation amazon-ami
我的用户数据脚本
#!
set -e -x
echo `whoami`
su root
yum update -y
touch ~/PLEASE_WORK.txt
Run Code Online (Sandbox Code Playgroud)
从命令输入:
ec2-run-instances ami-05355a6c -n 1 -g mongo-group -k mykey -f myscript.sh -t t1.micro -z us-east-1a
Run Code Online (Sandbox Code Playgroud)
但是当我检查文件时/var/log/cloud-init.log
,它tail -n 5
是:
[CLOUDINIT] 2013-07-22 16:02:29,566 - cloud-init-cfg[INFO]: cloud-init-cfg ['runcmd']
[CLOUDINIT] 2013-07-22 16:02:29,583 - __init__.py[DEBUG]: restored from cache type DataSourceEc2
[CLOUDINIT] 2013-07-22 16:02:29,686 - cloud-init-cfg[DEBUG]: handling runcmd with freq=None and args=[]
[CLOUDINIT] 2013-07-22 16:02:33,691 - cloud-init-run-module[INFO]: cloud-init-run-module ['once-per-instance', 'user-scripts', 'execute', 'run-parts', '/var/lib/cloud/data/scripts']
[CLOUDINIT] 2013-07-22 16:02:33,699 - __init__.py[DEBUG]: …
Run Code Online (Sandbox Code Playgroud) 当我的AWS EC2 Ubuntu实例启动时,我有一些cloudinit脚本要执行。
我想使用下面的代码设置GIT配置变量。
#cloud-config
runcmd:
- [ sh, -c, "git config --global user.name 'myname'"]
Run Code Online (Sandbox Code Playgroud)
登录终端时。我可以毫无问题地执行git config --global user.name 'myname'。
但是,当我尝试使用cloudinit代码启动我的实例时。我收到一条错误消息
致命:$HOME 未设置
我的理解是,这是因为实例启动时未设置HOME。
寻找解决方案,以在启动时设置 git 变量或替代解决方案。
似乎Windows上的库存引导过程有点缺乏.
Linux有cloud-init,它将安装包,存储文件,并从用户数据运行bash脚本.
Windows具有ec2config,但是当系统处于"就绪"状态时,目前不支持运行cmd或powershell脚本 - 这意味着所有初始重新启动都已完成.
似乎有第三方选择.例如,RightScale具有执行此功能的RightLink代理.
有开源选项吗?有没有计划将此功能添加到Ec2Config?我必须自己建立这个吗?
我错过了什么吗?
如何在我runcmd
的cloud init脚本部分中使用管道重定向命令的输出?以下失败:
runcmd:
- [curl, -sk, https://example.com/packages/current/install.bash, '|', /bin/bash, -s, agent:certname=XYZ.com]
Run Code Online (Sandbox Code Playgroud)
它最终会创建一个如下所示的脚本:
'curl' '-sk' 'https://example.com/packages/current/install.bash' '|' '/bin/bash' '-s' 'agent:certname=XYZ.com'
Run Code Online (Sandbox Code Playgroud)
由于管道被引用,脚本失败.我怎样才能解决这个问题?
我使用 terraform 创建 EC2 实例,并user_data
使用/var/lib/cloud/scripts/per-once
. 这没有执行 - 我现在的问题是:cloud-init 之前运行过吗user_data
?
===编辑===
对 Dude0001 非常有帮助的答案的更长回复:
我现在尝试了以下方法 - 这是我的user_data
:
#!/bin/bash
cat >/var/lib/cloud/scripts/per-once/install_mysql <<!
#cloud-config
package_update: true
packages:
- mysql-server
!
cat >>/root/.bashrc <<!
set -o vi
unalias -a
alias ll='ls -lp'
!
cat >>/home/admin/.bashrc <<!
set -o vi
unalias -a
alias ll='ls -lp'
!
cat /root/.vimrc <<!
set t_ti= t_te=
set compatible
set expandtab ts=2 sw=2 ai
!
cat >/home/admin/.vimrc <<!
set t_ti= t_te=
set …
Run Code Online (Sandbox Code Playgroud) 遵循用于引导实例的terraform最佳实践,我正在处理cloud-init
配置以引导我的实例。我唯一的需要是安装一个特定的包。
我的 terraform 配置如下所示:
resource "google_compute_instance" "bastion" {
name = "my-first-instance"
machine_type = "n1-standard-1"
zone = "europe-west1-b"
boot_disk {
initialize_params {
image = "debian-cloud/debian-9"
}
}
network_interface {
network = "default"
access_config {
// Ephemeral IP
}
}
metadata = {
ssh-keys = "eugene:${file("/Users/eugene/.ssh/id_rsa.pub")}"
user-data = file("my_cloud_init.conf")
}
}
Run Code Online (Sandbox Code Playgroud)
以下是从docs安装软件包的示例cloud-init
,这是以下内容my_cloud_init.conf
:
#cloud-config
packages:
- kubectl
Run Code Online (Sandbox Code Playgroud)
运行terraform plan -out myplan
and 后terraform apply myplan
,我 ssh 到节点上却发现kubectl
不可用。此外,没有证据表明它cloud-init
已运行或存在于节点上: …
cloud-init google-compute-engine google-cloud-platform terraform
我在使用云初始化配置为 Raspberry pi 4 上的 Ubuntu Server Focal (ARM) 设置完整的无头安装时遇到了麻烦。这样做的全部目的是在出现故障时简化 SD 卡交换。我正在尝试使用 cloud-init 配置文件为 lan/wlan 应用静态配置,创建新用户,为新用户添加 ssh 授权密钥,安装 docker 等。但是,无论我做什么,似乎都没有应用 Wifi 设置在第一次重启之前。
步骤 1:将映像刻录到 SD 卡上。第二步:用配置文件重写 SD 卡 system-boot/network_config 和 system-boot/user-data
网络配置
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: false
optional: true
addresses: [192.168.100.8/24]
gateway4: 192.168.100.2
nameservers:
addresses: [192.168.100.2, 8.8.8.8]
wifis:
wlan0:
optional: true
access-points:
"AP-NAME":
password: "AP-Password"
dhcp4: false
addresses: [192.168.100.13/24]
gateway4: 192.168.100.2
nameservers:
#search: [mydomain, otherdomain]
addresses: [192.168.100.2, 8.8.8.8]
Run Code Online (Sandbox Code Playgroud)
用户数据
chpasswd:
expire: true
list:
- ubuntu:ubuntu
# Enable …
Run Code Online (Sandbox Code Playgroud) 我想通过 Docker 引导我的 Azure VM,并使用 cloud-init 进行 Docker-compose。到目前为止,我尝试了如下所示的方法。
#cloud-config
package_update: true
package_upgrade: true
groups:
- docker: [default]
runcmd:
- [ sh, -c, "curl -sSL https://get.docker.com/ | sh" ]
- [ sh, -c, "sudo curl -L "https://github.com/docker/compose/releases/download/$(git ls-remote https://github.com/docker/compose | grep refs/tags | grep -oP "[0-9]+\.[0-9][0-9]+\.[0-9]+$" | tail -n 1)/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose" ]
- [ sh, -c, "sudo chmod +x /usr/local/bin/docker-compose" ]
Run Code Online (Sandbox Code Playgroud)
但它没有安装 docker/ docker-compose 并出现以下错误
cloud-init[958]: 2019-02-28 00:51:02,447 - util.py[WARNING]: Failed loading yaml blob. Invalid format at line …
Run Code Online (Sandbox Code Playgroud) cloud-init ×10
amazon-ec2 ×3
ubuntu ×2
amazon-ami ×1
azure ×1
cloud ×1
coreos ×1
git ×1
linux ×1
packer ×1
terraform ×1
windows ×1