Updates to Alpine build scripts
This commit is contained in:
parent
ed22728354
commit
ac06a8829a
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,2 +1,3 @@
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
alpine-iso
|
alpine-iso
|
||||||
|
keys
|
53
README.md
53
README.md
@ -121,10 +121,55 @@ Update the parameters provided to the below plan run command as needed.
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd bolt_vm_automation
|
cd bolt_vm_automation
|
||||||
bolt plan run bolt_vm_automation::create_vm \
|
bolt plan run bolt_vm_automation::create_ubuntu \
|
||||||
target=siderack \
|
target=vortex \
|
||||||
vm_name=moeny-bank01 \
|
vm_name=moeny-bank01 \
|
||||||
ip_with_cidr=100.40.223.189/24 \
|
ip_with_cidr=100.40.223.189/24 \
|
||||||
hostname=moeny-bank01 \
|
hostname=moeny-bank01
|
||||||
network=br0
|
```
|
||||||
|
|
||||||
|
## Alpine VMs
|
||||||
|
|
||||||
|
There are now separate plans for generating a VM using Alpine and Ubuntu. [create_alpine](bolt_vm_automation/plans/create_alpine.yaml) should be run for Alpine and [create_ubuntu](bolt_vm_automation/plans/create_ubuntu.yaml) should be run for Ubuntu. These plans each run tasks tailored for the appropriate distribution.
|
||||||
|
|
||||||
|
Below is a sample command to run the Alpine bolt plan.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bolt plan run bolt_vm_automation::create_alpine \
|
||||||
|
vm_name=moeny-service \
|
||||||
|
ip_with_cidr=100.40.223.189/24 \
|
||||||
|
hostname=moeny-service \
|
||||||
|
add_a_record_bool=true \
|
||||||
|
dns_hostname=service
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that `add_a_record_bool` must be set to `true` if you would like an A record for the VM to be added to the DNS server zone file, as it is `false` by default. If using this functionality, `dns_hostname` should also be provided and optionally `dns_ttl` if you do not want the default of `3600`. The ability to interact with the DNS server depends on having set up a TSIG key on your DNS server for dynamic updates and storing a copy of your `tsig.key` file in a directory called `keys` at the root of this project. If either of these conditions have not been met, do not attempt to use this functionality. For more information on setting up dynamic DNS with a TSIG key, see our [bind9](https://gitea.moeny.ai/moeny/bind9) repo.
|
||||||
|
|
||||||
|
Similarly, `install_docker_bool` can be set to `false` if you do not want docker to be installed on the VM. It is true by default.
|
||||||
|
|
||||||
|
For more detailed logging on the `bolt plan run` add the `-v` flag at the end of the command.
|
||||||
|
|
||||||
|
If you want to delete an A record that you have added, you can use the [`delete_dns_a_record`](bolt_vm_automation/tasks/delete_dns_a_record.sh) task. You'll just need to provide it with the dns_hostname you set. Here's a sample command.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bolt task run bolt_vm_automation::delete_dns_a_record dns_hostname=service --targets localhost
|
||||||
|
```
|
||||||
|
|
||||||
|
Lastly, even though it is designed to be run with the `create_alpine` plan, you can also run the [`add_dns_a_record`](bolt_vm_automation/tasks/add_dns_a_record.sh) task on its own. You'll just need to provide it a few parameters. Here's a sample command.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bolt task run bolt_vm_automation::add_dns_a_record add_a_record_bool=true ip_with_cidr=100.40.223.189/24 dns_hostname=service dns_ttl=3600 --targets localhost
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternatively, to update DNS with the `nsupdate` command directly from the terminal, run something like the following with the path to your `tsig.key`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nsupdate -k ../../keys/tsig.key << EOF
|
||||||
|
server ns1.moeny.ai
|
||||||
|
zone moeny.ai
|
||||||
|
update add service.moeny.ai 3600 A 6.5.2.5
|
||||||
|
send
|
||||||
|
EOF
|
||||||
|
|
||||||
|
ssh moeny@ns1.moeny.ai "sudo rndc sync moeny.ai"
|
||||||
```
|
```
|
@ -27,7 +27,7 @@ parameters:
|
|||||||
disk_path:
|
disk_path:
|
||||||
type: String
|
type: String
|
||||||
description: "Base path for disk images"
|
description: "Base path for disk images"
|
||||||
default: "/mnt/nfs/kvm-images"
|
default: "/mnt/nfs/moeny-images"
|
||||||
network:
|
network:
|
||||||
type: String
|
type: String
|
||||||
description: "Network to connect the VM to"
|
description: "Network to connect the VM to"
|
||||||
@ -67,6 +67,23 @@ parameters:
|
|||||||
type: String
|
type: String
|
||||||
description: "Tertiary nameserver for the VM"
|
description: "Tertiary nameserver for the VM"
|
||||||
default: "1.1.1.1"
|
default: "1.1.1.1"
|
||||||
|
install_docker_bool:
|
||||||
|
type: Boolean
|
||||||
|
description: "Whether to install Docker on the VM"
|
||||||
|
default: true
|
||||||
|
# DNS Variables
|
||||||
|
add_a_record_bool:
|
||||||
|
type: Boolean
|
||||||
|
description: "Whether to add a DNS A record for the VM"
|
||||||
|
default: false
|
||||||
|
dns_hostname:
|
||||||
|
type: String
|
||||||
|
description: "Hostname for the DNS A record"
|
||||||
|
default: "vm-template-staging"
|
||||||
|
dns_ttl:
|
||||||
|
type: Integer
|
||||||
|
description: "TTL for the DNS A record"
|
||||||
|
default: 3600
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: create_vm
|
- name: create_vm
|
||||||
@ -103,6 +120,7 @@ steps:
|
|||||||
task: bolt_vm_automation::install_docker_alpine
|
task: bolt_vm_automation::install_docker_alpine
|
||||||
targets: localhost
|
targets: localhost
|
||||||
parameters:
|
parameters:
|
||||||
|
install_docker_bool: $install_docker_bool
|
||||||
staging_ip: $staging_ip
|
staging_ip: $staging_ip
|
||||||
|
|
||||||
- name: system_setup
|
- name: system_setup
|
||||||
@ -118,5 +136,15 @@ steps:
|
|||||||
nameserver3: $nameserver3
|
nameserver3: $nameserver3
|
||||||
staging_ip: $staging_ip
|
staging_ip: $staging_ip
|
||||||
|
|
||||||
|
- name: add_dns_a_record
|
||||||
|
description: Add a DNS A record for the VM
|
||||||
|
task: bolt_vm_automation::add_dns_a_record
|
||||||
|
targets: localhost
|
||||||
|
parameters:
|
||||||
|
add_a_record_bool: $add_a_record_bool
|
||||||
|
ip_with_cidr: $ip_with_cidr
|
||||||
|
dns_hostname: $dns_hostname
|
||||||
|
dns_ttl: $dns_ttl
|
||||||
|
|
||||||
return:
|
return:
|
||||||
message: "VM ${vm_name} created and updated successfully!"
|
message: "VM ${vm_name} created and updated successfully!"
|
||||||
|
@ -27,7 +27,7 @@ parameters:
|
|||||||
disk_path:
|
disk_path:
|
||||||
type: String
|
type: String
|
||||||
description: "Base path for disk images"
|
description: "Base path for disk images"
|
||||||
default: "/mnt/nfs/kvm-images"
|
default: "/mnt/nfs/moeny-images"
|
||||||
network:
|
network:
|
||||||
type: String
|
type: String
|
||||||
description: "Network to connect the VM to"
|
description: "Network to connect the VM to"
|
||||||
|
33
bolt_vm_automation/tasks/add_dns_a_record.sh
Normal file
33
bolt_vm_automation/tasks/add_dns_a_record.sh
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Bolt environment variables
|
||||||
|
ADD_A_RECORD="${PT_add_a_record_bool}"
|
||||||
|
IP="${PT_ip_with_cidr}"
|
||||||
|
HOSTNAME="${PT_dns_hostname}"
|
||||||
|
TTL="${PT_dns_ttl}"
|
||||||
|
|
||||||
|
# Check if Docker installation is requested
|
||||||
|
if [ "$ADD_A_RECORD" != "true" ]; then
|
||||||
|
echo '{"status": "skipped", "message": "A Record addition not requested, skipping..."}'
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if required parameters are provided
|
||||||
|
if [ -z "$IP" ] || [ -z "$HOSTNAME" ] || [ -z "$TTL" ]; then
|
||||||
|
echo '{"status": "failure", "message": "Error: Both ip_with_cidr, dns_hostname and ttl parameters must be provided"}'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create DNS A record
|
||||||
|
IP_ADDRESS=$(echo ${IP} | cut -d'/' -f1)
|
||||||
|
nsupdate -k ../../keys/tsig.key << EOF
|
||||||
|
server ns1.moeny.ai
|
||||||
|
zone moeny.ai
|
||||||
|
update add ${HOSTNAME}.moeny.ai ${TTL} A ${IP_ADDRESS}
|
||||||
|
send
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Force zone file update on DNS server
|
||||||
|
ssh moeny@ns1.moeny.ai "sudo rndc sync moeny.ai"
|
||||||
|
|
||||||
|
echo '{"status": "success", "message": "A Record successfully added."}'
|
23
bolt_vm_automation/tasks/delete_dns_a_record.sh
Normal file
23
bolt_vm_automation/tasks/delete_dns_a_record.sh
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Bolt environment variables
|
||||||
|
HOSTNAME="${PT_dns_hostname}"
|
||||||
|
|
||||||
|
# Check if required parameters are provided
|
||||||
|
if [ -z "$HOSTNAME" ]; then
|
||||||
|
echo '{"status": "failure", "message": "Error: dns_hostname parameter must be provided"}'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Delete DNS A record
|
||||||
|
nsupdate -k ../../keys/tsig.key << EOF
|
||||||
|
server ns1.moeny.ai
|
||||||
|
zone moeny.ai
|
||||||
|
update delete ${HOSTNAME}.moeny.ai A
|
||||||
|
send
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Force zone file update on DNS server
|
||||||
|
ssh moeny@ns1.moeny.ai "sudo rndc sync moeny.ai"
|
||||||
|
|
||||||
|
echo '{"status": "success", "message": "A Record successfully deleted."}'
|
@ -49,9 +49,9 @@ sleep 30
|
|||||||
|
|
||||||
# Verify installation by trying to SSH
|
# Verify installation by trying to SSH
|
||||||
if ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 root@${STAGING_IP} "echo 'VM is running'"; then
|
if ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 root@${STAGING_IP} "echo 'VM is running'"; then
|
||||||
echo "Alpine installation completed successfully"
|
echo '{"status": "success", "message": "Alpine installation completed successfully"}'
|
||||||
exit 0
|
exit 0
|
||||||
else
|
else
|
||||||
echo "Failed to install Alpine"
|
echo '{"status": "failure", "message": "Failed to install Alpine"}'
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
@ -1,8 +1,16 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Input Variables
|
# Input Variables
|
||||||
|
INSTALL_DOCKER="${PT_install_docker_bool}"
|
||||||
STAGING_IP="${PT_staging_ip}"
|
STAGING_IP="${PT_staging_ip}"
|
||||||
|
|
||||||
|
# Check if Docker installation is requested
|
||||||
|
if [ "$INSTALL_DOCKER" != "true" ]; then
|
||||||
|
# Output JSON that Bolt will understand
|
||||||
|
echo '{"status": "skipped", "message": "Docker installation not requested, skipping..."}'
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
# Update package list and install Docker
|
# Update package list and install Docker
|
||||||
ssh -o StrictHostKeyChecking=no root@${STAGING_IP} "apk update && apk add --no-cache docker docker-cli docker-cli-compose"
|
ssh -o StrictHostKeyChecking=no root@${STAGING_IP} "apk update && apk add --no-cache docker docker-cli docker-cli-compose"
|
||||||
|
|
||||||
@ -14,9 +22,9 @@ ssh -o StrictHostKeyChecking=no root@${STAGING_IP} "rc-service docker start && r
|
|||||||
|
|
||||||
# Verify installation
|
# Verify installation
|
||||||
if ssh -o StrictHostKeyChecking=no root@${STAGING_IP} "docker --version" > /dev/null 2>&1; then
|
if ssh -o StrictHostKeyChecking=no root@${STAGING_IP} "docker --version" > /dev/null 2>&1; then
|
||||||
echo "Docker installed successfully"
|
echo '{"status": "success", "message": "Docker installed successfully"}'
|
||||||
exit 0
|
exit 0
|
||||||
else
|
else
|
||||||
echo "Docker installation failed"
|
echo '{"status": "failure", "message": "Docker installation failed"}'
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
@ -7,7 +7,7 @@ STAGING_IP="${PT_staging_ip}"
|
|||||||
ssh -o StrictHostKeyChecking=no root@${STAGING_IP} "sed -i '3s/^#//' /etc/apk/repositories"
|
ssh -o StrictHostKeyChecking=no root@${STAGING_IP} "sed -i '3s/^#//' /etc/apk/repositories"
|
||||||
|
|
||||||
# Install required packages
|
# Install required packages
|
||||||
ssh -o StrictHostKeyChecking=no root@${STAGING_IP} "apk update && apk add --no-cache vim fping htop sudo bash mtr"
|
ssh -o StrictHostKeyChecking=no root@${STAGING_IP} "apk update && apk add --no-cache vim fping htop sudo bash mtr rsync tmux"
|
||||||
|
|
||||||
# Change default shell to bash
|
# Change default shell to bash
|
||||||
ssh -o StrictHostKeyChecking=no root@${STAGING_IP} "sed -i -E '/^(root|moeny):/ s:/bin/sh$:/bin/bash:' /etc/passwd"
|
ssh -o StrictHostKeyChecking=no root@${STAGING_IP} "sed -i -E '/^(root|moeny):/ s:/bin/sh$:/bin/bash:' /etc/passwd"
|
||||||
@ -20,3 +20,6 @@ ssh -o StrictHostKeyChecking=no root@${STAGING_IP} "addgroup sudo;addgroup moeny
|
|||||||
|
|
||||||
# Set no password to sudo group
|
# Set no password to sudo group
|
||||||
ssh -o StrictHostKeyChecking=no root@${STAGING_IP} "echo '%sudo ALL=(ALL) NOPASSWD: ALL' | tee -a /etc/sudoers.d/nopasswd_sudo_group"
|
ssh -o StrictHostKeyChecking=no root@${STAGING_IP} "echo '%sudo ALL=(ALL) NOPASSWD: ALL' | tee -a /etc/sudoers.d/nopasswd_sudo_group"
|
||||||
|
|
||||||
|
# Aliases for ll and la
|
||||||
|
ssh -o StrictHostKeyChecking=no root@${STAGING_IP} "sudo sed -i '1i # set ls -l and ls -a aliases\nalias ll='\''ls -l'\''\nalias la='\''ls -a'\''\n' /etc/bash/bashrc"
|
||||||
|
@ -12,7 +12,7 @@ STAGING_IP="${PT_staging_ip}"
|
|||||||
|
|
||||||
# Check if all required parameters are provided
|
# Check if all required parameters are provided
|
||||||
if [ -z "$IP" ] || [ -z "$HOSTNAME" ] || [ -z "$DHCP" ] || [ -z "$GATEWAY" ] || [ -z "$NAMESERVER1" ] || [ -z "$NAMESERVER2" ] || [ -z "$NAMESERVER3" ]; then
|
if [ -z "$IP" ] || [ -z "$HOSTNAME" ] || [ -z "$DHCP" ] || [ -z "$GATEWAY" ] || [ -z "$NAMESERVER1" ] || [ -z "$NAMESERVER2" ] || [ -z "$NAMESERVER3" ]; then
|
||||||
echo "Missing required parameters. All parameters must be provided."
|
echo '{"status": "failure", "message": "Missing required parameters. All parameters must be provided."}'
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -54,7 +54,13 @@ ssh -o StrictHostKeyChecking=no root@${STAGING_IP} "sed -i 's/127.0.0.1.*/127.0.
|
|||||||
# Enable and start iptables service
|
# Enable and start iptables service
|
||||||
ssh -o StrictHostKeyChecking=no root@${STAGING_IP} "rc-update add iptables default && rc-service iptables start"
|
ssh -o StrictHostKeyChecking=no root@${STAGING_IP} "rc-update add iptables default && rc-service iptables start"
|
||||||
|
|
||||||
echo "System configuration completed successfully"
|
# Generate new SSH host keys
|
||||||
|
ssh -o StrictHostKeyChecking=no root@${STAGING_IP} "rm /etc/ssh/ssh_host_* && \
|
||||||
|
ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key -N \"\" && \
|
||||||
|
ssh-keygen -t ecdsa -b 521 -f /etc/ssh/ssh_host_ecdsa_key -N \"\" && \
|
||||||
|
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N \"\""
|
||||||
|
|
||||||
|
echo '{"status": "success", "message": "System configuration completed successfully"}'
|
||||||
|
|
||||||
# Reboot the system
|
# Reboot the system
|
||||||
ssh -o StrictHostKeyChecking=no root@${STAGING_IP} "nohup sh -c '(sleep 2 && reboot) &' > /dev/null 2>&1"
|
ssh -o StrictHostKeyChecking=no root@${STAGING_IP} "nohup sh -c '(sleep 2 && reboot) &' > /dev/null 2>&1"
|
||||||
|
Loading…
Reference in New Issue
Block a user