Combine cloud-init autoinstall with other cloud-init modules

I'm trying to provision a VM with cloud-init and the server live image. (I'm not using the cloud image, for infrastructural reasons I have to install from ISOs)

However, whenever I'm trying to combine autoinstall with e.g. write_files, the write_files part does not seem to succeed.

The following installs Ubuntu:

#cloud-config
autoinstall:
  version: 1
  identity:
    hostname: boxy-001
    password: "$1$k46kl1..."
    username: alice
  storage:
    layout:
      name: lvm
  ssh:
    install-server: true
    authorized-keys: 
      - "ecdsa-sha2-nistp256 AAAAE2...."
     
write_files:              
- content: |              
    cloud_init_has_run    
  path: /cloud_init_flag  

But the file is not written at /cloud_init_flag.

Are modules missing? Is cloud-config incomplete on the Server live ISOs?

Edit the file is written, but it's written in the installation environment! Instead, I should likely use the autoinstall.user-data key to provide the user-data for the target system.


Solution 1:

how would I get cloud-init to run on the installed system in combination with autoinstall?

There is a user-data config key for the autoinstall file.

For example, if you want your write_files configuration to be used by cloud-init on the installed system then this snippet could be included as part of the autoinstall file.

#cloud-config
autoinstall:
  version: 1
  user-data:
    write_files:
    - content: |
        cloud_init_has_run
      path: /cloud_init_flag
...

How it works

  • During the install, subiquity will create configuration for cloud-init at /target/var/lib/cloud/seed/nocloud-net/user-data.
  • During the first boot of the installed system, cloud-init will use this config file to perform some of the install tasks. Notably, this is how the first user is created.
  • If a user-data section is included in the autoinstall file then subiquity will merge the user-data section into the generated /target/var/lib/cloud/seed/nocloud-net/user-data file.

Using the snippet above, the merged configuration resulted in this file content.

#cloud-config
growpart: {mode: 'off'}
locale: en_US.UTF-8
preserve_hostname: true
resize_rootfs: false
...
write_files:
- {content: 'cloud_init_has_run

    ', path: /cloud_init_flag}

During first boot, cloud-init did create the /cloud_init_flag file with the configured content.