web-dev-qa-db-fra.com

Ansible - Vérifiez si une chaîne existe dans le fichier

Je suis très nouveau à Ansible

Est-il possible de vérifier si une chaîne existe dans un fichier en utilisant Ansible.

Je veux vérifier si un utilisateur a accès à un serveur. cela peut être fait sur le serveur en utilisant cat /etc/passwd | grep username

mais je veux qu'Ansible s'arrête si l'utilisateur n'est pas là.

J'ai essayé d'utiliser le lineinfile mais je n'arrive pas à le faire revenir.

code

 - name: find
   lineinfile: dest=/etc/passwd
               regexp=[user]
               state=present
               line="user"

Le code ci-dessus ajoute l'utilisateur au fichier s'il n'est pas là. Tout ce que je veux faire, c'est vérifier. Je ne veux en aucun cas modifier le fichier, est-ce possible

Merci.

11
Frostie_the_snowman

Je serais probablement enregistrer et évaluer une variable .

Le playbook simple suivant fonctionne pour moi:

- hosts: localhost
  tasks:

  - name: read the passwd file
    Shell: cat /etc/passwd
    register: user_accts

  - name: a task that only happens if the user exists
    when: user_accts.stdout.find('hillsy') != -1
    debug: msg="user hillsy exists"
13
hillsy

C'est délicat. le module lineinfile est spécifiquement destiné à modifier le contenu d'un fichier, mais vous pouvez également l'utiliser pour une vérification de validation.

- name: find
  lineinfile: 
    dest: /etc/passwd
    line: "user"
  check_mode: yes
  register: presence
  failed_when: presence.changed

check_mode garantit qu'il ne met jamais à jour le fichier. register enregistre la variable comme indiqué. failed_when vous permet de définir la condition d'échec, c'est-à-dire en ajoutant l'utilisateur car il n'a pas été trouvé dans le fichier.

Il existe plusieurs itérations de cela que vous pouvez utiliser en fonction de ce que vous voulez que le comportement soit. lineinfile les documents particuliers liés à state et regexp devraient vous permettre de déterminer si la présence ou l'absence est un échec, etc., ou vous pouvez faire le not presence.changed etc.


23
Jon Staples

Si vous voulez échouer s'il n'y a pas d'utilisateur:

tasks:
  - Shell: grep username /etc/passwd
    changed_when: false

Par défaut, le module Shell échouera si le code de sortie de la commande est différent de zéro.
Il vous donnera donc ok si le nom d'utilisateur est là et échoue dans le cas contraire.
J'utilise changed_when: false pour éviter l'état changed lors de la réception.

6
Konstantin Suvorov