Hi Ruben

Thank you very much, I have watched this and all other related online videos to best assist with this. I can 100% confirm when I curl the virtual router from the VM that I see the userdata perfectly fine, but something keeps overwriting my custom changes when I boot the VM. Something else keeps setting the VM hostname, to the "Name" specified when the VM is created in Cloudstack. Its as if another datasource is triggering it each time.

It would be nice if someone could assist with their cloud-init configuration and potential userdata that helps set custom values when a VM is booted, specifically the hostname.

On 8/10/24 21:11, Ruben Bosch wrote:
Hi Granwille,

Wido has done a great talk about cloudinit. Check it out here:
https://www.youtube.com/watch?v=seknX44Ktfc. You can check the details of
your supplied userdata in the virtual router to see whether what you stored
in the UI/API is what is supplied to the VM.

On Fri, Aug 9, 2024 at 11:39 AM Granwille Strauss
<granwi...@namhost.com.invalid>  wrote:

Hi Guys

Any help on this? Surely I am using *userdata* right via the UI? Or
should I log this on GitHub instead?
On 8/8/24 10:32, Granwille Strauss wrote:

Hi

I push *userdata* manually when I deploy a VM and still it does not want
to work:

I have this in place now:

#cloud-config
hostname: hostname.example.com
fqdn: hostname.example.com
prefer_fqdn_over_hostname: true
create_hostname_file: true
preserve_hostname: true


Screenshot:
https://www.awesomescreenshot.com/image/49925105?key=a51b729871fb9239579c1604c43677a3

Instead, it keeps pulling this instead and not accepting my manual inputs:

2024-08-08 08:21:40,488 - util.py[DEBUG]: Writing to
/var/lib/cloud/instances/a3da80ae-1cc3-4c3b-9204-5d2a14f58fef/vendor-data2.txt.i
- wb: [600] 308 bytes
2024-08-08 08:21:40,489 - cc_set_hostname.py[DEBUG]: Setting the hostname
to VMNAME FROM UI (VMNAME FROM UI)
2024-08-08 08:21:40,489 - subp.py[DEBUG]: Running command ['hostnamectl',
'set-hostname', 'VMNAME FROM UI'] with allowed return codes [0]
(shell=False, capture=True)
2024-08-08 08:21:40,512 - __init__.py[DEBUG]: Non-persistently setting the
system hostname to VMNAME FROM UI
2024-08-08 08:21:40,512 - subp.py[DEBUG]: Running command ['hostname', 'VMNAME
FROM UI'] with allowed return codes [0] (shell=False, capture=True)
2024-08-08 08:21:40,522 - atomic_helper.py[DEBUG]: Atomically writing to
file /var/lib/cloud/data/set-hostname (via temporary file
/var/lib/cloud/data/tmpskrfsk7k) - w: [644] 53 bytes/chars
2024-08-08 08:21:40,523 - util.py[DEBUG]: Writing to
/var/lib/cloud/instances/a3da80ae-1cc3-4c3b-9204-5d2a14f58fef/sem/consume_data
- wb: [644] 24 bytes
2024-08-08 08:21:40,524 - helpers.py[DEBUG]: Running consume_data using
lock (<FileLock using file
'/var/lib/cloud/instances/a3da80ae-1cc3-4c3b-9204-5d2a14f58fef/sem/consume_data'>)
2024-08-08 08:21:40,524 - handlers.py[DEBUG]: start:
init-network/consume-user-data: reading and applying user-data
2024-08-08 08:21:40,525 - stages.py[DEBUG]: Added default handler for
{'text/cloud-config', 'text/cloud-config-jsonp'} from
CloudConfigPartHandler: [['text/cloud-config', 'text/cloud-config-jsonp']]


Anyone that can guide me with how to use *userdata* via the Cloudstack UI
correctly, please?
On 8/8/24 01:01, Granwille Strauss wrote:

Hi

Thank you, you were right. After creating a new template and having the
root last, the growfs worked 100%. Thank you for this.

This now brings me to *userdata* in cloudstack that's not working. I
registered a new userdata in the UI:

#cloud-config hostname: {{ ds.meta_data.custom_hostname }} fqdn: {{
ds.meta_data.custom_hostname }} prefer_fqdn_over_hostname: true
create_hostname_file: true

