| #!/bin/bash |
| # |
| # Copyright 2015 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| USAGE='Usage: deploy_puppet.sh [-rsndh]' |
| HELP="${USAGE}\n\n\ |
| Force puppet deployment.\n\ |
| The script will first fetch server hostnames from server db,\n\ |
| given the server role and status and/or server name.\n\ |
| And then force puppet deployment on the selected servers.\n\n\ |
| Requirement: |
| - Run on the machine that has access to server db and |
| - Run it as chromeos-test.\n\ |
| - The server must exist in server db, even if -n is used. |
| |
| It should be safe to rerun the script multiple time, \n\ |
| as it doesn't hurt to deploy puppet multiple times.\n\n\ |
| Options:\n\ |
| -r server role as in server db, e.g. 'drone'.\n\ |
| -s server status as in server db, e.g. 'primary'.\n\ |
| -n server hostname.\n\ |
| -d dryrun.\n\ |
| -h help." |
| |
| ROLE= |
| ROLE_OPT= |
| STATUS= |
| STATUS_OPT= |
| HOSTNAME= |
| DRYRUN="FALSE" |
| AUTOTEST_ROOT="/usr/local/autotest" |
| while getopts ":s:r:n:dh" opt; do |
| case $opt in |
| r) |
| ROLE=$OPTARG |
| ;; |
| s) |
| STATUS=$OPTARG |
| ;; |
| n) |
| HOSTNAME=$OPTARG |
| ;; |
| d) |
| DRYRUN="TRUE" |
| ;; |
| h) |
| echo -e "${HELP}" >&2 |
| exit 0 |
| ;; |
| \?) |
| echo "Invalid option: -$OPTARG" >&2 |
| echo -e "${HELP}" >&2 |
| exit 1 |
| ;; |
| :) |
| echo "Option -$OPTARG requires an argument." >&2 |
| echo -e "${HELP}" >&2 |
| exit 1 |
| ;; |
| esac |
| done |
| |
| if [ -n "${ROLE}" ]; then |
| ROLE_OPT="-r ${ROLE}" |
| fi |
| |
| if [ -n "${STATUS}" ]; then |
| STATUS_OPT="-s ${STATUS}" |
| fi |
| |
| if [ -z "${ROLE}" ] && [ -z "${STATUS}" ] && [ -z "${HOSTNAME}" ]; then |
| echo "You must specify at least one of -r, -s or -n" |
| exit 1 |
| fi |
| |
| hosts="$(${AUTOTEST_ROOT}/cli/atest server list ${STATUS_OPT} ${ROLE_OPT} ${HOSTNAME} | awk '/hostname *:/ {gsub(/"/, "", $2); print $2}')" |
| |
| echo -e "\n******* Will update the following servers ********\n " |
| |
| for host in ${hosts}; do |
| echo ${host} |
| done |
| |
| echo -e "\n**************************************************\n" |
| |
| for host in ${hosts}; do |
| run_puppet="ssh ${host} -- 'sudo /root/chromeos-admin/puppet/sync_and_run_puppet -f'" |
| echo -e "\n********** Processing ${host} ****************\n" |
| echo "[Running] ${run_puppet}" |
| if [ "${DRYRUN}" != "TRUE" ]; then |
| eval ${run_puppet} |
| fi |
| echo -e "\n********* Finished processing ${host} *******\n" |
| done |