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?
cloud-init
is installed on the latest (at the moment of writing) Ubuntu 18.04 LTS (ubuntu-1804-bionic-v20191002
) image :
<my_user>@instance-1:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"
<my_user>@instance-1:~$ which cloud-init
/usr/bin/cloud-init
You should replace debian-cloud/debian-9
with ubuntu-os-cloud/ubuntu-1804-bionic-v20191002
.