Following terraform best practice for bootstrapping instances, I'm working on a cloud-init config in order to bootstrap my instance. My only need is to install a specific package.
My terraform config looks like this:
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")
}
}
Following example for installing packages from cloud-init docs, here's the contents of my_cloud_init.conf:
#cloud-config
packages:
- kubectl
After running terraform plan -out myplan and terraform apply myplan, I ssh onto the node only to find kubectl not available. Moreover, there's no evidence that cloud-init was run or that it exists on the node:
$ which -a cloud-init
$ cat /var/log/cloud-init
cat: /var/log/cloud-init: No such file or directory
Looking for clues about usage of cloud-init with Google Cloud Compute instances wasn't fruitful:
cloud-init docs suggests settings user-data to a cloud-init config should be enough,cloud-init tutorial, but it's for Container Optimized OS,cloud-init on other images, but nothing indicates cloud-init is available on debian-cloud/debian-9,cloud-init.I don't mind using another image, as long as it's Debian or Ubuntu and I don't have to make an image template myself.
How to use cloud-init with a debian-based image on Google Cloud? What am I missing?
You can use one of the following image types: Public images are provided and maintained by Google, open source communities, and third-party vendors. By default, all Google Cloud projects have access to these images and can use them to create instances. Custom images are available only to your Cloud project.
To complement answer from @norbjd, posting this for completeness:
in order to install kubectl package that I planned initially, I had to write this cloud-init config:
#cloud-config
bootcmd:
- curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
apt:
sources:
kubernetes.list:
source: "deb http://apt.kubernetes.io/ kubernetes-xenial main"
packages:
- kubectl
if you need to know which images contain which packages, these resources may be helpful:
Ubuntu:
Ubuntu Cloud Images (RELEASED)
Actual contents (example):
Debian:
List of differences between standard and cloud systems
Actual contents:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With