Declared the *custom_hostname  *variable and when booting a VM it still
fails:

2024-08-07 22:46:56,673 - stages.py[DEBUG]: Added default handler for
{'text/jinja2'} from JinjaTemplatePartHandler: [['text/jinja2']]
2024-08-07 22:46:56,673 - __init__.py[DEBUG]: Calling handler
CloudConfigPartHandler: [['text/cloud-config', 'text/cloud-config-jsonp']]
(__begin__, None, 3) with frequency once-per-instance
2024-08-07 22:46:56,673 - __init__.py[DEBUG]: Calling handler
ShellScriptPartHandler: [['text/x-shellscript']] (__begin__, None, 2) with
frequency once-per-instance
2024-08-07 22:46:56,674 - __init__.py[DEBUG]: Calling handler
ShellScriptByFreqPartHandler: [['text/x-shellscript-per-boot']] (__begin__,
None, 2) with frequency once-per-instance
2024-08-07 22:46:56,674 - __init__.py[DEBUG]: Calling handler
ShellScriptByFreqPartHandler: [['text/x-shellscript-per-instance']]
(__begin__, None, 2) with frequency once-per-instance
2024-08-07 22:46:56,674 - __init__.py[DEBUG]: Calling handler
ShellScriptByFreqPartHandler: [['text/x-shellscript-per-once']] (__begin__,
None, 2) with frequency once-per-instance
2024-08-07 22:46:56,674 - __init__.py[DEBUG]: Calling handler
BootHookPartHandler: [['text/cloud-boothook']] (__begin__, None, 2) with
frequency once-per-instance
2024-08-07 22:46:56,674 - __init__.py[DEBUG]: Calling handler
JinjaTemplatePartHandler: [['text/jinja2']] (__begin__, None, 3) with
frequency once-per-instance
2024-08-07 22:46:56,674 - __init__.py[DEBUG]: {'MIME-Version': '1.0',
'Content-Type': 'text/cloud-config', 'Content-Disposition': 'attachment;
filename="part-001"'}
2024-08-07 22:46:56,674 - __init__.py[DEBUG]: Calling handler
CloudConfigPartHandler: [['text/cloud-config', 'text/cloud-config-jsonp']]
(text/cloud-config, part-001, 3) with frequency once-per-instance
2024-08-07 22:46:56,674 - util.py[DEBUG]: Attempting to load yaml from
string of length 158 with allowed root types (<class 'dict'>,)
2024-08-07 22:46:56,676 - util.py[WARNING]: Failed loading yaml blob.
Invalid format at line 2 column 11: "while constructing a mapping
   in "<unicode string>", line 2, column 11:
     hostname: {{ ds.meta_data.custom_hostname }}
               ^
found unhashable key
   in "<unicode string>", line 2, column 12:
     hostname: {{ ds.meta_data.custom_hostname }}
                ^"
2024-08-07 22:46:56,676 - cloud_config.py[WARNING]: Failed at merging in
cloud config part from part-001: empty cloud config
2024-08-07 22:46:56,676 - __init__.py[DEBUG]: Calling handler
CloudConfigPartHandler: [['text/cloud-config', 'text/cloud-config-jsonp']]
(__end__, None, 3) with frequency once-per-instance
2024-08-07 22:46:56,677 - util.py[DEBUG]: Writing to
/var/lib/cloud/instances/c366e71a-220c-48ed-aba1-bdd8a932064b/cloud-config.txt
- wb: [600] 77 bytes
2024-08-07 22:46:56,677 - util.py[DEBUG]: Restoring selinux mode for
/var/lib/cloud/instances/c366e71a-220c-48ed-aba1-bdd8a932064b/cloud-config.txt
(recursive=False)
2024-08-07 22:46:56,678 - util.py[DEBUG]: Restoring selinux mode for
/var/lib/cloud/instances/c366e71a-220c-48ed-aba1-bdd8a932064b/cloud-config.txt
(recursive=False)
2024-08-07 22:46:56,679 - __init__.py[DEBUG]: Calling handler
ShellScriptPartHandler: [['text/x-shellscript']] (__end__, None, 2) with
frequency once-per-instance


What am I doing wrong in this case? And why does the VM hostname keep
defaulting to the instance name specified in the UI instead?

I also created the following in */etc/cloud/cloud.cfg.d*, which injects
my SSH key and updated packages and installs a few additional ones, but
this too seems to fail:

#cloud-config
ssh_authorized_keys:
   - <my pub key>
package_update: true
package_upgrade: true
packages:
   - epel-release
   - neofetch
   - htop
   - gcc
   - gcc-c++
   - perl


Here's the error:

2024-08-07 22:47:00,315 - rhel.py[DEBUG]: Using DNF for package management
2024-08-07 22:47:00,315 - subp.py[DEBUG]: Running command ['dnf', '-y',
'makecache'] with allowed return codes [0] (shell=False, capture=False)
2024-08-07 22:47:05,331 - rhel.py[DEBUG]: Using DNF for package management
2024-08-07 22:47:05,331 - subp.py[DEBUG]: Running command ['dnf', '-y',
'upgrade'] with allowed return codes [0] (shell=False, capture=False)
2024-08-07 22:47:07,103 - rhel.py[DEBUG]: Using DNF for package management
2024-08-07 22:47:07,103 - subp.py[DEBUG]: Running command ['dnf', '-y',
'install', 'epel-release', 'neofetch', 'htop', 'gcc', 'gcc-c++', 'perl']
with allowed return codes [0] (shell=False, capture=False)
2024-08-07 22:47:08,573 - util.py[WARNING]: Failed to install packages:
['epel-release', 'neofetch', 'htop', 'gcc', 'gcc-c++', 'perl']
2024-08-07 22:47:08,575 - util.py[DEBUG]: Failed to install packages:
['epel-release', 'neofetch', 'htop', 'gcc', 'gcc-c++', 'perl']
Traceback (most recent call last):
   File
"/usr/lib/python3.6/site-packages/cloudinit/config/cc_package_update_upgrade_install.py",
line 121, in handle
     cloud.distro.install_packages(pkglist)
   File "/usr/lib/python3.6/site-packages/cloudinit/distros/rhel.py", line
59, in install_packages
     self.package_command("install", pkgs=pkglist)
   File "/usr/lib/python3.6/site-packages/cloudinit/distros/rhel.py", line
201, in package_command
     subp.subp(cmd, capture=False)
   File "/usr/lib/python3.6/site-packages/cloudinit/subp.py", line 323, in
subp
     stdout=out, stderr=err, exit_code=rc, cmd=args
cloudinit.subp.ProcessExecutionError: Unexpected error while running
command.
Command: ['dnf', '-y', 'install', 'epel-release', 'neofetch', 'htop',
'gcc', 'gcc-c++', 'perl']
Exit code: 1
Reason: -
Stdout: -
Stderr: -
2024-08-07 22:47:08,582 - cc_package_update_upgrade_install.py[WARNING]: 1
failed with exceptions, re-raising the last one
2024-08-07 22:47:08,582 - handlers.py[DEBUG]: finish:
modules-final/config-package_update_upgrade_install: FAIL: running
config-package_update_upgrade_install with frequency once-per-instance
2024-08-07 22:47:08,582 - util.py[WARNING]: Running module
package_update_upgrade_install (<module
'cloudinit.config.cc_package_update_upgrade_install' from
'/usr/lib/python3.6/site-packages/cloudinit/config/cc_package_update_upgrade_install.py'>)
failed
2024-08-07 22:47:08,582 - util.py[DEBUG]: Running module
package_update_upgrade_install (<module
'cloudinit.config.cc_package_update_upgrade_install' from
'/usr/lib/python3.6/site-packages/cloudinit/config/cc_package_update_upgrade_install.py'>)
failed


My main concern is the hostname that I cannot seem to set no matter what I
try, if I can get this at least right that would be the ultimate. How can I
pass the update_hostname userdata so that I can manually enter custom
hostnames when deploying  VM via UI?
On 8/7/24 22:52, Alexandru Stan wrote:

Hello,

Can’t say about everything you mentioned, but regarding the disk resizinng I 
can share my experience, I also had some issues before I managed to get it 
working. So, from what I’ve searched, growpart does not seem to work with lvm 
(could be wrong here though), so basic partitioning it is. Then, it seems that 
it extends the partition only if it’s the last one on the disk, seems to be 
your issue since the last partition is the swap partition. Try with the root 
partition being the last one, it should work fine.


From: Granwille Strauss<granwi...@namhost.com.INVALID>  
<granwi...@namhost.com.INVALID>
Sent: 7 August, 2024 20:35
To:users@cloudstack.apache.org
Subject: Cloud-Init not working as per Cloudstack documentation


Evening,

Please note, I do not use any API service and solely rely on the Cloudstack UI.

I deployed a new clean template and I followed the cloudstack documentation 
thoroughly to use the basics of cloud-init with cloudstack. But when I deployed 
my VM nothing seems to trigger at all, including userdata I registered.
pwd
/etc/cloud/cloud.cfg.d
[root@hostname cloud.cfg.d]# ll
total 32
-rw-r--r--. 1 root root 2070 Dec  4  2023 05_logging.cfg
-rw-r--r--. 1 root root   22 Aug  7 17:43 49_hostkeys.cfg
-rw-r--r--. 1 root root   88 Aug  7 17:45 50_growpartion.cfg
-rw-r--r--. 1 root root  209 Aug  7 17:52 51_extend_volume.cfg
-rw-r--r--. 1 root root  143 Aug  7 17:55 52_upgrade_packages.cfg
-rw-r--r--. 1 root root  355 Aug  7 18:00 53_install_packages.cfg
-rw-r--r--. 1 root root  357 Aug  7 17:42 80_user.cfg
-rw-r--r--. 1 root root  167 Dec  4  2023 README


For example, I deployed a new VM with its root disk overwrite from the 
template, which was 10 GB to 60 GB and the 50_growpartion.cfg did nothing:
[root@hostname cloud.cfg.d]# cat 50_growpartion.cfg
growpart:
   mode: auto
   devices:
     - \"/dev/vda2\"
   ignore_growroot_disabled: false
cat 51_extend_volume.cfg
runcmd:
   - [ cloud-init-per, always, grow_FS, resize2fs, /dev/vda2 ]

grep "50_growpartion.cfg" /var/log/cloud-init.log
2024-08-07 16:50:45,881 - util.py[DEBUG]: Reading from 
/etc/cloud/cloud.cfg.d/50_growpartion.cfg (quiet=False)
2024-08-07 16:50:45,881 - util.py[DEBUG]: Read 88 bytes from 
/etc/cloud/cloud.cfg.d/50_growpartion.cfg
2024-08-07 16:50:45,928 - util.py[DEBUG]: Reading from 
/etc/cloud/cloud.cfg.d/50_growpartion.cfg (quiet=False)
2024-08-07 16:50:45,928 - util.py[DEBUG]: Read 88 bytes from 
/etc/cloud/cloud.cfg.d/50_growpartion.cfg
2024-08-07 16:50:46,046 - util.py[DEBUG]: Reading from 
/etc/cloud/cloud.cfg.d/50_growpartion.cfg (quiet=False)
2024-08-07 16:50:46,046 - util.py[DEBUG]: Read 88 bytes from 
/etc/cloud/cloud.cfg.d/50_growpartion.cfg
lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1 1024M  0 rom
vda    253:0    0   60G  0 disk
├─vda1 253:1    0  512M  0 part /boot
├─vda2 253:2    0  7.5G  0 part /
└─vda3 253:3    0    2G  0 part [SWAP]
The same happens with the userdata specified, because I don't use an API, I 
need to set custom value, such as a hostname when I boot a VM I created the 
following userdata in the UI as per doc:


#cloud-config runcmd: - echo 'hostname {{ ds.meta_data.hostname1 }}' > /tmp/hostname - 
echo '{{ ds.meta_data.hostname1 }} > /etc/hostname' > /tmp/hostname - echo 
'hostnamectl set-hostname {{ ds.meta_data.hostname1 }}' > /tmp/hostname
And I declared the hostname1 variable, which allows me to specify the hostname under 
"Advanced" settings when I create a new instance. But nothing, for some reason, 
it keeps setting the VM name as the server hostname. But periods (.) are not allowed in 
the Name field for me to continue with this method and I need to be able to have special 
characters in the hostname for FQDNS spmetimes.

The only cloud-init command that ran was the 80_user.cfg that creates a managed 
user, that was the only one that worked. My upgrade and install configs none 
ran:
cat 52_upgrade_packages.cfg
#cloud-config

# Upgrade the instance on first boot
# (ie run apt-get upgrade)
#
# Default: false
# Aliases: apt_upgrade
cat  53_install_packages.cfg
#cloud-config

# Install additional packages on first boot
#
# Default: none
#
# if packages are specified, this apt_update will be set to true
#
# packages may be supplied as a single package name or as a list
# with the format [<package>, <version>] wherein the specifc
# package version will be installed.
packages:
  - epel-release
  - neofetch
  - htop
And here's my cloud.cfg:
cat cloud.cfg
datasource_list: ["CloudStack"]

datasource:
   CloudStack:
     max_wait: 120
     timeout: 50

network:
   config: disabled

users:
   - default

system_info:
   default_user:
     name: root

disable_root: false

ssh_deletekeys: true

cloud_init_modules:
  - seed_random
  - bootcmd
  - write-files
  - growpart
  - resizefs
  - disk_setup
  - mounts
  - set_hostname
  - update_hostname
  - update_etc_hosts
  - [ssh, always]
  - users-groups

cloud_config_modules:
  - ssh-import-id
  - locale
  - [ set-passwords, always ]
  - ntp
  - timezone
  - disable-ec2-metadata
  - [runcmd, always]

cloud_final_modules:
  - scripts-vendor
  - scripts-per-once
  - scripts-per-boot
  - scripts-per-instance
  - [scripts-user, always]
  - puppet

warnings:
   dsid_missing_source: off

Am I missing something with this? Any assistance will be greatly appreciated.
--
Regards / Groete
[https://www.namhost.com/t/namhost/images/mail/namhost-email-sig-logo.png]<https://www.namhost.com/>
  <https://www.namhost.com/>
Granwille Strauss  //  Senior Systems Admin

e:granwi...@namhost.com<mailto:granwi...@namhost.com>  <granwi...@namhost.com>
m: +264 81 323 1260<tel:+264813231260>  <+264813231260>
w:www.namhost.com<https://www.namhost.com/>  <https://www.namhost.com/>

[https://www.namhost.com/t/namhost/images/mail/facebook.png]<https://www.facebook.com/namhost>  
<https://www.facebook.com/namhost>[https://www.namhost.com/t/namhost/images/mail/twitter.png]<https://twitter.com/namhost>  
<https://twitter.com/namhost>[https://www.namhost.com/t/namhost/images/mail/instagram.png]<https://www.instagram.com/namhostinternetservices/>
  
<https://www.instagram.com/namhostinternetservices/>[https://www.namhost.com/t/namhost/images/mail/linkedin.png]<https://www.linkedin.com/company/namhost>
  
<https://www.linkedin.com/company/namhost>[https://www.namhost.com/t/namhost/images/mail/youtube.png]<https://www.youtube.com/channel/UCTd5v-kVPaic_dguGur15AA>
  <https://www.youtube.com/channel/UCTd5v-kVPaic_dguGur15AA>

[https://www.namhost.com/t/namhost/images/mail/yourmove-email-banner.png]<https://www.namhost.com/your-move>
  <https://www.namhost.com/your-move>
Namhost Internet Services (Pty) Ltd ,

                     24 Black Eagle Rd, Hermanus, 7210, RSA



The content of this message is confidential. If you have received it by 
mistake, please inform us by email reply and then delete the message. It is 
forbidden to copy, forward, or in any way reveal the contents of this message 
to anyone without our explicit consent. The integrity and security of this 
email cannot be guaranteed over the Internet. Therefore, the sender will not be 
held liable for any damage caused by the message. For our full privacy policy 
and disclaimers, please go tohttps://www.namhost.com/privacy-policy

--
Regards / Groete

<https://www.namhost.com>  Granwille Strauss  //  Senior Systems Admin

*e:*granwi...@namhost.com
*m:* +264 81 323 1260 <+264813231260>
*w:*www.namhost.com

<https://www.facebook.com/namhost>  <https://twitter.com/namhost>
<https://www.instagram.com/namhostinternetservices/>
<https://www.linkedin.com/company/namhost>
<https://www.youtube.com/channel/UCTd5v-kVPaic_dguGur15AA>

<https://www.namhost.com/your-move>

Namhost Internet Services (Pty) Ltd ,

                     24 Black Eagle Rd, Hermanus, 7210, RSA



The content of this message is confidential. If you have received it by
mistake, please inform us by email reply and then delete the message. It is
forbidden to copy, forward, or in any way reveal the contents of this
message to anyone without our explicit consent. The integrity and security
of this email cannot be guaranteed over the Internet. Therefore, the sender
will not be held liable for any damage caused by the message. For our full
privacy policy and disclaimers, please go to
https://www.namhost.com/privacy-policy


--
Regards / Groete

<https://www.namhost.com>  Granwille Strauss  //  Senior Systems Admin

*e:*granwi...@namhost.com
*m:* +264 81 323 1260 <+264813231260>
*w:*www.namhost.com

<https://www.facebook.com/namhost>  <https://twitter.com/namhost>
<https://www.instagram.com/namhostinternetservices/>
<https://www.linkedin.com/company/namhost>
<https://www.youtube.com/channel/UCTd5v-kVPaic_dguGur15AA>

<https://www.namhost.com/your-move>

Namhost Internet Services (Pty) Ltd ,

                     24 Black Eagle Rd, Hermanus, 7210, RSA



The content of this message is confidential. If you have received it by
mistake, please inform us by email reply and then delete the message. It is
forbidden to copy, forward, or in any way reveal the contents of this
message to anyone without our explicit consent. The integrity and security
of this email cannot be guaranteed over the Internet. Therefore, the sender
will not be held liable for any damage caused by the message. For our full
privacy policy and disclaimers, please go to
https://www.namhost.com/privacy-policy


--
Regards / Groete

<https://www.namhost.com>  Granwille Strauss  //  Senior Systems Admin

*e:*granwi...@namhost.com
*m:* +264 81 323 1260 <+264813231260>
*w:*www.namhost.com

<https://www.facebook.com/namhost>  <https://twitter.com/namhost>
<https://www.instagram.com/namhostinternetservices/>
<https://www.linkedin.com/company/namhost>
<https://www.youtube.com/channel/UCTd5v-kVPaic_dguGur15AA>

<https://www.namhost.com/your-move>

Namhost Internet Services (Pty) Ltd ,

                     24 Black Eagle Rd, Hermanus, 7210, RSA



The content of this message is confidential. If you have received it by
mistake, please inform us by email reply and then delete the message. It is
forbidden to copy, forward, or in any way reveal the contents of this
message to anyone without our explicit consent. The integrity and security
of this email cannot be guaranteed over the Internet. Therefore, the sender
will not be held liable for any damage caused by the message. For our full
privacy policy and disclaimers, please go to
https://www.namhost.com/privacy-policy


--
Regards / Groete

<https://www.namhost.com>         Granwille Strauss  // Senior Systems Admin

*e:* granwi...@namhost.com
*m:* +264 81 323 1260 <tel:+264813231260>
*w:* www.namhost.com <https://www.namhost.com/>

<https://www.facebook.com/namhost> <https://twitter.com/namhost> <https://www.instagram.com/namhostinternetservices/> <https://www.linkedin.com/company/namhost> <https://www.youtube.com/channel/UCTd5v-kVPaic_dguGur15AA>

<https://www.namhost.com/your-move>

Namhost Internet Services (Pty) Ltd ,

                    24 Black Eagle Rd, Hermanus, 7210, RSA

The content of this message is confidential. If you have received it by mistake, please inform us by email reply and then delete the message. It is forbidden to copy, forward, or in any way reveal the contents of this message to anyone without our explicit consent. The integrity and security of this email cannot be guaranteed over the Internet. Therefore, the sender will not be held liable for any damage caused by the message. For our full privacy policy and disclaimers, please go to https://www.namhost.com/privacy-policy

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Reply via email to