Votre script d'installation pourrait échouer pour plusieurs raisons:
- Si le groupe n'existe pas déjà, la commande useradd générera une erreur:
useradd: le groupe 'coolgroup' n'existe pas
- La solution à ce problème est de créer le groupe avant d'appeler
useradd
.
- Si le répertoire parent du répertoire utilisateur ($dir dans votre exemple) n'existe pas, la commande useradd générera une erreur:
useradd: cannot create directory /non/default/home/dir
- La solution est de créer le répertoire parent s'il n'existe pas déjà.
- Si le répertoire home existe déjà,
useradd
ne copiera pas les fichiers de modèle:
useradd: warning: the home directory already exists. Not copying any file from skel directory into it.
- La solution à ce problème est de créer le répertoire parent (en utilisant dirname). C'est peut-être la raison pour laquelle votre script original copie les fichiers de modèle dans le répertoire de l'utilisateur.
Vous pouvez voir ces erreurs dans le fichier journal juju pour l'unité du charme. Il est fortement recommandé d'exécuter des scripts bash avec set -e
afin que le script s'arrête à la première erreur. J'aime aussi utiliser set -x
pour afficher les commandes exécutées dans le fichier journal.
J'ai écrit rapidement un charme pour tester ce problème:
$ mkdir /tmp/trusty
$ cd /tmp/trusty
$ charm create user -t bash
$ vi user/hooks/install
$ juju deploy --repository=../../ local:trusty/user
Cela crée un charme "utilisateur" de base, puis j'ai édité user/hooks/install avec ceci:
#!/bin/bash
set -ex
dir=/non/default/home/dir
bash=/bin/bash
user=newuser
group=coolgroup
pass="JujuIsMagic!"
# Le groupe doit être créé avant de tenter d'ajouter l'utilisateur.
groupadd "$group"
# Le répertoire parent doit être créé si ce répertoire n'est pas standard.
mkdir -p `dirname $dir`
useradd -d "$dir" -s "$bash" -g "$group" -m $user
echo "$user:$pass" | chpasswd
su - "$user" --command 'whoami'
su - "$user" --command 'ls -al $dir'
La sortie du script d'installation pour le charme utilisateur est la suivante:
$ tail -F /var/log/juju-mbruzek-local/unit-user-0.log
2014-08-25 14:49:47 INFO install + dir=/non/default/home/dir
2014-08-25 14:49:47 INFO install + bash=/bin/bash
2014-08-25 14:49:47 INFO install + user=newuser
2014-08-25 14:49:47 INFO install + group=coolgroup
2014-08-25 14:49:47 INFO install + pass='JujuIsMagic!'
2014-08-25 14:49:47 INFO install + groupadd coolgroup
2014-08-25 14:49:47 INFO install ++ dirname /non/default/home/dir
2014-08-25 14:49:47 INFO install + mkdir -p /non/default/home
2014-08-25 14:49:47 INFO install + useradd -d /non/default/home/dir -s /bin/bash -g coolgroup -m newuser
2014-08-25 14:49:47 INFO install + echo 'newuser:JujuIsMagic!'
2014-08-25 14:49:47 INFO install + chpasswd
2014-08-25 14:49:47 INFO install + su - newuser --command whoami
2014-08-25 14:49:47 INFO install newuser
2014-08-25 14:49:47 INFO install + su - newuser --command 'ls -al $dir'
2014-08-25 14:49:47 INFO install total 20
2014-08-25 14:49:47 INFO install drwxr-xr-x 2 newuser coolgroup 4096 Aug 25 09:49 .
2014-08-25 14:49:47 INFO install drwxr-xr-x 3 root root 4096 Aug 25 09:49 ..
2014-08-25 14:49:47 INFO install -rw-r--r-- 1 newuser coolgroup 220 Apr 8 20:03 .bash_logout
2014-08-25 14:49:47 INFO install -rw-r--r-- 1 newuser coolgroup 3637 Apr 8 20:03 .bashrc
2014-08-25 14:49:47 INFO install -rw-r--r-- 1 newuser coolgroup 675 Apr 8 20:03 .profile
Vous pouvez voir que les fichiers de modèle sont copiés à partir de la commande useradd. Vous pouvez exécuter des commandes individuelles en tant qu'autre utilisateur avec su
ou sudo
à partir des fichiers hook.