The process will setup DHCP dnsmasq on opnsense to boot the correct ipxe file depending on the architecture Then ipxe will chainload to either a mac-specific ipxe boot file or the fallback inventory boot file Then a kickstart pre script will setup the cluster ssh key to allow ssh connections to the machine and also setup and start harmony_inventory_agent to allow being scraped Note: there is a bug with the inventory agent currently, it cannot find lsmod on centos stream 9, will fix this soon
		
			
				
	
	
		
			128 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Django/Jinja
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Django/Jinja
		
	
	
	
	
	
| # --- Pre-Boot Scripting (The Main Goal) ---
 | |
| # This section runs after the live environment has booted into RAM.
 | |
| # It sets up SSH and downloads/runs the harmony-inventory-agent.
 | |
| %pre --log=/root/ks-pre.log
 | |
| 
 | |
| echo "Harmony Kickstart: Pre-boot script started."
 | |
| 
 | |
| # 1. Configure SSH Access for Root
 | |
| # Create the .ssh directory and set correct permissions.
 | |
| echo "  - Setting up SSH authorized_keys for root..."
 | |
| mkdir -p /root/.ssh
 | |
| chmod 700 /root/.ssh
 | |
| 
 | |
| # Download the public key from the provisioning server.
 | |
| # The -sS flags make curl silent but show errors. -L follows redirects.
 | |
| curl -vSL "http://{{ gateway_ip }}:8080/{{ cluster_pubkey_filename }}" -o /root/.ssh/authorized_keys
 | |
| if [ $? -ne 0 ]; then
 | |
|     echo "  - ERROR: Failed to download SSH public key."
 | |
| else
 | |
|     echo "  - SSH key downloaded successfully."
 | |
|     chmod 600 /root/.ssh/authorized_keys
 | |
| fi
 | |
| 
 | |
| # 2. Download the Harmony Inventory Agent
 | |
| echo "  - Downloading harmony-inventory-agent..."
 | |
| curl -vSL "http://{{ gateway_ip }}:8080/{{ harmony_inventory_agent }}" -o /usr/bin/harmony-inventory-agent
 | |
| if [ $? -ne 0 ]; then
 | |
|     echo "  - ERROR: Failed to download harmony_inventory_agent."
 | |
| else
 | |
|     echo "  - Agent binary downloaded successfully."
 | |
|     chmod +x /usr/bin/harmony-inventory-agent
 | |
| fi
 | |
| 
 | |
| # 3. Create a systemd service to run the agent persistently.
 | |
| # This is the most robust method to ensure the agent stays running.
 | |
| echo "  - Creating systemd service for the agent..."
 | |
| cat > /etc/systemd/system/harmony-agent.service << EOF
 | |
| [Unit]
 | |
| Description=Harmony Inventory Agent
 | |
| After=network-online.target
 | |
| Wants=network-online.target
 | |
| 
 | |
| [Service]
 | |
| Type=simple
 | |
| ExecStart=/usr/bin/harmony-inventory-agent
 | |
| Restart=on-failure
 | |
| RestartSec=5
 | |
| 
 | |
| [Install]
 | |
| WantedBy=multi-user.target
 | |
| EOF
 | |
| 
 | |
| # 4. Enable and start the service
 | |
| # The 'systemctl' commands will work correctly within the chroot environment of the %pre script.
 | |
| echo "  - Enabling and starting harmony-agent.service..."
 | |
| systemctl daemon-reload
 | |
| systemctl enable --now harmony-agent.service
 | |
| 
 | |
| # Check if the service started correctly
 | |
| systemctl is-active --quiet harmony-agent.service
 | |
| if [ $? -eq 0 ]; then
 | |
|     echo "  - Harmony Inventory Agent service is now running."
 | |
| else
 | |
|     echo "  - ERROR: Harmony Inventory Agent service failed to start."
 | |
| fi
 | |
| 
 | |
| echo "Harmony Kickstart: Pre-boot script finished. The machine is ready for inventory."
 | |
| 
 | |
| echo "Running cat - to pause system indefinitely"
 | |
| cat -
 | |
| 
 | |
| %end
 | |
| 
 | |
| # =================================================================
 | |
| #  Harmony Discovery Agent - Kickstart File (NON-INSTALL, LIVE BOOT)
 | |
| # =================================================================
 | |
| #
 | |
| # This file achieves a fully automated, non-interactive boot into a
 | |
| # live CentOS environment. It does NOT install to disk.
 | |
| #
 | |
| 
 | |
| # --- Automation and Interaction Control ---
 | |
| # Perform the installation in command-line mode. This is critical for
 | |
| # preventing Anaconda from starting a UI and halting for input.
 | |
| cmdline
 | |
| 
 | |
| # Accept the End User License Agreement to prevent a prompt.
 | |
| eula --agreed
 | |
| 
 | |
| # --- Core System Configuration (Required by Anaconda) ---
 | |
| # Set keyboard and language. These are mandatory.
 | |
| keyboard --vckeymap=us --xlayouts='us'
 | |
| lang en_US.UTF-8
 | |
| 
 | |
| # Configure networking. This is essential for the %post script to work.
 | |
| # The --activate flag ensures this device is brought up in the installer environment.
 | |
| network --bootproto=dhcp --device=link --activate
 | |
| 
 | |
| # Set a locked root password. This is a mandatory command.
 | |
| rootpw --lock
 | |
| 
 | |
| # Set the timezone. This is a mandatory command.
 | |
| timezone UTC
 | |
| 
 | |
| # --- Disable Installation-Specific Features ---
 | |
| # CRITICAL: Do not install a bootloader. The --disabled flag prevents
 | |
| # this step and avoids errors about where to install it.
 | |
| bootloader --disabled
 | |
| 
 | |
| # CRITICAL: Ignore all disks. This prevents Anaconda from stopping at the
 | |
| # "Installation Destination" screen asking where to install.
 | |
| # ignoredisk --drives /dev/sda
 | |
| 
 | |
| # Do not run the Initial Setup wizard on first boot.
 | |
| firstboot --disable
 | |
| 
 | |
| # --- Package Selection ---
 | |
| # We are not installing, so this section can be minimal.
 | |
| # An empty %packages section is valid and ensures no time is wasted
 | |
| # resolving dependencies for an installation that will not happen.
 | |
| %packages
 | |
| %end
 | |
| 
 | |
| 
 | |
| # IMPORTANT: Do not include a final action command like 'reboot' or 'poweroff'.
 | |
| # The default action is 'halt', which in cmdline mode will leave the system
 | |
| # running in the live environment with the agent active, which is the desired state.
 |