Ansible : examples création utilisateurs sur un serveur distant

bonjour,

Si quelqu’un aurait un exemple de déploiement d’utilisateurs sur un serveur cela m’intéresse.
En utilisant un utilisateur capable d’être sudo sur l’hôte distant (pas en root).

1 « J'aime »

dans le fichier host

machine:
  ansible_user: ubuntu 
  ansible_become_pass: '<le mot de passe>'

dans le roles

- name: ajouter un utilisateur
  become: yes
  user:
    shell: /usr/sbin/nologin
    name: toto
1 « J'aime »

Merci, en fait c’est un plus compliqué …
Mon souci vient du fait que j’ai mis mes variables dans all.yml et surtout webservers.yml:

inventaires/prod/hosts (avec un group : webservers)
inventaires/prod/group_vars/all.yml
inventaires/prod/group_vars/webservers.yml
playbooks/myplaybooks.yml
roles/users_create/tasks/main.yml

Ce que tu viens de créer est dans mon role (users_create).

les variables sont dans le fichier all.yml Et webservers.yml …
celle de webservers ne passent pas car …
… quand je lance le playbooks (qui vise hosts: webservers) :

les variables sont non définies, la est le souci ?
je ne sais pas pourquoi.

Cette structure est tirée des best practices Ansible … (layout pour env. prod, test , recette)
https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html#alternative-directory-layout

Ton arbo avec /prod/ est elle défini dans ton ansible.cfg pour les group_vars et hosts_vars ?

Salut djayroma !

Le ansible est vide hormis :

  • remote_port = 22972
  • private_key_file = /xxxxxxxxxx

Donc je dirai , non … :thinking:

Mais je lance le playbooks comme ça :

ansible-playbook playbooks/myplaybooks.yml -i inventaires/test
Donc il devrait bien accéder aux variables sous l’arbo inventaires/test … (donc all.yml ET webservers.yml)
D’autant plus que webservers est un groupe défini dans le fichiers hosts (inventaires/test/hosts)

dans le role :

msg: « {{ ansible_become_password }} »

(cette var est dans le /etc/ansible/inventaires/prod/group_vars/all.yml , logique elle s’applique à tous les serveurs)
Et si je definie la variable dans le playbook … le role choppe bien la variable … serait-ce un bug ?

L’erreur :

TASK [users_create : on debugue] **********************************************************************
fatal: [web1.tux.intra]: FAILED! => {« msg »: « The task includes an option with an undefined variable. The error was: ‹ ansible_become_password › is undefined\n\nThe error appears to be in ‹ /etc/ansible/roles/users_bastion/tasks/main.yml ›: line 12, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name : on debugue\n ^ here\n »}

L’inventaire est ok car :

ansible-inventory -i inventaires/test/hosts --list

… me retourne bien mes hotes avec les variables correctement définis et agencées.

Bonjour @anon6747921,
si tu veux récupérer tes variables qui sont dans webservers.yml, il faut que ton serveur soit dans ce groupe dans l’inventaire.

donc tu dois avoir quelque part dans l’inventaire :
[webservers]
Serveur

En fait je l’utilise pas exactement comme toi, j’ai plusieurs fichiers inventaire.inv puis chaque serveur et ses variables dans un dossier host_vars et pas de fichiers hosts, mais ça doit être à peu près pareil.
La structure et les rôles sont là : https://github.com/lefilament/ansible
D’après tes commentaires, tu as prod et test sous inventory/ avec les mếmes fichiers dedans (notamment all.yml et webservers.yml) ?

Dans ton dernier message, le ansible_become_password c’est le mot de passe de l’utilisateur qui va faire un sudo sur le serveur distant. Si tu le mets dans all.yml ça veut dire que sur chaque serveur l’utilisateur que tu utilises pour te connecter a le même mot de passe ?

Pour ajouter un utilisateur, on utilise aussi la commande user avec plus de paramètres pour générer et récupérer la clé publique qu’on ajoute ensuite dans le fichier host_vars correspondant:

  • name: Create {{ host_user }} user
    user:
    name: « {{ host_user }} »
    group: « {{ host_user }} »
    password: « {{ host_password | password_hash(‹ sha512 ›, 65534 | random(seed=inventory_hostname) | string) }} »
    generate_ssh_key: yes
    ssh_key_file: .ssh/id_ed25519
    ssh_key_type: ed25519
    shell: /bin/bash
    register: publickey

