rwoinst: intégrer des fonctionnalités de ruinst; support préliminaire de deploy
This commit is contained in:
parent
2561f67213
commit
e9b574d83d
5
ruinst
5
ruinst
|
@ -56,9 +56,8 @@ OPTIONS
|
||||||
Par défaut, si aucun hôte n'est spécifié, la configuration locale de
|
Par défaut, si aucun hôte n'est spécifié, la configuration locale de
|
||||||
déploiement est interrogée pour avoir cette information.
|
déploiement est interrogée pour avoir cette information.
|
||||||
-c, --deploy-config CONFNAME
|
-c, --deploy-config CONFNAME
|
||||||
Cette option permet de
|
Cette option permet de spécifier le nom de la configuration à utiliser
|
||||||
spécifier le nom de la configuration à utiliser pour effectuer la
|
pour effectuer la requête. Par défaut, utiliser le nom 'ruinst'"
|
||||||
requête."
|
|
||||||
}
|
}
|
||||||
|
|
||||||
set_defaults pubkeys
|
set_defaults pubkeys
|
||||||
|
|
133
rwoinst
133
rwoinst
|
@ -10,7 +10,9 @@ USAGE
|
||||||
$scriptname [-H host] [-T tmproot] <file|archive|dir>... [-- options de woinst]
|
$scriptname [-H host] [-T tmproot] <file|archive|dir>... [-- options de woinst]
|
||||||
|
|
||||||
OPTIONS
|
OPTIONS
|
||||||
-C Ne pas faire le déploiement. Configurer uniquement la connexion par clé
|
-C, --configure-user
|
||||||
|
--configure USER [--uses-su]
|
||||||
|
Ne pas faire le déploiement. Configurer uniquement la connexion par clé
|
||||||
sur les hôtes distants spécifiés pour le user spécifié. Il faut pouvoir
|
sur les hôtes distants spécifiés pour le user spécifié. Il faut pouvoir
|
||||||
se connecter par mot de passe pour configurer la connexion par clé.
|
se connecter par mot de passe pour configurer la connexion par clé.
|
||||||
Si l'on veut configurer la connexion par clé pour le user root, mais que
|
Si l'on veut configurer la connexion par clé pour le user root, mais que
|
||||||
|
@ -19,53 +21,135 @@ OPTIONS
|
||||||
il est possible de faire la configuration avec '--configure root'. La
|
il est possible de faire la configuration avec '--configure root'. La
|
||||||
commande serait alors
|
commande serait alors
|
||||||
$scriptname -H user@host --configure root
|
$scriptname -H user@host --configure root
|
||||||
-T tmproot
|
Si l'hôte distant n'a pas sudo ou si sudo n'est pas configuré, il faut
|
||||||
|
rajouter l'option --uses-su, e.g:
|
||||||
|
$scriptname -h user@host --configure root --uses-su
|
||||||
|
-T, --tmproot TMPROOT
|
||||||
Spécifier le répertoire temporaire sur l'hôte distant, comme par exemple
|
Spécifier le répertoire temporaire sur l'hôte distant, comme par exemple
|
||||||
/var/tmp. Cette option est utile pour les vservers, qui ont par défaut
|
/var/tmp. Cette option est utile pour les vservers, qui ont par défaut
|
||||||
un /tmp minuscule de 16 Mo.
|
un /tmp minuscule de 16 Mo.
|
||||||
-S ssh
|
-S, --ssh SSH
|
||||||
Spécifier le programme à utiliser pour la connection par ssh.
|
Spécifier le programme à utiliser pour la connection par ssh.
|
||||||
|
-h, --host hosts
|
||||||
|
-h, --host @hostsfile
|
||||||
-H host
|
-H host
|
||||||
Spécifier un hôte distant sur lequel faire le déploiement. Plusieurs
|
Spécifier un ou plusieurs hôtes sur lequels faire le déploiement. Pour
|
||||||
options -H peuvent être spécifiées, ou alors on peut séparer plusieurs
|
spécifier plusieurs hôtes, il est possible d'utiliser plusieurs fois
|
||||||
hôtes par ':', e.g. -H host1:host2
|
l'option -h, ou spécifier en une seule fois plusieurs hôtes en les
|
||||||
|
séparant par un espace ou le caractère ':', e.g. 'host1 host2' ou
|
||||||
|
'host1:host2'. Si la spécification contient les caractères { et },
|
||||||
|
l'expansion est effectuée, e.g
|
||||||
|
-h 'root@{host1,host2}.univ.run'
|
||||||
Par défaut, la connexion sur l'hôte distant se fait avec l'utilisateur
|
Par défaut, la connexion sur l'hôte distant se fait avec l'utilisateur
|
||||||
root. Il est possible de spécifier un autre utilisateur avec la syntaxe
|
root. Il est possible de spécifier un autre utilisateur avec la syntaxe
|
||||||
user@host, e.g -H user@host"
|
user@host, e.g -h user@host
|
||||||
|
La forme @hostsfile permet de lire la liste des hôtes depuis le fichier
|
||||||
|
hostsfile, à raison d'un hôte par ligne.
|
||||||
|
--deploy
|
||||||
|
--no-deploy
|
||||||
|
Autoriser (respectivement interdire) l'utilisation de la configuration
|
||||||
|
locale de déploiement pour identifier la destination si aucun hôte n'est
|
||||||
|
spécifié.
|
||||||
|
Par défaut, si aucun hôte n'est spécifié, la configuration locale de
|
||||||
|
déploiement est interrogée pour avoir cette information.
|
||||||
|
-c, --deploy-config CONFNAME
|
||||||
|
Cette option permet de spécifier le nom de la configuration à utiliser
|
||||||
|
pour effectuer la requête. Par défaut, utiliser le nom 'rwoinst'"
|
||||||
}
|
}
|
||||||
|
|
||||||
set_defaults pubkeys
|
set_defaults pubkeys
|
||||||
|
|
||||||
action=deploy
|
action=deploy
|
||||||
confuser=
|
confuser=
|
||||||
|
uses_su=
|
||||||
tmproot=
|
tmproot=
|
||||||
hosts=()
|
|
||||||
SSH=
|
SSH=
|
||||||
|
hosts=()
|
||||||
|
deploy_enable=1
|
||||||
|
deploy_confname=rwoinst
|
||||||
parse_opts "${PRETTYOPTS[@]}" \
|
parse_opts "${PRETTYOPTS[@]}" \
|
||||||
--help '$exit_with display_help' \
|
--help '$exit_with display_help' \
|
||||||
-C action=configure \
|
-C,--configure-user action=configure \
|
||||||
--configure: '$set@ confuser;action=configure' \
|
--configure: '$set@ confuser;action=configure' \
|
||||||
|
--uses-su uses_su=1 \
|
||||||
-T:,--tmproot: tmproot= \
|
-T:,--tmproot: tmproot= \
|
||||||
-S: SSH= \
|
-S:,--ssh: SSH= \
|
||||||
-h:,-H:,--host: hosts \
|
-h:,-H:,--host: hosts \
|
||||||
|
--deploy deploy_enable=1 \
|
||||||
|
--no-deploy deploy_enable= \
|
||||||
|
-c:,--deploy-config deploy_confname= \
|
||||||
@ args -- "$@" && set -- "${args[@]}" || die "$args"
|
@ args -- "$@" && set -- "${args[@]}" || die "$args"
|
||||||
|
|
||||||
function _dot_is_localhost() {
|
SSH="${SSH:-ssh}"
|
||||||
[ "$1" == "." ] && echo "localhost" || echo "$1"
|
|
||||||
|
__PARSED_HOSTS=()
|
||||||
|
__PARSED_FILES=()
|
||||||
|
function parse_hostsfile() {
|
||||||
|
# Lire chacun des fichiers $* et initialiser __PARSED_HOSTS avec la liste
|
||||||
|
# des hôtes mentionnés dans les fichiers.
|
||||||
|
local inputfile basedir inputs input
|
||||||
|
for inputfile in "$@"; do
|
||||||
|
inputfile="$(abspath "$inputfile")"
|
||||||
|
array_contains __PARSED_FILES "$inputfile" && {
|
||||||
|
ewarn "$(ppath "$inputfile"): inclusion récursive"
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
array_add __PARSED_FILES "$inputfile"
|
||||||
|
basedir="$(dirname "$inputfile")"
|
||||||
|
|
||||||
|
array_from_lines inputs "$(<"$inputfile" filter_conf)" || {
|
||||||
|
ewarn "$inputfile: fichier ingnoré"
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for input in "${inputs[@]}"; do
|
||||||
|
if [ "${input#@}" != "$input" ]; then
|
||||||
|
# fichier inclus
|
||||||
|
parse_hostsfile "$(abspath "${input#@}" "$basedir")"
|
||||||
|
else
|
||||||
|
array_addu __PARSED_HOSTS "$input"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
}
|
}
|
||||||
|
function __expand_braces() {
|
||||||
|
if [[ "$1" == *{* ]] && [[ "$1" == *}* ]]; then
|
||||||
|
eval "echo $1"
|
||||||
|
else
|
||||||
|
echo "$1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function __dot_is_localhost() { [ "$1" == "." ] && echo "localhost" || echo "$1"; }
|
||||||
function fix_hosts() {
|
function fix_hosts() {
|
||||||
# Si hosts contient des éléments multiple, comme a:b, séparés ces
|
# Si hosts contient des éléments multiple, comme a:b, séparer ces
|
||||||
# éléments. i.e (a b:c) --> (a b c)
|
# éléments. i.e (a b:c) --> (a b c)
|
||||||
# remplacer aussi les '.' par 'localhost'
|
# Supporter la syntaxe @hostsfile qui permet de charger la liste des hôtes
|
||||||
array_fix_paths hosts
|
# depuis un fichier.
|
||||||
array_map hosts _dot_is_localhost
|
# Remplacer aussi les '.' par 'localhost'
|
||||||
|
array_map hosts __expand_braces
|
||||||
|
array_fix_paths hosts ":"
|
||||||
|
array_fix_paths hosts " "
|
||||||
|
|
||||||
|
local -a _hosts _tmphosts host
|
||||||
|
for host in "${hosts[@]}"; do
|
||||||
|
host="${host%/}"
|
||||||
|
if [ "${host#@}" != "$host" ]; then
|
||||||
|
__PARSED_HOSTS=()
|
||||||
|
parse_hostsfile "${host#@}"
|
||||||
|
array_fix_paths __PARSED_HOSTS
|
||||||
|
array_extendu _hosts __PARSED_HOSTS
|
||||||
|
else
|
||||||
|
array_addu _hosts "$host"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
array_copy hosts _hosts
|
||||||
|
array_map hosts __dot_is_localhost
|
||||||
}
|
}
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# Configuration de l'accès par clé aux hôtes
|
# Configuration de l'accès par clé aux hôtes
|
||||||
|
|
||||||
if [ "$action" == "configure" ]; then
|
if [ "$action" == "configure" ]; then
|
||||||
args=(${confuser:+--configure "$confuser"})
|
args=(${confuser:+--configure "$confuser"} ${uses_su:+--uses-su} -S "$SSH")
|
||||||
for host in "${hosts[@]}"; do
|
for host in "${hosts[@]}"; do
|
||||||
args=("${args[@]}" -H "$host")
|
args=("${args[@]}" -H "$host")
|
||||||
done
|
done
|
||||||
|
@ -75,8 +159,6 @@ fi
|
||||||
################################################################################
|
################################################################################
|
||||||
# Déploiement
|
# Déploiement
|
||||||
|
|
||||||
SSH="${SSH:-ssh}"
|
|
||||||
|
|
||||||
## Bundle à déployer
|
## Bundle à déployer
|
||||||
if [ -z "$1" ] || [[ "$1" == -* ]] || [[ "$1" == *=* ]]; then
|
if [ -z "$1" ] || [[ "$1" == -* ]] || [[ "$1" == *=* ]]; then
|
||||||
# pas d'argument, ou c'est une option (qui fait donc partie des arguments de
|
# pas d'argument, ou c'est une option (qui fait donc partie des arguments de
|
||||||
|
@ -85,6 +167,19 @@ if [ -z "$1" ] || [[ "$1" == -* ]] || [[ "$1" == *=* ]]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
## Hôtes sur lesquels faire le déploiement
|
## Hôtes sur lesquels faire le déploiement
|
||||||
|
if array_isempty hosts && [ -n "$deploy_enable" ]; then
|
||||||
|
urequire deploy
|
||||||
|
deploy_setconf "$deploy_confname"
|
||||||
|
if deploy_loadconf; then
|
||||||
|
setxx wobundle=abspath "$1" // basename --
|
||||||
|
if eval "$(deploy_query -v host DEST wobundle rwoinst_bundle "" shell "$wobundle")"; then
|
||||||
|
check_interaction -c && einfo "Ce bundle sera déployé vers les hôtes suivants:
|
||||||
|
$(array_to_lines host "" " ")"
|
||||||
|
ask_any "Voulez-vous continuer?" Oq || die
|
||||||
|
array_copy hosts host
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
array_isempty hosts && read_value "Entrez une liste d'hôtes séparés par ':'" hosts "localhost"
|
array_isempty hosts && read_value "Entrez une liste d'hôtes séparés par ':'" hosts "localhost"
|
||||||
fix_hosts
|
fix_hosts
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue