J'ai ma structure de répertoire comme celle-ci
└── digitalocean
├── README.md
├── play.yml
└── roles
├── bootstrap_server
│ └── tasks
│ └── main.yml
├── create_new_user
│ └── tasks
│ └── main.yml
├── update
│ └── tasks
│ └── main.yml
└── vimserver
├── files
│ └── vimrc_server
└── tasks
└── main.yml
Lorsque je crée un utilisateur sous le rôle create_new_user
, J’étais en train de coder le nom d’utilisateur comme
---
- name: Creating a user named username on the specified web server.
user:
name: username
state: present
Shell: /bin/bash
groups: admin
generate_ssh_key: yes
ssh_key_bits: 2048
ssh_key_file: .ssh/id_rsa
- name: Copy .ssh/id_rsa from Host box to the remote box for user username
become: true
copy:
src: ~/.ssh/id_rsa.pub
dest: /home/usernmame/.ssh/authorized_keys
mode: 0600
owner: username
group: username
Une façon de résoudre ce problème peut être de créer un var/main.yml
et mettez le nom d'utilisateur ici. Mais je voulais quelque chose à travers lequel je peux spécifier le nom d'utilisateur à play.yml
niveau. Comme j'utilise également le nom d'utilisateur dans le rôle vimrcserver
.
J'appelle les rôles en utilisant play.yml
---
- hosts: testdroplets
roles:
- update
- bootstrap_server
- create_new_user
- vimserver
Un modèle fonctionnerait-il ici dans ce cas? Impossible de trouver beaucoup de ces DONC questions
Je l'ai fait en faisant un
---
- hosts: testdroplets
roles:
- update
- bootstrap_server
- role: create_new_user
username: username
- role: vimserver
username: username
sur play.yml
Bien que j'aimerais voir une approche différente alors cette
Docs : http://docs.ansible.com/ansible/playbooks_roles.html#roles
[~ # ~] éditer [~ # ~]
J'ai finalement réglé avec une structure de répertoire comme
$ tree
.
├── README.md
├── ansible.cfg
├── play.yml
└── roles
├── bootstrap_server
│ └── tasks
│ └── main.yml
├── create_new_user
│ ├── defaults
│ │ └── main.yml
│ └── tasks
│ └── main.yml
├── update
│ └── tasks
│ └── main.yml
└── vimserver
├── defaults
│ └── main.yml
├── files
│ └── vimrc_server
└── tasks
└── main.yml
Où je crée un defaults/main.yml
fichier dans les rôles pour lesquels j’ai besoin de {{username}}
Si quelqu'un est intéressé par le code,
Vous devriez pouvoir mettre username
dans une entrée vars
de play.yml.
Les variables peuvent également être divisées en fichiers séparés.
Voici un exemple montrant les deux options:
- hosts: all
vars:
favcolor: blue
vars_files:
- /vars/external_vars.yml
tasks:
- name: this is just a placeholder
command: /bin/echo foo
https://docs.ansible.com/ansible/playbooks_variables.html#variable-file-separation
Ansible semble se réjouir de pouvoir faire la même chose de différentes manières, sans avoir ni une référence complète ni un raisonnement expliquant toutes les implications de chaque approche différente :). Si vous ne vous souveniez pas de ce qui précède était possible (j’avais complètement oublié vars_files
), l’option la plus facile à trouver dans la documentation aurait pu être une troisième solution, la plus sophistiquée.
Il y a une recommandation en avant pour des exemples ansible. Vous pouvez voir un group_vars
répertoire avec des fichiers qui fournissent automatiquement des valeurs aux hôtes en fonction de leurs groupes, y compris le groupe magique all
. Le répertoire group_vars peut être placé dans le même répertoire que le playbook.
https://github.com/ansible/ansible-examples/tree/master/lamp_simple
Ne pouvez-vous pas simplement passer la variable à partir de la ligne de commande avec le paramètre -e? Ainsi, vous pouvez spécifier la variable même avant l'exécution. Cela donne aussi la déclaration de variable la plus forte qui prend toujours la précendence (voir Précédente de variable ).
Si vous voulez le placer dans votre playbook, je vous suggère de définir le nom d'utilisateur avec le set_fact
directive dans le livre de jeu. Cette variable est alors disponible dans tous les rôles et les playbooks inclus. Quelque chose comme:
---
- hosts: testdroplets
pre_tasks:
- set_fact:
username: my_username
roles:
- update
- bootstrap_server
- create_new_user
- vimserver
Peut-être que c'est ce que tu veux?
---
- hosts: testdroplets
roles:
- update
- bootstrap_server
- { role: create_new_user, username: 'foobar' }
- vimserver
https://docs.ansible.com/ansible/2.5/user_guide/playbooks_reuse_roles.html#using-roles
Tout est là: http://docs.ansible.com/ansible/playbooks_variables.html
bien qu'il y ait déjà de bonnes réponses, mais je voulais ajouter les miennes, car j'ai fait cette chose exacte.
Voici le rôle que j'ai écrit: https://github.com/jmalacho/ansible-examples/tree/master/roles/users
Et j'utilise hash_merge = true et les group_vars de ansible pour créer un dictionnaire d'utilisateurs: clés, groupes de sorte que l'ajout d'un nouvel utilisateur par hôte ou par environnement et la réexécution soient faciles.
J'ai également expliqué comment mon équipe utilisait les variables de groupe pour les environnements une fois: " https://www.coveros.com/ansible-environment-design/ "