| #!/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}| grep Hostname| awk {'print $3'})" | |
| 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 | |
| git_pull="ssh -t ${host} -- 'sudo git --work-tree=/root/chromeos-admin --git-dir=/root/chromeos-admin/.git pull'" | |
| run_puppet="ssh ${host} -- 'sudo /root/chromeos-admin/puppet/run_puppet'" | |
| echo -e "\n********** Processing ${host} ****************\n" | |
| echo "[Running] ${git_pull}" | |
| if [ "${DRYRUN}" != "TRUE" ]; then | |
| eval ${git_pull} | |
| fi | |
| echo "[Running] ${run_puppet}" | |
| if [ "${DRYRUN}" != "TRUE" ]; then | |
| eval ${run_puppet} | |
| fi | |
| echo -e "\n********* Finished processing ${host} *******\n" | |
| done |