2025-10-07 11:05:08 +01:00

95 lines
5.2 KiB
Django/Jinja

#!/bin/bash
# provisioning {{provisioning_vers}} aws server creation: {{now}}
{% if use_debug %} set -x {% endif %}
aws_version=$(aws --version | cut -f1 -d" " | sed 's,aws-cli/,,g')
[ -z "$aws_version" ] && echo "Error❗: aws command as not found" && exit 1
if [ -z "$(aws configure get aws_access_key_id 2>/dev/null)" ] ; then
echo "Error❗ AWS credentials not found for command. Review $HOME/.aws/credentials and/or environment variables for settings"
exit 1
fi
out_path={{runset.output_path}}
if [ -n "$out_path" ] ; then
out_path=${out_path//NOW/{{now}}}
[ ! -d "$out_path" ] && mkdir -p "$out_path"
else
out_path=/tmp
fi
{%- if server.hostname %}
instance_data=$(aws ec2 describe-instances --filter "Name=tag-value,Values={{server.hostname}}" "Name=instance-state-name,Values=running" \
--query "Reservations[*].Instances[].{\
__tags: Tags[?Key=='Name'].Value[],\
__id: InstanceId,\
__priv: NetworkInterfaces[*].PrivateIpAddresses[*].PrivateIpAddress,\
__pub: PublicIpAddress,\
__type: InstanceType,\
__status: State.Name\
}"\
--output yaml
)
instance_id=$(echo $instance_data | tr "__" "\n" | grep "^id: " | cut -f2 -d":" | sed "s/ //g")
if [ -n "$instance_id" ] ; then
instance_type=$(echo $instance_data | tr "__" "\n" | grep "^type: " | cut -f2 -d":" | sed "s/ //g")
status=$(echo $instance_data | tr "__" "\n" | grep "^status: " | cut -f2 -d":" | sed "s/ //g")
public_ip=$(echo $instance_data | tr "__" "\n" | grep "^pub: " | cut -f2 -d":" | sed "s/ //g")
echo -e "Server {{server.hostname}} already created \nid: $instance_id\ntype: $instance_type\nstate: $status\nip: $public_ip "
else
interface=$(aws ec2 describe-network-interfaces --query "NetworkInterfaces[][NetworkInterfaceId,PrivateIpAddress]" --output text | grep "{{server.network_private_ip}}" | awk '{print $1}')
if [ -n "$interface" ] ; then
echo "Try to delete interface $interface already using {{server.network_private_ip}} ..."
aws ec2 delete-network-interface --network-interface-id "$interface"
interface=$(aws ec2 describe-network-interfaces --query "NetworkInterfaces[][NetworkInterfaceId,PrivateIpAddress]" --output text | grep "{{server.network_private_ip}}" | awk '{print $1}')
fi
[ -n "$interface" ] && echo "interface $interface is already using {{server.network_private_ip}}" && exit 1
{% if use_time and use_time == 'true' %} time {%- endif -%}
aws ec2 run-instances \
{%- if provider and provider.main and provider.main.subnet %}
--subnet-id {{provider.main.subnet}} \
{%- endif -%}
{%- if provider and provider.main and provider.main.sg and provider.main.sg.id %}
--security-group-ids {{provider.main.sg.id}} \
{%- endif -%}
{%- if server.ssh_key_name %}
--key-name {{server.ssh_key_name}} \
{%- elif defaults.ssh_key_name and defaults.ssh_key_name != '' %}
--key-name {{defaults.ssh_key_name}} \
{%- endif -%}
{%- if server.plan %}
--instance-type {{server.plan}} \
{%- endif -%}
{%- if server.storage_os %}
--image-id {{server.storage_os}} \
{%- endif -%}
{%- if server.storages %}
--block-device-mappings '[
{%- for storage in server.storages %}{%- if loop.index0 == 0 -%}{%- continue %}{%- endif -%}{%- if loop.index0 > 1 -%},{%- endif -%}
{"DeviceName":"/dev/{{storage.voldevice}}","Ebs":{"VolumeSize":
{%- if storage.size > 0 -%}{{storage.size}}{%- elif storage.parts and storage.parts[0] -%}{{storage.parts[0].size}}{%- endif -%},
{%- if storage.encrypted -%}"Encrypted":{{storage.encrypted}},{%- endif -%}
{%- if storage.kms_id and storage.kms_id != "" -%}"KmsKeyId":{{storage.kms_id}},{%- endif -%}
"VolumeType":"{{storage.voltype}}","DeleteOnTermination":{{storage.deletetermination}}},"NoDevice":""}
{%- endfor -%}]' \
{%- endif -%}
{%- if server.user_data %}
--user-data {{server.user_data}} \
{%- endif -%}
{%- if server.disable_stop %}
--disable-api-stop \
{%- endif -%}
{%- if server.zone %}
--region {{server.zone}} \
{%- endif %}
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value={{server.hostname}}},{Key=hostname,Value={{server.hostname}}}]' 'ResourceType=volume,Tags=[{Key=Name,Value={{server.hostname}}}]' \
--output yaml > $out_path/{{server.hostname}}.yaml
instance_id=$(grep "InstanceId:" $out_path/{{server.hostname}}.yaml | cut -f2 -d':')
[ -z "$instance_id" ] && echo "❗ Error: no instance id found for {{server.hostname}} " && exit 1
{%- if provider and provider.priv and provider.priv.subnet and server.network_private_ip != '' %}
while [ "$(aws ec2 describe-instance-status --instance-id $instance_id --query "InstanceStatuses[].InstanceState.Name" --out text)" != "running" ] ; do sleep 10; echo "wait {{server.hostname}} running ..."; done
interface=$(aws ec2 create-network-interface --subnet-id "{{provider.priv.subnet}}" --description "private_ip {{server.hostname}}" \
--private-ip-address "{{server.network_private_ip}}" --query "NetworkInterface.NetworkInterfaceId" \
{% if provider and provider.priv and provider.priv.sg and provider.priv.sg.id %}--groups {{provider.priv.sg.id}} {%- endif -%} \
--output text)
[ -n "$interface" ] && [ -n "$instance_id" ] && aws ec2 attach-network-interface --network-interface-id $interface --instance-id $instance_id --device-index 1
{% endif %}
fi
{%- endif -%}