在第一次启动 EC2 实例时cloud-init 运行用户数据脚本后,可能会写入一个状态文件,以便 cloud-init 在后续重新启动时不会再次运行该脚本。在某些情况下,我想删除此状态文件,以便再次运行用户数据脚本。它在哪里?
我已经阅读了很多关于此的帖子,但我仍然不确定正确的方法,假设:
我有一个由 Azure 创建并在其上运行的默认 Ubuntu 14.04 LTS VM,它没有交换
我想使用现有的 VM 存储创建交换,而不是使用附加存储创建新磁盘
我读过的帖子:
讨论了许多解决方案,但我似乎找不到一个可以在服务器重新启动后持续存在的解决方案(可能是由于 cloud-init 对映像分区有自己的想法),有人可以就最佳实践向我提出建议吗?
我正在尝试使用用户数据脚本在启动时使用 AWS CLI (1.8.7) 将一些文件从 S3 下载到 EC2 实例。此实例具有具有适当权限的 IAM 角色和实例配置文件。有时,CLI 会失败并显示错误“无法找到凭据”。它经常发生(不是每次),但总是在单独的 S3 命令之后发生,该命令有效。这是脚本的输出:
++ date +%r
03:24:10 AM
++ aws s3 cp s3://non-public-bucket-1/15mb-zip-file.zip ./15mb-zip-file.zip
Completed 1 of 1 part(s) with 1 file(s) remaining^Mdownload: s3://non-public-bucket-1/15mb-zip-file.zip to 15mb-zip-file.zip
++ date +%r
03:24:14 AM
++ unzip 15mb-zip-file.zip
# Snip
++ date +%r
03:26:01 AM
++ curl http://169.254.169.254/latest/meta-data/instance-id
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 10 100 …
Run Code Online (Sandbox Code Playgroud) 我最近在我的 2009 Mac pro 4,1(闪存到 5,1)的硬盘上安装了 Ubuntu 20.04。此时我已擦除并重新安装了 3 次。三次安装都顺利,但第一次启动时启动就挂起
[ OK ] Reached target Cloud-init target
我读了一些论坛,提到了这个问题,然后简单地重新启动了系统。
任何后续的启动都会挂起:
Ubuntu 20.04 LTS *********-server tty1
*********-server login: [ 32.083683] cloud-init[891]: Cloud-init v. 20.1-10-g71af48df-0ubuntu5 running 'modules:config' at Fri, 08 May 2020 20:58:20 +0000. Up 31.93 seconds.
[ 32.767663] cloud-init[898]: Cloud-init v. 20.1-10-g71af48df-0ubuntu5 running 'modules:final' at Fri, 08 May 2020 20:58:21 +0000. Up 32.59 seconds.
[ 32.767850] cloud-init[898]: Cloud-init v. 20.1-10-g71af48df-0ubuntu5 finished at Fri, 08 May 2020 20:58:21 +0000. Datasource DataSourceNoCloud [seed=/var/lib/cloud/seed/ncloud-net] [dsmode=net]. …
Run Code Online (Sandbox Code Playgroud) 我在我的家庭服务器上安装了新的 Ubuntu 18.04,我注意到/etc/network/interfaces
文件是空的。在互联网上搜索后,我发现 18.04 版使用cloud-init
包来初始化网络和其他东西。我删除了 cloud-init 包并/etc/network/interfaces
为静态 IP配置了接口,但是现在在我重新启动服务器后,似乎在服务启动之前没有配置网络,因为配置为在该接口上列出的每个服务都无法侦听。服务器启动后,我必须手动运行命令service [name] start
。我该如何解决?
界面配置图
我正在尝试在启动 EC2 (Amazon Linux) 时启动长时间运行的命令,但未能成功。它需要在 ec2-user 帐户下运行。这是我的第一次尝试:
#!/bin/bash
echo 'Woot 1!' > /home/ec2-user/woot1.txt
pushd /home/ec2-user/my-app-dir
nohup sudo -u ec2-user /home/ec2-user/my-app-dir/my_process.py &
echo 'Woot 2!' > /home/ec2-user/woot2.txt
Run Code Online (Sandbox Code Playgroud)
我试图运行的关键命令是“nohup”行,用于运行 my_process.py。
当我从 shell 以 root 身份运行它时,shell 脚本可以工作,但是当我在用户数据中将它提供给 ec2-run-instances 并登录到实例时,我看到了 woot1.txt 和 woot2.txt,但是 my_process.py没有运行。更重要的是,my_process.py 在运行时会创建一个日志文件,但是当我将脚本作为用户数据提供给 ec2-run-instances 时,那里没有日志文件(也没有 nohup.out)。
我也尝试将相同的东西放在 cloud-init 形式中,结果相同:
#cloud-config
runcmd:
- echo 'Woot 1!' > /home/ec2-user/woot1.txt
- pushd /home/ec2-user/my-app-dir
- nohup sudo -u ec2-user /home/ec2-user/my-app-dir/my_process.py &
- echo 'Woot 2!' > /home/ec2-user/woot2.txt
Run Code Online (Sandbox Code Playgroud)
如果有人能告诉我哪里出错了,我将不胜感激。
Cloud-init 提供了 disk_setup、fs_setup 和 mounts 模块来分区、格式化和将卷挂载到虚拟机,但是这些选项在http://cloudinit.readthedocs.org和 AWS上都没有记录。
是否存在 cloud-init 配置的功能示例,该示例将在 AWS 上对单个 EBS 卷进行分区、格式化和挂载到配置如下的实例:
"Volume" : {
"Type" : "AWS::EC2::Volume",
"Properties" : {
"Size" : "100",
"VolumeType" : "gp2",
"AvailabilityZone" : { "Fn::GetAtt" : [ "ServerInstance", "AvailabilityZone" ] }
},
"DeletionPolicy" : "Delete"
},
"MountVolume" : {
"Type" : "AWS::EC2::VolumeAttachment",
"Properties" : {
"InstanceId" : { "Ref" : "ServerInstance" },
"VolumeId" : { "Ref" : "Volume" },
"Device" : "/dev/sdh"
}
},
Run Code Online (Sandbox Code Playgroud)
到目前为止,我最接近的是以下内容(更正了语法问题):
disk_setup:
/dev/xvdh:
layout: true
overwrite: …
Run Code Online (Sandbox Code Playgroud) 我正在使用 cloud-init 设置运行 Ubuntu 14.04 的 AWS EC2 机器。cloud-init 比较有用的功能之一是write_files
允许我在虚拟机初始化期间安装附加文件的模块。
write_files
有几个有用的功能,其中的设置文件的所有者,作为记录在这里。不幸的是,我似乎无法write_files
在 Ubuntu 14.04 中使用此功能将文件所有者设置为任何非系统帐户,因为添加用户的 cloud-init 模块 - “用户组”正在该write_files
部分之后运行。如果我将文件所有者设置为在该users
部分中添加的用户(或在我的情况下为 default users
),即使我通过 uid 执行此操作,我也会收到如下错误:
StandardError:('write-files', OSError("Unknown user or group: 'getpwnam(): name not found: ubuntu'",))
Run Code Online (Sandbox Code Playgroud)
这似乎编码到 /etc/cloud/cloud.cfg 中,其中包含以下部分:
cloud_init_modules:
- migrator
- seed_random
- bootcmd
- write-files
- growpart
- resizefs
- set_hostname
- update_hostname
- update_etc_hosts
- ca-certs
- rsyslog
- users-groups
- ssh
Run Code Online (Sandbox Code Playgroud)
我在互联网上看到了一些cloud_init_modules
在 cloud-init 用户数据中设置的示例,但是如果我添加这样一个部分并将其排序 …
我似乎无法在 Amazon EC2 的 Fedora 28 中使用 IPv6(因此使用 cloud-init 和 DHCPv6)。
它使用此处描述的配置在 RHEL 7 中工作。将相同的配置应用于 Fedora 28 似乎没有任何作用。特别是,/etc/sysconfig/network
它不得到改写包含NETWORKING_IPV6=yes
,也不/etc/sysconfig/network-scripts/ifcfg-eth0
包含任何IPv6的东西。
我的/etc/cloud/cloud.cfg.d/56-custom-networking.cfg
包含:
network:
version: 1
config:
- type: physical
name: eth0
subnets:
- type: dhcp
- type: dhcp6
Run Code Online (Sandbox Code Playgroud)
生成的/etc/sysconfig/network
是:
NOZEROCONF=yes
DEVTIMEOUT=10
# Created by cloud-init on instance boot automatically, do not edit.
#
NETWORKING=yes
Run Code Online (Sandbox Code Playgroud)
生成的/etc/sysconfig/network-scripts/ifcfg-eth0
是:
# Created by cloud-init on instance boot automatically, do not edit.
# …
Run Code Online (Sandbox Code Playgroud) 据我所知,cloud-init
每次配置更改时都会运行。不仅是系统第一次启动,而且每次提供的配置发生更改时。这在某种程度上是有道理的,因为我想很难定义“第一次”(克隆的虚拟机在被冻结并用作模板之前已经运行过,所以它从来都不是真正的第一次)。然而,我时不时地\xe2\x80\x94,很少,但仍然\xe2\x80\x94发现cloud-init
当它们重新启动时,它会在已配置的系统上重新运行。
cloud-init
然而,当在完全配置的系统上运行时,某些步骤似乎会搞砸设置。例如,如果它在初始设置后再次运行一次并将cloud-init
某些配置设置为 value X
,但您随后手动将其覆盖为Y
,现在cloud-init
重新运行以将其设置回X
。或者,让系统重新创建您的 SSH 主机密钥。
因此,我发现手动运行非常有用:
\nsudo touch /etc/cloud/cloud-init.disabled\n
Run Code Online (Sandbox Code Playgroud)\n...初始设置后以防止其再次运行cloud-init
。(在某些情况下,其中cloud-init
real 仅用于初始“克隆和设置 IP/主机名”类型的配置。)
但有什么办法可以自动化这个过程吗?/etc/cloud/cloud.cfg
就像向下次运行后禁用自身的一些参数添加一样?
cloud-init ×10
amazon-ec2 ×4
ubuntu ×4
amazon-ebs ×1
amazon-s3 ×1
aws-cli ×1
azure ×1
boot ×1
dhcpv6 ×1
fedora ×1
ipv6 ×1
ubuntu-14.04 ×1
ubuntu-20.04 ×1