Skip to content
This repository has been archived by the owner on Jan 11, 2023. It is now read-only.

Add Packer #3650

Merged
merged 6 commits into from
Aug 13, 2018
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,9 @@ pkg/openshift/translations/
# test outputs
cmd/_test_output

# packer
packer/settings.json
packer/sp.json

.idea
.vs
45 changes: 44 additions & 1 deletion .vsts-ci.yaml
Original file line number Diff line number Diff line change
@@ -1,8 +1,51 @@
trigger: none

# steps:
# - create an VHD in Packer to normal storage account
# - copy from Packer storage account to classic storage account using AzCopy
# - generate SAS link from azure CLI
# - POST a new SKU to azure marketplace

phases:
- phase: build_vhd
queue: Hosted Linux Preview
steps:
- script: make info
- script: |
docker run --rm \
-v ${PWD}:/go/src/github.com/Azure/acs-engine \
-w /go/src/github.com/Azure/acs-engine \
-e CLIENT_ID=${CLIENT_ID} \
-e CLIENT_SECRET="$(CLIENT_SECRET)" \
-e TENANT_ID=${TENANT_ID} \
-e AZURE_VM_SIZE=${AZURE_VM_SIZE} \
-e AZURE_RESOURCE_GROUP_NAME=${AZURE_RESOURCE_GROUP_NAME} \
-e AZURE_LOCATION=${AZURE_LOCATION} \
${DEIS_GO_DEV_IMAGE} make run-packer
displayName: Building VHD
- script: |
OS_DISK_SAS="$(cat packer-output | grep "OSDiskUriReadOnlySas:" | cut -d " " -f 2)" && \
VHD_NAME="$(echo $OS_DISK_SAS | cut -d "/" -f 8 | cut -d "?" -f 1)" && \
docker run --rm \
-v ${PWD}:/go/src/github.com/Azure/acs-engine \
-w /go/src/github.com/Azure/acs-engine \
-e CLIENT_ID=${CLIENT_ID} \
-e CLIENT_SECRET="$(CLIENT_SECRET)" \
-e TENANT_ID=${TENANT_ID} \
-e CLASSIC_BLOB=${CLASSIC_BLOB} \
-e CLASSIC_SAS_TOKEN="$(SAS_TOKEN)" \
-e OS_DISK_SAS=${OS_DISK_SAS} \
-e VHD_NAME=${VHD_NAME} \
${DEIS_GO_DEV_IMAGE} make az-copy
displayName: Copying resource to Classic Storage Account
- script: |
docker run --rm \
-v ${PWD}:/go/src/github.com/Azure/acs-engine \
-w /go/src/github.com/Azure/acs-engine \
-e CLIENT_ID=${CLIENT_ID} \
-e CLIENT_SECRET="$(CLIENT_SECRET)" \
-e TENANT_ID=${TENANT_ID} \
-e CLASSIC_SA_CONNECTION_STRING="$(CLASSIC_SA_CONNECTION_STRING)" \
-e START_DATE=${START_DATE} \
-e EXPIRY_DATE=${EXPIRY_DATE} \
${DEIS_GO_DEV_IMAGE} make generate-sas
displayName: Getting Shared Access Signature URI
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -153,3 +153,4 @@ devenv:

include versioning.mk
include test.mk
include packer.mk
17 changes: 17 additions & 0 deletions packer.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
build-packer:
@packer build -var-file=packer/settings.json packer/vhd-image-builder.json

init-packer:
@./packer/init-variables

az-login:
az login --service-principal -u ${CLIENT_ID} -p ${CLIENT_SECRET} --tenant ${TENANT_ID}

run-packer: az-login
@packer version && make init-packer && (make build-packer | tee packer-output)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When you invoke make from inside a Makefile, it should be referred to as $(MAKE) according to the GNU docs.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed


az-copy: az-login
azcopy --source "${OS_DISK_SAS}" --destination "${CLASSIC_BLOB}/${VHD_NAME}" --dest-sas "${CLASSIC_SAS_TOKEN}"