si je met les variables dans le playbook/webservers.xml : le role fonctionne sans erreur !
c’est bizare.

oublions prod, rec (recette).
mon inventaires est dans /etc/ansible/inventaires/prod/hosts
mes variables concernant le test dans :
/etc/ansible/inventaires/prod/group_vars/all.yml
/etc/ansible/inventaires/prod/group_vars/webservers.yml
/etc/ansible/inventaires/prod/host_vars/ (il est vide pour l’instant)

(tout est au format YAML)

ansible-inventory -i inventaires/prod/hosts --list

{
    "_meta": {
        "hostvars": {
            "webserver1.dom.intra": {
                "all": {
                    "vars": {
                        "ansible_become": true,
                        "ansible_become_password": "xxxxxxxxxxxxx",
                        "ansible_become_user": "root",
                        "sshkeys_path": "/home/gestionnaire/production/clefs"
                    }
                },
                "webservers": {
                    "vars": {
                        "web_allowed_users": [
                            "user1",
                            "user2",
                            "user3",
                            "user4",
                            "user5",
                            "..."
                        ],
                        "web_default_users": [
                            "nobody",
                            "gestionnaire"
                        ]
                    }
                }
            },

j’accède à mes variables (dans le role) comme cela :

with_items: « {{ web_allowed_users }} »

├── filter_plugins
├── inventaires
│   ├── prod
│   │   ├── group_vars
│   │   └── host_vars
│   ├── rec
│   │   ├── group_vars
│   │   └── host_vars
│   └── test
│       ├── group_vars
│       └── host_vars
├── library
├── module_utils
├── playbooks
│   ├── prod
│   ├── rec
│   └── test
├── roles
│   ├── apache2
│   ├── common
│   │   ├── defaults
│   │   ├── files
│   │   ├── handlers
│   │   ├── library
│   │   ├── lookup_plugins
│   │   ├── meta
│   │   ├── module_utils
│   │   ├── tasks
│   │   ├── templates
│   │   └── vars
│   ├── users_bastion
│   │   └── tasks
│   ├── users_server
│   └── utils

De mon côté quand je fais un ansible-inventory -i inventory_filament.inv --list, les variables sont toutes listées directement sous le nom de mon host (sans un sous groupe par group_vars comme tu as).

Je pense que c’est peut-être lié à ça, il te faut peut-être utiliser {{ all.ansible_become_user }}

Pour tester tes variables tu peux utiliser le module debug, comme ça pour afficher toutes les variables telles que disponibles pour cet host :
ansible -i inventaires/prod/hosts webserver1.dom.intra -m debug -a "var=hostvars[inventory_hostname]"

Et pour tester une variable en particulier :
ansible -i inventaires/prod/hosts webserver1.dom.intra -m debug -a "var=ansible_become_pass"

Ah sinon je viens de voir aussi que la variable qu’Ansible utilise c’est ansible_become_pass et pas ansible_become_password (mais tu as peut-être renvoyé la variable de base Ansible vers cette nouvelle variable)

Merci rémi je teste tout cela rapidement.

ne marche pas … :frowning:
il faut juste se dire que si je mets toutes ces variables directement dans le playbook c’est ok, donc le role est bon dans ce cas.
Ce que je ne veux pas, car sinon mon playbook ne servira que pour un serveur … on a bcp …

yalllaaa !
j’ai trouvé la réponse avec l’aide des gars d’ansible sur l’irc (après mettre fait proprement fermé mon bug issu … chaise clavier issue :-))
Et quand je dis proprement c’est avec la solution pour clore.

en fait tou marche nickel , j’ai juste codé mes variables au format yaml pure …
pas de bol dans le « inventaires/prod/group_vars/all.yml » faut le coder à plat comme un cochon sans mise en forme!
(idem pour le webservers.yml)

Ca donne ca pour le premier :

---
sshkeys_path: /home/svcansible/production/clefs
ansible_become: yes
ansible_become_user: root
ansible_become_password: xxxxxxxx

(bon password, à mettre dans un Vault bien sure … mais chaque chose en son temps)

et le second :

---
# file: /etc/ansible/inventaires/prod/group_vars/webservers.yml
# Fichier des variables pour le group 'webservers', des hotes - TEST
bastion_default_users: ['nobody','svcansible']
bastion_allowed_users: ['toto','user1','user2','user3','user4']

Merci à tous.

1 « J'aime »