web-dev-qa-db-fra.com

Passer des variables à des rôles ansibles

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

18
Tasdik Rahman

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,

22
Tasdik Rahman

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

11
sourcejedi

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
4
L. Tischler

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

3
Richard Urban

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/ "

0
Jon Malachowski