generate-sas: az-login
az storage container generate-sas --name vhds --permissions lr --connection-string "${CLASSIC_SA_CONNECTION_STRING}" --start ${START_DATE} --expiry ${EXPIRY_DATE} | tee vhd-sas
7 changes: 7 additions & 0 deletions packer/cleanup-vhd.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/bin/bash -eux

## Cleanup packer SSH key and machine ID generated for this boot
rm -f /root/.ssh/authorized_keys
rm -f /home/packer/.ssh/authorized_keys
rm -f /etc/machine-id
touch /etc/machine-id
65 changes: 65 additions & 0 deletions packer/init-variables.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
#!/bin/bash -e

CDIR=$(dirname "${BASH_SOURCE}")

SETTINGS_JSON="${SETTINGS_JSON:-./packer/settings.json}"
SP_JSON="${SP_JSON:-./packer/sp.json}"
SUBSCRIPTION_ID="${SUBSCRIPTION_ID:-`az account show -o json --query="id" | tr -d '"'`}"
STORAGE_ACCOUNT_NAME="aksimages$(date +%s)"

echo "Subscription ID: ${SUBSCRIPTION_ID}"
echo "Service Principal Path: ${SP_JSON}"

if [ -a "${SP_JSON}" ]; then
echo "Existing credentials file found."
exit 0
elif [ -z "${CLIENT_ID}" ]; then
echo "Service principal not found! Generating one @ ${SP_JSON}"
az ad sp create-for-rbac -n aks-images-packer$(date +%s) -o json > ${SP_JSON}
CLIENT_ID=`cat ${SP_JSON} | jq -r .appId`
CLIENT_SECRET=`cat ${SP_JSON} | jq -r .password`
TENANT_ID=`cat ${SP_JSON} | jq -r .tenant`
fi

avail=$(az storage account check-name -n ${STORAGE_ACCOUNT_NAME} -o json | jq -r .nameAvailable)
if $avail ; then
echo "creating new storage account ${STORAGE_ACCOUNT_NAME}"
az storage account create -n $STORAGE_ACCOUNT_NAME -g $AZURE_RESOURCE_GROUP_NAME --sku "Standard_RAGRS"
echo "creating new container system"
key=$(az storage account keys list -n $STORAGE_ACCOUNT_NAME -g $AZURE_RESOURCE_GROUP_NAME | jq -r '.[0].value')
az storage container create --name system --public-access container --account-key=$key --account-name=$STORAGE_ACCOUNT_NAME
else
echo "storage account ${STORAGE_ACCOUNT_NAME} already exists."
fi

if [ -z "${CLIENT_ID}" ]; then
echo "CLIENT_ID was not set! Something happened when generating the service principal or when trying to read the sp file!"
exit 1
fi

if [ -z "${CLIENT_SECRET}" ]; then
echo "CLIENT_SECRET was not set! Something happened when generating the service principal or when trying to read the sp file!"
exit 1
fi

if [ -z "${TENANT_ID}" ]; then
echo "TENANT_ID was not set! Something happened when generating the service principal or when trying to read the sp file!"
exit 1
fi

echo "storage name: ${STORAGE_ACCOUNT_NAME}"

cat <<EOF > packer/settings.json
{
"subscription_id": "${SUBSCRIPTION_ID}",
"client_id": "${CLIENT_ID}",
"client_secret": "${CLIENT_SECRET}",
"tenant_id": "${TENANT_ID}",
"resource_group_name": "${AZURE_RESOURCE_GROUP_NAME}",
"location": "${AZURE_LOCATION}",
"storage_account_name": "${STORAGE_ACCOUNT_NAME}",
"vm_size": "${AZURE_VM_SIZE}"
}
EOF

cat packer/settings.json
34 changes: 34 additions & 0 deletions packer/install-dependencies.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#!/bin/bash

