The startup-script module lets you run a sequence of runners during virtual
machine (VM) initialization. You can automate software installation, configure
local environments, and stage data consistently across your cluster.
The module copies the runners to a Cloud Storage bucket during deployment. When the VM instance starts, the module downloads the runners from the bucket and runs them in the order that you specify.
For the complete list of inputs and outputs for this module, see the
startup-script
module
page in the Cluster Toolkit GitHub repository.
Before you begin
Before you begin, verify that you meet the following requirements:
- You have installed and configured Cluster Toolkit. For installation instructions, see Set up Cluster Toolkit.
- You have an existing cluster blueprint. You can use and modify an existing
blueprint or create one from scratch. For a working example of a blueprint
configured for startup scripts, see the
examples/image-builder.yamlfile. For more information about creating and customizing blueprints, see Cluster blueprint.
Required roles
To get the permissions that
you need to deploy the startup scripts and create the storage bucket,
ask your administrator to grant you the
Storage Admin (roles/storage.admin) IAM role on your project.
For more information about granting roles, see Manage access to projects, folders, and organizations.
You might also be able to get the required permissions through custom roles or other predefined roles.
To ensure that the VM service account has the necessary
permissions to read the startup scripts from Cloud Storage,
ask your administrator to grant the
Storage Object Viewer (roles/storage.objectViewer) IAM role to the VM service account on your project.
For more information about granting roles, see Manage access to projects, folders, and organizations.
Your administrator might also be able to give the VM service account the required permissions through custom roles or other predefined roles.
Configure runners
When you define a runner, you configure specific attributes to determine its behavior:
destination: The destination path on the VM instance. If you provide an absolute path, the module copies the file to that path. Otherwise, the module creates the file in a temporary folder and deletes the file after the startup script runs.type: The runner type. Useshellfor shell scripts,ansible-localfor Ansible playbooks, ordatato stage files without executing them.content: The text content to upload. You must specify either thecontentattribute or thesourceattribute.source: The path to the local file or data to upload. Use theghpc_stagefunction to ensure correct relative paths to the deployment group directory (for example,source: $(ghpc_stage("path/to/file"))). To reference any other source file, use an absolute path.args: Arguments to pass toshelloransible-localrunners. Foransible-localrunners, the module appends these arguments to the defaultansible-playbookcommand. Don't include arguments that alter the connection or inventory behavior, such as--connectionor--limit.
Set Ansible dependencies
The ansible-local runners require Ansible on the VM instance. If you configure
an ansible-local runner, the module automatically prepends a script that
installs Ansible and its dependencies in a virtual environment at
/usr/local/ghpc-venv. You can disable this behavior by setting the
install_ansible variable to false.
To interact with this environment manually, you can activate it by running the following command on the VM instance:
source /usr/local/ghpc-venv/bin/activate
If you call ansible-playbook manually, you must specify the Python
interpreter inside the virtual environment by appending the following flag:
-e ansible_python_interpreter=/usr/local/ghpc-venv/bin/activate
Stage the runners
By default, the module creates a new Cloud Storage bucket to host the
uploaded scripts. To reuse an existing bucket or folder instead, specify the
gcs_bucket_path setting in your blueprint.
Configure Cloud Storage access
The VM instances require read access to the Cloud Storage bucket that contains
the runners. Ensure that the service account attached to the VM instance has the
https://www.googleapis.com/auth/devstorage.read_only access scope.
Install monitoring agents
You can configure the startup-script module to install a Google monitoring
agent by using the install_stackdriver_agent setting and the
install_cloud_ops_agent setting.
Google recommends that you use the install_stackdriver_agent setting because the
legacy Cloud Monitoring Agent provides better performance for specific high
performance computing (HPC) workloads.
To verify that the agent is running, run the corresponding command on your VM instance:
# Verify the Cloud Ops Agent
sudo systemctl is-active google-cloud-ops-agent"*"
# Verify the legacy Cloud Monitoring Agent
sudo service stackdriver-agent status
If you need to switch between the agents manually, see Troubleshoot Ops Agent installation and start-up.
Create the startup script module
The following example demonstrates how to configure multiple runners, including
shell scripts, Ansible playbooks, and data staging. It also demonstrates how to
override the default bucket creation by specifying a custom gcs_bucket_path
value.
- id: startup
source: modules/scripts/startup-script
settings:
gcs_bucket_path: gs://user-test-bucket/folder1/folder2
install_stackdriver_agent: true
runners:
- type: ansible-local
destination: "modules/filestore/scripts/mount.yaml"
source: "modules/filestore/scripts/mount.yaml"
- type: data
source: /tmp/foo.tgz
destination: /tmp/bar.tgz
- type: shell
destination: "decompress.sh"
content: |
#!/bin/sh
echo $2
tar zxvf /tmp/$1 -C /
args: "bar.tgz 'Expanding file'"
- id: compute-cluster
source: modules/compute/vm-instance
use: [homefs, startup]
Track and debug execution
Debug the startup script on a Linux VM instance:
sudo DEBUG=1 google_metadata_script_runner startup
View the output logs from the startup script:
sudo journalctl -u google-startup-scripts.service
Enable additional environment configurations
The startup-script module provides built-in settings to streamline the
configuration of dependencies and hardware on your virtual machine (VM)
instances.
Install Docker
To install and configure the Docker daemon on your VM instances during
initialization, set the docker setting to true.
- id: startup
source: modules/scripts/startup-script
settings:
docker: true
Mount and format local SSDs
To automatically format and mount local SSDs attached to your VM instances,
set the local_ssd_filesystem setting with your preferred storage
parameters.
- id: startup
source: modules/scripts/startup-script
settings:
local_ssd_filesystem:
mount_point: /mnt/local_ssd
fs_type: ext4
Automate SSH setup
To simplify the secure shell (SSH) configuration between cluster nodes and
authorize internal connections without manual intervention, specify target
hostnames or wildcard patterns in the configure_ssh_host_patterns setting.
- id: startup
source: modules/scripts/startup-script
settings:
configure_ssh_host_patterns:
- "*.internal"
Install Cloud RDMA drivers
If you require Remote Direct Memory Access (RDMA) networking but don't use the
pre-configured high performance computing (HPC) VM image, set the
install_cloud_rdma_drivers setting to true to install the necessary network
drivers automatically.
- id: startup
source: modules/scripts/startup-script
settings:
install_cloud_rdma_drivers: true
What's next
- For the complete list of inputs and outputs for this module, see the
startup-scriptmodule page in the Cluster Toolkit GitHub repository.