我有一个简单的cloud-init用户数据,我将其传递给ec2.我通过右键单击实例并在其中设置用户数据,在我的ec2实例上设置此数据.
以下是我的cloud-init用户数据
#cloud-config
runcmd:
- [ ls, -l, / ]
- [ sh, -xc, "echo $(date) ': hello world!'" ]
- [ sh, -c, echo "=========hello world'=========" ]
- [ touch, /home/ec2-user/hello.txt ]
final_message: "The system is finally up, after 10 seconds"
Run Code Online (Sandbox Code Playgroud)
我从这里得到了这个例子,我添加了touch命令
我的期望是看到/var/log/cloud-init.log上的数据.但我不认为那里.此外,我没有看到任何错误,也没有看到创建的hello.txt文件
有什么东西我错过了吗?
我正在运行亚马逊linux实例而不是ubuntu实例
我想使用docker容器而不必使用弹性beanstalk或ec2容器服务.我想上传一个.zip描述容器的文件(就像你使用弹性beanstalk一样)并且有一个通用的ec2实例使用docker运行它.
在查看user data运行docker容器的beanstalk创建的ec2实例的部分时,我看到一个cloud-init脚本,它下载了一个执行所有设置的大型shell脚本(示例).我假设弹性beanstalk所做的一切也可以通过使用ec2实例和user data脚本手动实现.
我的问题是:有人可以为脚本提供一个最小的例子user data
我熟悉自动缩放组等.我想在不使用beanstalk-或ec2容器服务魔法的情况下运行此设置.
amazon-ec2 amazon-ecs cloud-init docker amazon-elastic-beanstalk
通过查看runcmd代码(/usr/lib/python2.6/site-packages/cloudinit/config/cc_runcmd.py),我注意到与其他代码相比没有指定"频率".除了脚本所做的唯一事情是保存在/ var/lib/cloud/instance/scripts/runcmd下作为shell脚本提供的脚本.
因此,如果我详细说明模块,我必须设置频率.
cloud_config_modules:
- mounts
- locale
- set-passwords
- timezone
- [ runcmd, always ]
cloud_final_modules:
- scripts-per-once
- scripts-per-boot
- scripts-per-instance
- [ scripts-user, always ]
- ssh-authkey-fingerprints
Run Code Online (Sandbox Code Playgroud)
并且由这个特定的脚本创建的脚本可以由'scripts-user'运行,所以我需要指定ie
- [ scripts-user, always ]
Run Code Online (Sandbox Code Playgroud)
使runcmd脚本工作
这样做是否正确?文档(至少是当前的0.7.7)缺乏对runcmd和用户脚本的正确解释以及如何使用它们
我也想不明白之间的所有差异的模式,一次(第一次实例启动),实例(???),总是(即我的理解),????启动(即一个存在吗?它似乎并不上班...
编辑:
好的,我在cloudinit/settings.py中找到了:
# Valid frequencies of handlers/modules
PER_INSTANCE = "once-per-instance"
PER_ALWAYS = "always"
PER_ONCE = "once"
Run Code Online (Sandbox Code Playgroud)
在我脚本旁边找到了一个解释:
[root@euca-10-254-97-216 ~]# cloud-init-per -h
Usage: cloud-init-per frequency name cmd [ arg1 [ arg2 [ ... ] ]
run cmd with arguments …Run Code Online (Sandbox Code Playgroud) 我有一个在启动时运行的脚本(通过 rc.local)并根据它从 AWS CLI 查询的实例名称设置我的主机名。它可以工作,并且在引导日志的末尾显示“登录:”
我认为 cloud-init 覆盖了我的主机名,所以我:
但是在 cloud-init 日志中,我仍然看到“运行模块更新主机名”和“迁移信号量 update_hostname.always 到 config-update-hostname 频率总是”,并且在启动后一两分钟主机名返回到 AWS 默认值。
到底是怎么回事?我该如何阻止?
我一直在试验 cloud-init 和 qemu。这是我启动虚拟机的方式:
qemu-system-x86_64 \
--enable-kvm \
-nographic \
-m 2G -smp 4 \
-drive file=/disks/mustafa.img,if=virtio \
-cdrom /disks/my-seed.img \
-device virtio-net,netdev=network0,mac=52:55:00:d1:55:01 \
-netdev tap,id=network0,ifname=tap0,script=no,downscript=no
Run Code Online (Sandbox Code Playgroud)
相关的元数据和用户数据文件是:
instance-id: 49380625-37c5-48b0-8a2b-60bd1392519a
network:
version: 2
ethernets:
interface0:
match:
macaddress: 52:55:00:D1:55:01
set-name: eth0
addresses:
- 172.17.0.2/255.255.0.0
gateway4: 172.17.0.1
Run Code Online (Sandbox Code Playgroud)
这是用户数据,不是真正相关,但无论如何。
#cloud-config
password: passw0rd
chpasswd: { expire: False }
ssh_pwauth: True
Run Code Online (Sandbox Code Playgroud)
但它挂起以下输出:
[ OK ] Started Network Time Synchronization.
[ OK ] Reached target System Time Synchronized.
[ 6.148261] blk_update_request: I/O error, dev fd0, sector 0 …Run Code Online (Sandbox Code Playgroud) 这是/etc/cloud/cloud.cfgUbuntu云16.04映像的内容:
# The top level settings are used as module
# and system configuration.
# A set of users which may be applied and/or used by various modules
# when a 'default' entry is found it will reference the 'default_user'
# from the distro configuration specified below
users:
- default
# If this is set, 'root' will not be able to ssh in and they
# will get a message to login instead as the above $user (ubuntu) …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种将ip-address传递给cloud-init元数据的方法.因此,当我的qcow启动时,它不必等待120 - 180秒启动.
目前,我已经通过将IP地址信息添加到cloud-init的userdata部分来创建了一种解决方法.问题是,它确实需要一些时间,因为cloud-init userdata仅在引导VM后执行.
echo -e "
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
\taddress $address
\tnetmask $netmask
\tgateway $gateway
\tdns-nameservers $dnsnameservers
" > /etc/network/interfaces
ifdown eth0; ifup eth0
Run Code Online (Sandbox Code Playgroud)
目前要在cloud-init元数据中设置主机名,我已经获得了这个部分:
cat > $config_dir/meta-data <<-EOF
instance-id: $uuid
hostname: $hostname
local-hostname: $hostname …Run Code Online (Sandbox Code Playgroud) 我正在尝试执行这个简单的命令,但它一直失败:
echo "secret_backend_command: /home/ec2-user/dd-get-secrets.py" >> /etc/datadog-agent/datadog.yaml"
Run Code Online (Sandbox Code Playgroud)
我尝试了以下所有方法:
- [ sh, -c, echo "secret_backend_command: /home/ec2-user/dd-get-secrets.py" >> /etc/datadog-agent/datadog.yaml ]
- 'sh -c "echo \"secret_backend_command: /home/ec2-user/dd-get-secrets.py\" >> /etc/datadog-agent/datadog.yaml"'
- sh -c "echo 'secret_backend_command: /home/ec2-user/dd-get-secrets.py' >> /etc/datadog-agent/datadog.yaml
Run Code Online (Sandbox Code Playgroud)
知道如何修复这个报价吗?
请注意,我使用另一个文件而不是 datadpg.yaml 进行了测试,因为我对此文件的权限被拒绝。
我在这里找到的例子不起作用
在AWS EC2 手册的一个示例中,我们可以通过输入以下内容来执行 apt 更新和升级:
repo_update: true
repo_upgrade: true
Run Code Online (Sandbox Code Playgroud)
但是我在cloud-init官方文档中找不到完全相同的命令,所以我一直在寻找类似的命令并发现了这个,他们给出了两个命令package_upgrade,apt_upgrade但没有区分出区别。
repo_upgrade这让我很好奇 and和package_upgrade之间有什么区别apt_upgrade
cloud-init ×10
amazon-ec2 ×4
linux ×3
user-data ×2
amazon-ecs ×1
bash ×1
centos ×1
docker ×1
ec2-ami ×1
hostname ×1
kvm ×1
openstack ×1
python ×1
qemu ×1