1 votes

Gérer les utilisateurs et les ports ouverts avec Ansible

Je commence à utiliser Ansible.

J'ai peu d'hôtes dans mon /etc/ansible/hosts . Ce fichier et mes playbooks sont versionnés avec git. Les membres de mon équipe sont versionnés dans git comme

$cat users/john.json
{
   login: 'john.johnson',
   firstName: 'John',
   lastName : 'Johnson',
   sshPubKey: '....'
}

Je veux accorder à certains utilisateurs l'accès à certaines machines, par exemple :

server1 [john, alice, bob]
server2 [john, alice]
server3 [john, bob]
server4 [john]
server5 [john, kevin]
server6 [john, albert, alice]
server7 [john, bob, kevin]

J'aimerais également avoir la même approche pour les ports ouverts tels que :

server1 [22, 80, 443]
server2 [22, 1234]
server3 [22, 1122]
server4 [22]
server5 [22, 1717]
server6 [22, 80, 443]
server7 [22]

Je n'ai pas besoin d'aide pour écrire les tâches du playbook (je sais utiliser le module user/ufw) mais je ne trouve pas de moyen de centraliser proprement une configuration par hôte avec ansible.

La seule solution que j'ai pour l'instant est d'avoir un user.yml y port.yml les éditer chaque fois que je veux les exécuter pour un serveur spécifique et exécuter le playbook avec une commande --limit server1 . Cela ne me semble pas propre et m'empêche d'avoir un aperçu clair sur git des accès des utilisateurs et des ports ouverts pour chaque serveur.

Quelle serait la meilleure façon d'organiser cela dans ansible ?

2voto

Vladimir Botka Points 3372

Étant donné le dictionnaire servers (voir la version abrégée dans le playbook ci-dessous) et les fichiers JSON dans le répertoire users créons le dictionnaire users dans la première pièce et l'utiliser dans la pièce suivante. Par exemple

- name: Collect data
  hosts: server1:server2:server3

  vars:
    servers:
      server1:
        access: [john, alice, bob]
        ports: [22, 80, 443]
      server2:
        access: [john, alice]
        ports: [22, 1234]
      server3:
        access: [john, bob]
        ports: [22, 1122]

  tasks:

    - block:
        - set_fact:
            servers: "{{ servers }}"
        - set_fact:
            users_list: "{{ servers|json_query('*.access')|flatten|unique }}"
        - set_fact:
            users: "{{ users|default({})|
                       combine({item: lookup('file', 'users/' ~ item ~ '.json')|from_yaml}) }}"
          loop: "{{ users_list }}"
        - debug:
            var: users
      run_once: true

- name: Configure users
  hosts: server1:server2:server3
  tasks:
    - debug:
        msg:
          - "{{ inventory_hostname }}"
          - "{{ item }}"
          - "{{ users[item].sshPubKey }}"
      loop: "{{ servers[inventory_hostname].access }}"

donne

PLAY [Collect data] ***
...
ok: [server1] => 
  users:
    alice:
      firstName: Alice
      lastName: Springs
      login: alice.springs
      sshPubKey: sshPubKey_alice
    bob:
      firstName: Bob
      lastName: Brown
      login: bob.brown
      sshPubKey: sshPubKey_bob
    john:
      firstName: John
      lastName: Johnson
      login: john.johnson
      sshPubKey: sshPubKey_john

PLAY [Configure users] ***
...
ok: [server1] => (item=john) => 
  msg:
  - server1
  - john
  - sshPubKey_john
ok: [server1] => (item=alice) => 
  msg:
  - server1
  - alice
  - sshPubKey_alice
ok: [server1] => (item=bob) => 
  msg:
  - server1
  - bob
  - sshPubKey_bob
ok: [server3] => (item=john) => 
  msg:
  - server3
  - john
  - sshPubKey_john
ok: [server2] => (item=john) => 
  msg:
  - server2
  - john
  - sshPubKey_john
ok: [server3] => (item=bob) => 
  msg:
  - server3
  - bob
  - sshPubKey_bob
ok: [server2] => (item=alice) => 
  msg:
  - server2
  - alice
  - sshPubKey_alice

Modifier les tâches dans la pièce Configure users à vos besoins. De la même manière, il est possible d'ajouter un jeu suivant Configure ports .

1voto

songsong Points 173

Il y a plusieurs façons d'y parvenir.

Définir des variables dans l'inventaire :

server1 users='["joe", "jane"]'
server2 users='["jane"]'

Définir les variables dans un fichier de la base de données host_vars répertoire.

Utilisation include_vars . Exemple de contenu de fichier :

"users": {
  "server1": [ "joe", "jane" ],
  "server2": [ "jane" ]
}

Le charger avec include_vars . Pour votre boucle de tâches ( with_items ) sur users[ansible_hostname]

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X