source /home/packer/provision_installs.sh
source /home/packer/provision_source.sh

# TODO: deal with etcd versions
ETCD_VERSION="3.2.23"
ETCD_DOWNLOAD_URL="https://acs-mirror.azureedge.net/github-coreos"
installEtcd

installDeps

DOCKER_REPO="https://apt.dockerproject.org/repo"
DOCKER_ENGINE_VERSION="1.13.*"
installDocker

installClearContainersRuntime

VNET_CNI_PLUGINS_URL="https://acs-mirror.azureedge.net/cni/azure-vnet-cni-linux-amd64-latest.tgz"
CNI_PLUGINS_URL="https://acs-mirror.azureedge.net/cni/cni-plugins-amd64-latest.tgz"

installAzureCNI

CONTAINERD_DOWNLOAD_URL_BASE="https://storage.googleapis.com/cri-containerd-release/"
installContainerd

# TODO: install multiple versions
HYPERKUBE_VERSION="v1.10.5"
HYPERKUBE_URL="k8s.gcr.io/hyperkube-amd64:${HYPERKUBE_VERSION}"
extractHyperkube

installFlexVolDrivers

echo "Install complete successfully" > /var/log/azure/golden-image-install.complete
11 changes: 11 additions & 0 deletions packer/settings-example.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"client_id": "",
"client_secret": "",
"tenant_id": "",
"subscription_id": "",
"resource_group_name": "aksimages",
"managed_image_resource_group_name": "aksimages",
"storage_account_name": "",
"location": "West US 2",
"vm_size": "Standard_D2_v2"
}
70 changes: 70 additions & 0 deletions packer/vhd-image-builder.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
{
"variables": {
"client_id": "{{env `AZURE_CLIENT_ID`}}",
"client_secret": "{{env `AZURE_CLIENT_SECRET`}}",
"tenant_id": "{{env `AZURE_TENANT_ID`}}",
"subscription_id": "{{env `AZURE_SUBSCRIPTION_ID`}}",
"location": "{{env `AZURE_LOCATION`}}",
"vm_size": "{{env `AZURE_VM_SIZE`}}"
},
"builders": [
{
"type": "azure-arm",
"client_id": "{{user `client_id`}}",
"client_secret": "{{user `client_secret`}}",
"tenant_id": "{{user `tenant_id`}}",
"subscription_id": "{{user `subscription_id`}}",
"resource_group_name": "{{user `resource_group_name`}}",
"capture_container_name": "acsengine-vhds",
"capture_name_prefix": "acsengine-{{timestamp}}",
"storage_account": "{{user `storage_account_name`}}",
"os_type": "Linux",
"image_publisher": "Canonical",
"image_offer": "UbuntuServer",
"image_sku": "16.04-LTS",
"image_version": "latest",
"azure_tags": {
"dept": "Azure Container Service"
},
"location": "{{user `location`}}",
"vm_size": "{{user `vm_size`}}"
}
],
"provisioners": [
{
"type": "shell",
"inline": [
"sudo mkdir -p /opt/azure/containers",
"sudo chown -R $USER /opt/azure/containers"
]
},
{
"type": "file",
"source": "packer/cleanup-vhd.sh",
"destination": "/home/packer/cleanup-vhd.sh"
},
{
"type": "file",
"source": "parts/k8s/kubernetesinstalls.sh",
"destination": "/home/packer/provision_installs.sh"
},
{
"type": "file",
"source": "parts/k8s/kubernetesprovisionsource.sh",
"destination": "/home/packer/provision_source.sh"
},
{
"type": "file",
"source": "packer/install-dependencies.sh",
"destination": "/home/packer/install-dependencies.sh"
},
{
"type": "shell",
"inline": [
"sudo /bin/bash -eux /home/packer/install-dependencies.sh",
"sudo /bin/bash -eux /home/packer/cleanup-vhd.sh",
"rm /home/packer/*.sh"
]
}
]
}