user3532850
user3532850

Reputation: 401

How to re-run cloud-init without reboot

I am using openstack to create a VM using 'nova boot' command. My image is cloud-init enabled. I pass a --user-data script which is a bash shell format for cloud-init to run during VM boot up time. All this happens successfully. Now my use-case is to re-run cloud-init to execute the same user-data script without rebooting the VM. I saw /usr/bin/cloud-init options and they do talk about running specific modules but nothing is able to make it execute the same user-data script. How can this be achieved ? Any help would be appreciated.

Upvotes: 40

Views: 93134

Answers (4)

Pierz
Pierz

Reputation: 8088

While re-running all of cloud-init without reboot isn't a recommended approach, the following commands will allow you to accomplish this on a system.

The commands have been updated so to re-run you need to clean out the existing config:

sudo cloud-init clean --logs

cloud-init typically runs multiple boot stages in order due to systemd service dependencies. If you want to repeat that process without a reboot you can run the following 4 commands:

  1. Detect local datasource (cloud platform):

    sudo cloud-init init --local

  2. Detect any datasources which require network up and run "cloud_init_modules" defined in /etc/cloud/cloud.cfg:

    sudo cloud-init init

  3. Run all cloud_config_modules defined in /etc/cloud/cloud.cfg:

    sudo cloud-init modules --mode=config

  4. Run all cloud_final_modules defined in /etc/cloud/cloud.cfg: sudo cloud-init modules --mode=final

Beware: things like ssh host keys maybe regenerated.

Upvotes: 50

Chad Smith
Chad Smith

Reputation: 93

Given that this post was actively touched 6 months ago I wanted to provide a more complete answer here from cloud-init upstream.

The original question: "how to re-run a user-data script again at a later time with cloud-init" Generally user-scripts are only run once per-instance by the config module config-user-scripts. If the instance-id in metadata doesn't change it won't re-run.

The per-instance semaphores can be bypassed with the following command line by telling it to run the user-scripts module regardless of instance-id:

sudo cloud-init single --name scripts-user --frequency always

Per the other suggesting to re-running all of cloud-init without system reboot. It isn't a recommended approach because some parts of cloud-init are run at systemd generator timeframe to detect new datasource types. That said, the following commands will allow you to accomplish this without reboot on a system.

cloud-init supports a clean subcommand to remove all semaphore files and allow cloud-init to re-run all config modules again. Beware that this will mean SSH host-keys are regenerated and .ssh config files re-written so it could impact your ability to get back into the VM.

To clean all semaphores so cloud-init modules will all re-run on next boot:

sudo cloud-init clean --logs

cloud-init typically runs multiple boot stages in sequence due to systemd service dependencies. If you want to repeat that process without a reboot you can run the following 4 commands:

  1. Detect local datasource (cloud platform):

    sudo cloud-init init --local

  2. Detect any datasources which require network up and run "cloud_init_modules" defined in /etc/cloud/cloud.cfg:

    sudo cloud-init init

  3. Run all cloud_config_modules defined in /etc/cloud/cloud.cfg:

    sudo cloud-init modules --mode=config

  4. Run all cloud_final_modules defined in /etc/cloud/cloud.cfg:

    sudo cloud-init modules --mode=final

Upvotes: 6

benh57
benh57

Reputation: 665

In order for cloud-init to reset, you need to execute rm -rf /var/lib/cloud/instances.

Then re run the cloud-init start and it will run the full boot script process again.

Upvotes: 21

kadrach
kadrach

Reputation: 448

Since this keeps popping up in search results, what works for me:

  1. Delete semaphores in /var/lib/cloud/instances/i-xxxxxxx/sem. Cloud-init will not re-run if these files are present.

  2. Edit /var/lib/cloud/instances/i-xxxxxxxx/scripts/part-001. This is your user-data script.

  3. Execute only the user scripts module of cloud-init. This will not re-download user data but execute the already downloaded (and now, modified) script from step 2.

    sudo /usr/bin/cloud-init single -n cc_scripts_user

Upvotes: 14

Related Questions