Ansible-Semaphoreを自動設定するスクリプトを作ってみた

# はじめに

自分以外で便利と思う人は少ないかもしれませんが、
せっかく作ったので公開することにしました。

bash スクリプトの参考にでもなれば幸いです。

#　使い方

次のようにコマンドラインで実行すると、
Anaconda Python を自分のホームディレクトリにインストールしてから、
Conda環境を構築、ansible や mariadb やらの設定が一気に終わります。



```bash
$ bash Ansible-Semaphore-Setup.sh \
  --fullname="Goichi Iisaka" \
  --email="iisaka51@gmail.com" \
  --password="hogehoge" --dbpass="hogehoge"
```

実行後は、$HOME/.bash_profile の編集も忘れないようにしてくださいね。
編集例:

```bash
export PATH=$HOME/conda/bin:$PATH:$HOME/.local/bin:$HOME/bin
```


以下、スクリプトです。

```bash:Ansible-Semaphore-Setup.sh
#!/bin/bash

_SUMMARY_="Auto Setup for Ansible Semaphore"
_AUTHOR_="Goichi Iisaka <iisaka51@gmail.com>"
_VERSION_="0.2"

MINICONDA=MicroConda3-18.01-Linux-x86_64.sh

DEBUG=${DEBUG:-"0"}
PROG=$( basename $0 )
MYHOST=$( hostname -s )

FULLNAME=""
EMAIL=""
USERNAME=""
PASSWORD=""
DBPASS=""

VERSION() {
cat <<_EOF_ 1>&2
${PROG} - ${_SUMMARY_)}
Version: ${_VERSION_}
Copyright 2018, ${_AUTHOR_}
_EOF_
}

USAGE() {
cat <<_EOF_ 1>&2

Usage: ${PROG} [options]

OPTIONS:
    --prefix              - Install Prefix (default: ${PREFIX})
    --envname             - Conda EnvName for Ansible (default: ansible)
    --port                - Port number for semaphore (default: 3000)
    --fullname            - Your FullName 
    --email               - Your Email 
    --username            - Username for semaphore 
    --password            - Password for semaphore
    --dbname              - Database name for semaphore (default: semaphore)
    --dbuser              - Database name for semaphore (default: semaphore)
    --dbpass              - Database password for semaphore 
    --dbport              - Port number for database (default: 3306)
    --help                - This messages.
    --version             - Print version and author
_EOF_
}

LONG_OPTIONS=" -l help,version,debug:,fullname:,email:,username:,password:,prefix:,envname:,dbname:,dbpass:,dbport:,port:"
OPTIONS=$( /usr/bin/getopt -o D:  ${LONG_OPTIONS} -- "$@" )

eval set -- "${OPTIONS}"

while true
do
    case "$1" in
    --prefix)      PREFIX="$2"   ; shift 2 ;;
    --envname)     ENVNAME="$2"  ; shift 2 ;;
    --fullname)    FULLNAME="$2" ; shift 2 ;;
    --email)       EMAIL="$2"    ; shift 2 ;;
    --username)    USERNAME="$2" ; shift 2 ;;
    --password)    PASSWORD="$2" ; shift 2 ;;
    --port)        PORT="$2"     ; shift 2 ;;
    --dbname)      DBNAME="$2"   ; shift 2 ;;
    --dbpass)      DBPASS="$2"   ; shift 2 ;;
    --dbport)      DBPORT="$2"   ; shift 2 ;;
    --) shift ; break ;;
    *) USAGE  ; exit ;;
    esac
done

PREFIX=${PREFIX:-"${HOME}/conda"}
ENVNAME=${ENVNAME:-"ansible"}
PORT=${PORT:-"3000"}
DBPORT=${DBPORT:-"3306"}
DBNAME=${DBNAME:-"semaphore"}
DBUSER=${DBNAME:-"semaphore"}
[ x"${FULLNAME}" = "x" ] && read -p "Your Fullname: " FULLNAME
[ x"${EMAIL}" = "x" ]    && read -p "Your Email: " EMAIL
[ x"${USERNAME}" = "x" ] && USERNAME=$( echo ${EMAIL} | cut -d@ -f1 )
[ x"${PASSWORD}" = "x" ] && \
while true
do
    read -es -p "Enter passowrd: " PASS1 ; echo
    read -es -p "Verify passowrd: " PASS2 ; echo
    if [ "${PASS1}" != "${PASS2}" ] ; then
        echo "Passowrd do not match."
    else
        PASSWORD=${PASS1}
        break
    fi
done

[ x${DBPASS} = "x" ] && \
while true
do
    read -es -p "Enter DB passowrd: " PASS1 ; echo
    read -es -p "Verify DB passowrd: " PASS2 ; echo
    if [ "${PASS1}" != "${PASS2}" ] ; then
        echo "Passowrd do not match."
    else
        DBPASS=${PASS1}
        break
    fi
done

if [ ! -f ${MINICONDA} ] ; then
    wget -O ${MINICONDA} http://repobank.openmyroad.com/conda/${MINICONDA}
    chmod 700 ${MINICONDA}
    bash ${MINICONDA} -b -p ${PREFIX}
    export PATH=${PREFIX}/bin:${PATH}
fi

[ -f ${HOME}/.condarc ] || \
cat <<EOF > ${HOME}/.condarc
custom_multichannels:
  openmyroad: [
    'http://repobank.openmyroad.com/conda/pkgs/openmyroad/'
  ]
channels:
  - defaults
  - openmyroad
channels_alias: http://repobank.openmyroad.com/conda/pkgs
show_channel_urls: true
EOF

if [ ! -d ${PREFIX}/envs/${ENVNAME} ] ; then
    conda create -y -n ${ENVNAME}
fi

source activate ${ENVNAME}
conda install -y ansible ansible-semaphore ansible-runner \
    ansible-role ansible-vault ansible-review ansible-generator \
    supervisor3 mariadb jq node.js bcrypt

ENV_PREFIX=$( conda info --json | jq -r .default_prefix )
install -m0700 -d ${HOME}/playbooks
install -m0700 -d ${ENV_PREFIX}/{logs,tmp}
install -m0700 -d ${ENV_PREFIX}/etc/supervisor.d

[ -f ${ENV_PREFIX}/etc/supervisord.conf ] || \
cat <<EOF > ${ENV_PREFIX}/etc/supervisord.conf
[unix_http_server]
file=${ENV_PREFIX}/tmp/supervisor.sock    ; the path to the socket file
[supervisord]
logfile=${ENV_PREFIX}/tmp/supervisord.log ; main log file
logfile_maxbytes=50MB    ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10       ; # of main logfile backups; 0 means none, default 10
loglevel=info            ; log level; default info; others: debug,warn,trace
pidfile=${ENV_PREFIX}/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid
nodaemon=false           ; start in foreground if true; default false
minfds=1024              ; min. avail startup file descriptors; default 1024
minprocs=200             ; min. avail process descriptors;default 200
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix://${ENV_PREFIX}/tmp/supervisor.sock ; use a unix:// URL  for a unix socket
[include]
files = supervisor.d/*.ini
EOF

[ -f ${ENV_PREFIX}/mariadb/data/mysql ] || \
    ${ENV_PREFIX}/mariadb/scripts/mysql_install_db \
        --user=${USER} \
        --basedir=${ENV_PREFIX}/mariadb \
        --datadir=${ENV_PREFIX}/mariadb/data

[ -f ${ENV_PREFIX}/mariadb/errmsg.sys ] || \
  cp ${ENV_PREFIX}/mariadb/share/english/errmsg.sys ${ENV_PREFIX}/mariadb

touch ${ENV_PREFIX}/mariadb/data/mysql.sock

sed -e "/]/ a port=${DBPORT}" \
    -i ${ENV_PREFIX}/mariadb/etc/my.cnf

[ -f ${ENV_PREFIX}/etc/supervisor.d/mariadb.ini ] || \
cat <<EOF > ${ENV_PREFIX}/etc/supervisor.d/mariadb.ini
[program:mariadb]
command=${ENV_PREFIX}/mariadb/bin/mysqld
    --user=${USER}
user=${USER} 
autostart=false  
autorestart=false  
stdout_logfile=${ENV_PREFIX}/logs/maridb.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=4
stdout_capture_maxbytes=1MB
redirect_stderr=true 
EOF

[ -f ${ENV_PREFIX}/etc/supervisor.d/semaphore.ini ] || \
cat <<EOF > ${ENV_PREFIX}/etc/supervisor.d/semaphore.ini
[program:semaphore]
command=${ENV_PREFIX}/bin/semaphore
    --config=${ENV_PREFIX}/etc/semaphore.conf
user=${USER} 
autostart=false  
autorestart=false  
stdout_logfile=${ENV_PREFIX}/logs/semaphore.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=4
stdout_capture_maxbytes=1MB
redirect_stderr=true 
EOF

[ -f ${ENV_PREFIX}/etc/semaphore.conf ] || \
cat <<EOF > ${ENV_PREFIX}/etc/semaphore.conf
{
        "mysql": {
                "host": "127.0.0.1:${DBPORT}",
                "user": "${DBNAME}",
                "pass": "${DBPASS}",
                "name": "${DBUSER}"
        },
        "port": "${PORT}",
        "tmp_path": "${HOME}/playbooks",
        "cookie_hash": "sJilmUw/WqxUCspXevZAswyJUzBhwIa3TafVizE7fPk=",
        "cookie_encryption": "7zz90QwjBKB8/zygGC4R7hoAVXW8EQ4v3nsuA72WsAI=",
        "email_sender": "",
        "email_host": "",
        "email_port": "",
        "web_host": "",
        "ldap_binddn": "",
        "ldap_bindpassword": "",
        "ldap_server": "",
        "ldap_searchdn": "",
        "ldap_searchfilter": "",
        "ldap_mappings": {
                "dn": "",
                "mail": "",
                "uid": "",
                "cn": ""
        },
        "telegram_chat": "",
        "telegram_token": "",
        "concurrency_mode": "",
        "max_parallel_tasks": 0,
        "email_alert": false,
        "telegram_alert": false,
        "ldap_enable": false,
        "ldap_needtls": false
 }
EOF

supervisord
supervisorctl start mariadb

mysql -u root -e "CREATE DATABASE ${DBNAME};"
mysql -u root -e "CREATE USER '${DBUSER}'@'localhost' IDENTIFIED BY '${DBPASS}';"
mysql -u root -e "GRANT ALL PRIVILEGES ON ${DBNAME}.* TO '${DBUSER}'@'localhost' WITH GRANT OPTION;"

PASSWORDHASH=$( python -c "import bcrypt; P=bcrypt.hashpw('${PASSWORD}'.encode(),bcrypt.gensalt()); print(P.decode('utf-8'))" )

semaphore -config ${ENV_PREFIX}/etc/semaphore.conf -migrate
mysql -u ${DBUSER} -p${DBPASS} -e "INSERT INTO user set name='${FULLNAME}',username='${USERNAME}',email='${EMAIL}',password='${PASSWORDHASH}',admin=1,created=UTC_TIMESTAMP()" ${DBNAME}

supervisorctl start semaphore
```