简体   繁体   中英

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.

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.

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

sudo cloud-init clean

Then re-run it using the init directive:

sudo cloud-init init

Beware: things like ssh host keys maybe regenerated.

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

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

To run the packages module of cloud-config part of cloud-init, you can run

# cloud-init-cfg all config

To run the runcmd module of cloud-config part of cloud-init, you can run

# cloud-init-cfg all final

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM