Recommended Free Tools
Use your VPS provider’s launch-time user-data field to give the guest a cloud-init configuration. A #cloud-config YAML document is the maintainable default for creating users, installing packages, writing files and enabling services; an executable script beginning with a shebang is better for imperative, one-off shell logic. Cloud-init reads that data during the first boot, runs its modules in stages, and records the result in its logs.
Need a server to try this on? Antihost offers Linux VPS plans with NVMe storage, full root access and a 14-day free trial.
What cloud-init does on a VPS
Cloud-init is an initialization service installed in many Linux cloud images. The hosting or virtualization platform supplies user-data when it creates an instance. On the guest, cloud-init discovers that data through the image’s configured datasource, parses it, and applies it during boot.
As an Amazon Associate I earn from qualifying purchases.
Free tools Windows power users keep installed
One-click scans. No signup required.
The two usual user-data formats are:
| Format | How it starts | Best for | Execution behavior |
|---|---|---|---|
| Cloud-config | #cloud-config on the first line |
Users, SSH keys, packages, configuration files and service actions | Declarative modules run in cloud-init stages; runcmd writes a script that runs later in the final stage |
| Shell script | A shebang such as #!/bin/sh |
Short imperative tasks or logic that is awkward to express in YAML | Executed once per instance in the final stage by the cc_scripts_user module |
User-data is not a command you paste into an already-running terminal. It must be attached at launch, and the selected image must have cloud-init installed and enabled. The provider’s console labels and datasource behavior differ, so a script that works on one platform may be ignored if another platform does not pass user-data to the guest.
Cloud-config or a shell script: which should you choose?
Choose cloud-config for repeatable server structure
Cloud-config describes the desired initial state. Its built-in modules handle common tasks without requiring a long package-manager script. Use users for accounts and SSH keys, packages for software installation, write_files for deterministic files, and runcmd for final enable/start actions or small commands that have no dedicated module.
#1 Best Overall
- [Ultra-Lightweight Ear Buds Designed for Small Ears] Each earbud weighs only 3.7g and features a compact, ergonomic in-ear design made especially for small ears. Secure, low-profile, and comfortable for workouts, all-day wear or overnight sleeping.The ultra-slim profile sits flush in your ear with no hard edges poking or rubbing, so you can even sleep on your side without discomfort.
- [Immersive Stereo Sound with TOZO OrigX Technology] TOZO OrigX tuning delivers clear vocals, balanced mids, and natural stereo sound for music, podcasts, and videos.
- [Long Battery Life for Daily Use] Get up to 7 hours of playtime on a single charge, with up to 32 hours total using the charging case—ideal for workdays, commuting, and extended listening sessions.
- [Bluetooth 5.3 & Stable Connection] Bluetooth 5.3 provides fast pairing, stable wireless performance, and reduced dropouts as you move around home or office.
- [Deep Bass with Clear Vocals] High-performance drivers produce punchy bass while keeping vocals clean and detailed for everyday listening.
Choose a shell script for imperative logic
A script is useful when you need conditionals, loops, complex pipelines or a tool-specific installer. It still runs late in boot and normally only once. A script also makes distribution assumptions easy to hide accidentally: package-manager names, service names and filesystem paths may differ between Ubuntu, Debian and other images.
Decision table
| Question | Cloud-config | Shell script |
|---|---|---|
| Can the task be represented as users, packages or files? | Usually the clearer and more portable choice | Possible, but more ad hoc |
| Do you need shell parsing, loops or branching? | Use a small runcmd command or combine with a script |
Natural fit |
| Will the configuration be reviewed or maintained? | Explicit module keys are easier to audit | Requires careful comments and error handling |
| Does it need to run again after a reboot? | Neither format should be assumed to rerun automatically | Neither format should be assumed to rerun automatically |
| Are secrets involved? | Both are exposed through launch metadata and guest files unless you design around that | Same exposure, often with additional shell-history and logging risks |
Prerequisites before you create the VPS
- Confirm that the selected image includes an installed and enabled cloud-init service.
- Find the provider’s launch field for user-data. It may be a text box, an API property or a metadata option; the exact name and size limit are provider-specific.
- Know which distribution and release you are launching. Default usernames, package names, service names and SSH paths are not universal.
- Have an SSH public key ready. Prefer key-based login to placing a plaintext password in user-data.
- Plan a disposable test instance. A typo in YAML or a wrong module assumption is easier to diagnose before the server carries production data.
Keep credentials and long-lived tokens out of user-data wherever possible. Launch metadata can be visible to platform operators, logging systems or users with access to instance metadata, and cloud-init may write rendered content to the guest filesystem.
Outdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchWindows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallA complete cloud-config example
The following provider-agnostic document installs Nginx, creates a privileged deployment account, writes a persistent message-of-the-day file and enables the service. Replace the example SSH key with your own public key before launch.
#cloud-config
package_update: true
packages:
- nginx
users:
- default
- name: deploy
groups: [sudo]
shell: /bin/bash
sudo: ['ALL=(ALL) NOPASSWD:ALL']
ssh_authorized_keys:
- ssh-ed25519 AAAA...replace-with-your-public-key
write_files:
- path: /etc/motd.d/cloud-init
permissions: '0644'
content: |
Provisioned by cloud-init
runcmd:
- [systemctl, enable, --now, nginx]
- [sh, -c, 'echo ready >/var/lib/cloud-init-ready']
Why each section is present
package_update: trueasks the image’s package manager to refresh its metadata before package installation.packagesdelegates installation to cloud-init’s package module instead of embedding a long, distribution-specific install command.- The
defaultentry preserves the image’s normal account. Include it when you still need that account and any cloud-provided SSH keys. Omitting it can replace or alter the expected login setup, depending on the image. - The
deployentry creates a Bash user, adds it to thesudogroup and authorizes the supplied key. The passwordless sudo rule is convenient for automation but increases the impact of a stolen key; use a narrower rule when that is sufficient. write_filescreates a predictable file with explicit permissions. The path is persistent, unlike temporary directories that may be cleaned during boot.- The first
runcmdentry enables and starts Nginx. The second writes a readiness marker after the command list reaches that point.
How to run a cloud-init script when your VPS starts
- Select and verify the image. Choose a Linux image with cloud-init installed and enabled. If the provider documents a datasource requirement, select an image and network configuration that meet it.
- Open the launch form or API request. Locate the provider’s user-data field. Do not paste the configuration into an unrelated startup-command field unless the provider explicitly maps that field to cloud-init user-data.
- Paste one complete document. Start YAML with
#cloud-config, or start a script with a valid shebang. Do not prepend explanatory text, Markdown fences or indentation outside the document. - Validate the YAML locally. Check indentation, list syntax and quoting before you launch. YAML treats characters such as colons, braces, shell operators and leading zeroes specially; quote values when their intended meaning could be misread.
- Launch one test instance. Wait for the initial boot to finish. A successful provider API response only proves that the instance was created; it does not prove that cloud-init accepted or completed the user-data.
- Check cloud-init’s state. On the guest, use the image’s cloud-init status tooling and inspect
/var/log/cloud-init.logfor module activity. Inspect/var/log/cloud-init-output.logfor command output and errors. A wait-for-completion status check is useful before testing the service. - Verify the result from the outside. Log in with the intended account and key, confirm the installed package version, inspect file ownership and permissions, and check that the service is enabled, running and listening where expected.
- Promote only after the test passes. Save the exact user-data with the image and provider assumptions documented. Reuse it only where those assumptions remain true.
How cloud-init orders commands
Cloud-init divides initialization into stages. User creation, package handling, file writing and command execution are separate modules, and their placement affects what is available at each point.
Why runcmd can run late
The runcmd module does not execute each command as soon as YAML is parsed. It writes a script for a later stage. The scripts_user module executes that generated script in the final stage, after earlier initialization work. Therefore a command in runcmd may run substantially later than the moment cloud-init first reads the file.
Rank #2
- 【IP68 Waterproof Multifunctinal Smart Watch】Torjalph fitness activity tracker smart watch is IP68 waterproof technology ,you can wear it when swimming,handwashing,it's rain-proof which means that you perform multiple exercise modes outside without worrying about sweat or rain corroding your fitness smart watch,and this watch equipped with a 230 mAh large capacity battery magnetic charging ,and this sports activity tracker watch can be used 5-7 days If fully charged.
- 【Larger 1.83'' Full Screen Watch & Multi-dial Selection】1.83 inch full HD color touch screen smart watch for men / women provides excellent 240*284 resolution image quality ,This Bluetooth smart watch offers a better touch experience and remarkable immersion and ,more than 200 watch faces for you to choose from App"Da Fit ", you can change the dial style according to your mood to wear keeping the world on your wrist
- 【Accurate Activity Tracker Smart Watch 】sports watch activity tracker uses sweat and dust resistant breathable silicone strap, our Fitness Tracker Smart Watch for Android iOS Phones supports 12 sports modes,walking,running,bicycle,swimming,badminton,basketball,football,rope skipping. This bluetooth calls smart watch for men women is lightweight and stylish, bringing more convenient and relaxing sports experience while also providing more protection.
- 【Your 24 Hour Personal Daily Health Monitor】Fitness watch for women men full touch screen IP67 waterproof bluetooth smartwatch for Android iOS Phones with heart rate blood pressure monitor multifunction Andriod smart watch with steps counter sleep monitor sports fitness watch, monitoring blood oxygen saturation allows you to understand your physical condition in real time to track fitness progress ,to know your health status in time.
- 【More Functions Bluetooth Call Smart Watch】This fitness activity smart watch full screen for iPhone and Android phones includes a bunch of new features including:The bluetooth smart watch can hang up the phone, receive and display WhatsAPP /Text /Facebook /Twitter /Messenger reminder.Support sedentary reminder, alarm clock, stopwatch, timer,weather information,music control, remote camera control compatible with Android 5.0 and above or iOS 9.0 and above smartphones.
Use list-form commands when you do not need a shell. For example, [systemctl, enable, --now, nginx] keeps each argument separate and avoids accidental shell expansion. A string is interpreted by sh, which is appropriate for pipelines, redirection or shell operators but requires careful quoting.
runcmd:
- [mkdir, -p, /opt/app]
- [chown, deploy:deploy, /opt/app]
- [sh, -c, 'echo started >> /var/log/app-bootstrap.log']
Quote a YAML value containing a colon when it is intended to remain a single scalar. Similar care is needed for braces, brackets, exclamation marks, shell redirection and values with leading zeroes.
Installing packages and writing configuration safely
Use packages for normal software installation
List package names under packages rather than writing an embedded apt or dnf sequence. Cloud-init can then perform package installation in its normal module order. The actual package name still belongs to the target distribution; a name available on one distribution may not exist on another.
Use write_files for deterministic files
Put service configuration, environment files and small helper scripts in write_files. Set the path, permissions and, when needed, ownership explicitly. Keep service activation in runcmd so the file is present before the service starts.
Do not use /tmp for a file that must survive the boot sequence. Cloud-init’s module documentation warns that systemd-tmpfiles-clean can race with initialization and remove temporary files. Use a persistent location such as /etc, /var/lib or an application directory; use /run only when the file is intentionally temporary for the current boot.
Rank #3
- [Low Noise High Fidelity] New bee guitar cord with 22AWG oxygen-free-copper center conductors provides enhanced signal transfer, the PVC insulation material and the high-density stranded copper double shield provide noise rejection for quiet operation
- [Ideal for Choice] New bee 1/4 straight and right angle metal connectors, ensures a secure connection in any instrument, pedal, or amp jack. L shape great fro on stage guitar stands
- [Wide Compatible] Suitable for mixer, power amplifier, microphone, effector, decoder, equalizer, electoronic organ, electric guitar, electric bass and other electronic equipments. Widely used in the installation of smart home, karaoke speaker, professional stage audio, etc
- [Easy Disassemble] Making incidental repairs quick and easy! Very nice, flexible cable
- [Dont Hesite to Order] 24 hours customer services and professional technology team are standing by
Creating users and preserving SSH access
A common failure is replacing the image’s expected account while assuming the provider’s injected key will remain available. If you supply a users list and need the distribution’s normal account and cloud-provided keys, include default alongside any additional accounts.
For a new administrative account, specify its name, groups, shell, sudo policy and ssh_authorized_keys. Use a public key, never the private half. After the first boot:
- Test key-based login as the intended user before disabling any existing account.
- Check
~/.ssh/authorized_keysownership and permissions if authentication fails. - Confirm that the user’s shell exists at the path you specified.
- Review the sudo rule and remove passwordless privileges if the automation does not require them.
Writing a standalone user-data shell script
Use a shebang as the first line and keep the script explicit about errors, paths and distribution assumptions. This example installs a package, writes a marker and enables a service on an image whose package manager and service names are known:
#!/bin/sh
set -eu
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install -y nginx
printf '%sn' 'Provisioned by the user-data script' > /var/lib/user-data-ready
systemctl enable --now nginx
Cloud-init runs a user-data script relatively late, during the final boot stage as part of cc_scripts_user, and normally only once per instance. A reboot is not a reliable way to rerun it. If you change the script, use the provider’s documented clean-and-rerun procedure where supported, or rebuild the test instance.
Unlike the cloud-config example, this script hard-codes an APT workflow. That is acceptable only when the image and release are controlled. A portable deployment should either use cloud-config modules or parameterize package-manager, package-name and service-name assumptions.
Rank #4
- Digital Family Calendar: BSIMB digital calendar wall touch screen puts an end to your chaotic life. Designed for busy families, the digital calendar keeps you organised and in step with your family. Assign different colours and tasks to each family member to make family scheduling easier and more intuitive.
- Easy Setup and Auto-Sync: Plug in, connect to WLAN and auto-syn your electric calendar in minutes. Digital wall calendar compatible with Google calendar, iCloud calendar, Outlook calendar, Cozi calendar and Yahoo calendar. Add events directly on the device or through the ecalendar app. Electronic calendar stays current whether you're at work or traveling—no manual updates needed.
- All-In-One Home Assistant: Smart calendar builds habits and encourage independence with personalised chores. Display daily meal plan to reduce the daily ‘What's for dinner?’ stress. To-do lists keep track of everything you want. Turning chores into valuable achievements with stars and rewards, making life easier and more enjoyable.
- Manage Anytime Anywhere: BSIMB electronic calendar for family stay connected with the powerful ecalendar app. Access and manage your digital wall calendar anytime, anywhere with free features like stars & rewards, photo screensaver, chore charts, meals plans, to-do lists etc. Electronic planner paid features like Magic Import tailor advanced tools for users with special needs.
- Stay in Touch with Loved Ones: Share photos or videos from your phone to electronic wall calendar with app, instantly update your life moment, and keep in touch with your family, especially those who are far away; you can also surprise your smart calendar digital wall by sending him a wish card; it's also great for keeping tech-illiterate elders in touch with the youngsters.
Once-per-instance behavior and safe reruns
Most cloud-init modules are designed for first-boot provisioning. They record completion state in the instance’s cloud-init data directory, so a reboot generally does not repeat every module. This explains why a changed runcmd block may appear to do nothing on an existing VPS.
For a changed configuration, choose one of these controlled approaches:
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
- Build a fresh test instance from the same image and launch it with the revised user-data.
- Follow the provider and image documentation for cleaning cloud-init state and rerunning initialization. The exact procedure and safety implications vary.
- Move ongoing configuration management into a system designed for repeated application, rather than relying on first-boot cloud-init.
Make commands as idempotent as practical even on first boot. For example, create directories with mkdir -p, write complete files instead of appending duplicate lines, and have service actions tolerate an already-enabled unit.
Distribution and datasource portability
Cloud-init’s syntax is broadly shared, but the environment around it is not. Before reusing a document, check:
- Whether the image uses APT, DNF, Zypper or another package manager, and the exact package names.
- The default login username and whether the image expects a provider-injected key.
- The service unit name and whether
systemctlis available. - The SSH daemon configuration path and any distribution-specific hardening defaults.
- Which datasource supplies instance metadata and whether the provider passes the user-data unchanged.
Keep these assumptions visible in comments or variables rather than presenting one configuration as universal. A cloud-config file can be syntactically valid and still fail because a package, account or service does not exist on the target image.
Best Value
Using Jinja templates and instance data
Cloud-init can render Jinja templates using values from instance-data. This is useful when a hostname, datasource value or other per-instance attribute belongs in a generated file. Variable names must match the target image and datasource. If a variable is missing, cloud-init emits a warning and inserts a CI_MISSING_JINJA_VAR/... marker.
Test templated user-data on the exact image family you intend to deploy. Treat a missing-variable marker as a failed configuration, not as a harmless placeholder, and avoid putting secrets into templates merely because instance-data makes substitution convenient.
Security and secret-handling rules
- Prefer SSH public keys to plaintext passwords.
- Assume launch metadata and rendered files may be readable by privileged users and visible in platform logs.
- Do not echo tokens or private keys in
runcmdoutput; command output can appear in/var/log/cloud-init-output.log. - Set restrictive permissions for files containing credentials and remove bootstrap-only material after a secure handoff.
- Give automation only the sudo permissions it needs. The example’s unrestricted passwordless sudo is convenient, not a universal security recommendation.
- Rotate any credential that was accidentally embedded in user-data, even if the instance was later deleted.
Troubleshooting: why cloud-init did not do what you expected
The VPS booted, but nothing ran
- Confirm that the image actually contains and enables cloud-init.
- Check that the provider passed the text through its user-data field rather than a separate startup-script mechanism.
- Verify the first line:
#cloud-configfor YAML or a valid shebang for a script. - Read
/var/log/cloud-init.logand/var/log/cloud-init-output.logfor datasource, parser and command errors.
runcmd ran late
This is expected when you treat runcmd as immediate execution. It writes a script that the final-stage scripts module runs later. Wait for cloud-init completion before judging the result, and place prerequisite files in write_files so they exist before the final-stage command.
runcmd ran only once
That is the normal once-per-instance model. A reboot does not necessarily rerun completed modules. Rebuild the instance or use the image and provider’s documented clean-and-rerun process when testing a revised document.
The YAML is accepted but a command fails
- Switch from a string to list form when shell parsing is not required.
- Quote values containing colons, braces, operators or leading zeroes.
- Check that the command, package and service names exist on this distribution.
- Remember that a command may run as root and may not receive the interactive environment you see in an SSH session.
The new user cannot log in
- Confirm that the public key is complete and on one line.
- Check whether omitting
defaultremoved the image’s normal account or provider-injected key. - Verify the user’s shell, home-directory ownership and SSH file permissions.
- Use the guest’s SSH authentication logs after cloud-init has completed.
A generated file disappears
If it was written under /tmp, a temporary-file cleanup job may have removed it during boot. Move persistent configuration to a durable path and reserve /run for intentionally short-lived runtime state.
A template contains CI_MISSING_JINJA_VAR
The requested instance-data variable is not available under that name on the target datasource. Check the image’s instance-data schema, correct the variable and test again on the same platform.
A practical validation checklist
- Image has cloud-init installed and enabled.
- Provider’s user-data field and datasource are confirmed.
- Document begins with the correct format marker.
- YAML indentation and quoting pass validation.
- Default account is retained when required.
- SSH public key is valid and no private key or plaintext password is embedded.
- Package and service names match the target distribution.
- Persistent files are not placed in
/tmp. - One test instance has been launched and allowed to finish initialization.
- Cloud-init logs, login access, package versions, file permissions and service status have all been checked.
- Any rerun plan uses a documented clean/rebuild process rather than relying on a reboot.
When cloud-init is the right automation layer
Cloud-init is well suited to immutable, first-boot setup: create the initial account, install a small base set of packages, write configuration and start services. It is less suitable as a long-term configuration-management system that must continually reconcile drift. Once the VPS is established, use an appropriate repeatable deployment process for ongoing changes and keep cloud-init focused on the handoff from a fresh image to a usable machine.
The most reliable pattern is therefore simple: pass a validated #cloud-config document at launch, keep distribution assumptions explicit, use modules for users/packages/files, reserve runcmd for final actions, inspect the two cloud-init logs, and treat first-boot completion as a one-time event.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.
Do these 3 things before closing this tab:
1Repair Windows errors before they cause bigger problems2Fix the driver behind crashes, sound loss and screen glitches3Clear out junk files and repair common Windows errors




