当使用cloud init 的#cloud-config 创建配置文件时,我将如何使用变量来填充值?
在我的特定情况下,我想自动启动 EC2 实例作为预配置的 salt minions。salt minion 云配置示例
假设我想获取特定的 EC2 实例 ID 并将其设置为 salt minion 的 ID。
我将如何为每个实例动态设置值?
我创建了一个基于KVM的多个Linux主机的环境.我正在使用virt-manager创建不同的虚拟机,而我正在使用Linux网桥在不同主机中的虚拟机之间创建连接.
现在,我想拥有一个自动配置服务器,以便我的虚拟机可以根据每个虚拟机的唯一ID自动配置其名称,IP地址,运行一些脚本等.是否可以在非openstack环境中复制某种cloud-init设置?
我尝试以下列方式使用cloud-init数据源NoCloud.首先,我在VM中安装了cloud-init并配置了cloud.cfg:
datasource:
NoCloud
datasource_list: [ NoCloud ]
disable_ec2_metadata: True
Run Code Online (Sandbox Code Playgroud)
然后,我创建了一个用户数据文件和元数据文件,其中包含以下内容:
用户数据:
#cloud-config
hostname: prueba
password: passw0rd
chpasswd: { expire: False }
ssh_pwauth: True
Run Code Online (Sandbox Code Playgroud)
元数据:
instance-id: iid-local01
local-hostname: prueba
Run Code Online (Sandbox Code Playgroud)
然后,我生成了一个iso文件:
genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data
Run Code Online (Sandbox Code Playgroud)
最后,我已将磁盘连接到VM并启动它.这是XML的相关部分:
<disk type='file' device='disk'>
<driver name='qemu' type='raw'/>
<source file='/opt/images/seed.iso'/>
<backingStore/>
<target dev='vdb' bus='virtio'/>
<alias name='virtio-disk1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</disk>
Run Code Online (Sandbox Code Playgroud)
当VM启动时,它会说:
2015-05-12 12:12:40,394 - util.py[WARNING]: Getting data from <class 'cloudinit.sources.DataSourceNoCloud.DataSourceNoCloudNet'> failed
* Stopping Read required files in advance …Run Code Online (Sandbox Code Playgroud) 当分解一个AWS或其他云供应商实例,并使用cloud-init来配置主机时,称为bash脚本的用户是谁运行的?
write_files与 cloud-init 一起使用时,是否可以附加内容?如果是这样,如何?
write_files: [
{
"path": "/home/user/some-file",
"content": "\nLine to append!"
}
]
Run Code Online (Sandbox Code Playgroud) 由于使用 git 时的权限问题,我尝试以与 root 不同的用户身份运行 cloud init。有这样的办法吗?
我在 cloud-init 文件中创建了以下 systemd 单元:
- path: /etc/systemd/system/multi-user.target.wants/docker-compose.service
owner: root:root
permissions: '0755'
content: |
[Unit]
Description=Docker Compose Boot Up
Requires=docker.service
After=docker.service
[Service]
Type=simple
ExecStart=/usr/local/bin/docker-compose -f /opt/data/docker-compose.yml up -d
Restart=always
RestartSec=30
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
当我尝试跑步时
sudo systemctl enable docker-compose.service
创建符号链接我得到这个:
Failed to execute operation: No such file or directory
不过我确信该文件位于/etc/systemd/system/multi-user.target.wants
我从 Terraform 开始。我试图让它设置一个友好的主机名,而不是ip-10.10.10.10AWS 使用的通常的主机名。但是,我还没有找到如何去做。
我尝试使用配置器,如下所示:
provisioner "local-exec" {
command = "sudo hostnamectl set-hostname friendly.example.com"
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,主机名没有改变。
所以现在,我正在尝试这个:
resource "aws_instance" "example" {
ami = "ami-XXXXXXXX"
instance_type = "t2.micro"
tags = {
Name = "friendly.example.com"
}
user_data = "${data.template_file.user_data.rendered}"
}
data "template_file" "user_data" {
template = "${file("user-data.conf")}"
vars {
hostname = "${aws_instance.example.tags.Name}"
}
}
Run Code Online (Sandbox Code Playgroud)
在user-data.conf我有一行使用变量,如下所示:
hostname = ${hostname}
Run Code Online (Sandbox Code Playgroud)
但这给了我一个循环依赖:
$ terraform apply
Error: Error asking for user input: 1 error(s) occurred:
* Cycle: aws_instance.example, data.template_file.user_data
Run Code Online (Sandbox Code Playgroud)
另外,这意味着我必须user_data为每个实例创建不同的资源,这似乎有点痛苦。你不能重复使用它们吗?那应该是模板的目的吧? …
我们正在尝试使用 userdata (我理解是基于 cloud-init 的)在 AWS EC2 实例上加载时运行批处理脚本。由于代码在 conda 环境中运行,我们尝试在运行 Python/Pandas 代码之前激活它。我们注意到 PATH 变量没有正确设置。(即使在制作映像之前已正确设置,并且在 SSH 进入实例后为所有用户正确设置)
我们尝试修改 shell 脚本中的路径,但没有任何效果。我们运行了以下代码:
#!/bin/bash
export=/opt/conda/bin:$PATH
which python
which conda
conda activate etl
Run Code Online (Sandbox Code Playgroud)
我们在运行之前和之后检查了 $PATH export=/opt/conda/bin(没有变化)。 which python返回错误的Python,并且which conda返回未找到。
之前和之后的 $PATH 是:
/sbin:/usr/sbin:/bin:/usr/bin
这是一个与之前的SO问题类似的问题,我从中改编了我的代码How can i use cloud-init to load a datadisk on an ubuntu VM in azure
使用通过 Terraform 传递的云配置文件:
#cloud-config
disk_setup:
/dev/disk/azure/scsi1/lun0:
table_type: gpt
layout: true
overwrite: false
fs_setup:
- device: /dev/disk/azure/scsi1/lun0
partition: 1
filesystem: ext4
mounts:
- [
"/dev/disk/azure/scsi1/lun0-part1",
"/opt/data",
auto,
"defaults,noexec,nofail",
]
Run Code Online (Sandbox Code Playgroud)
data "template_file" "cloudconfig" {
template = file("${path.module}/cloud-init.tpl")
}
data "template_cloudinit_config" "config" {
gzip = true
base64_encode = true
part {
content_type = "text/cloud-config"
content = "${data.template_file.cloudconfig.rendered}"
}
}
module "nexus_test_vm" {
#unnecessary details ommitted - 1 …Run Code Online (Sandbox Code Playgroud) 当我使用 Cloud-init 启动 Linux 服务器时,我有一些脚本,/etc/cloud/cloud.cfg.d/它们按相反的字母顺序运行
# ll /etc/cloud/cloud.cfg.d/
total 28
-rw-r--r-- 1 root root 173 Dec 10 12:38 00-cloudinit-lifecycle-hook.cfg
-rw-r--r-- 1 root root 2120 Jun 1 2021 05_logging.cfg
-rw-r--r-- 1 root root 590 Oct 26 17:55 10_aws_yumvars.cfg
-rw-r--r-- 1 root root 29 Dec 1 18:22 20_amazonlinux_repo_https.cfg
-rw-r--r-- 1 root root 586 Dec 10 12:38 50-cloudinit-tomcat.cfg
-rw-r--r-- 1 root root 585 Dec 10 12:40 60-cloudinit-newrelic.cfg
Run Code Online (Sandbox Code Playgroud)
最后执行的是00-cloudinit-lifecycle-hook.cfg,我使用 .txt 文件完成 Auto Scaling 组的生命周期CONTINUE。如果 ASG 在给定超时后未收到此信号,则它会失败。
问题是,即使出现错误50-cloudinit-tomcat.cfg …
cloud-init ×10
linux ×3
amazon-ec2 ×2
azure ×1
boto ×1
conda ×1
openstack ×1
provisioning ×1
python ×1
salt-stack ×1
systemd ×1
terraform ×1
ubuntu ×1
ubuntu-16.04 ×1