1
votes

ansible-playbook ne peut pas utiliser regex

J'utilise la version 2.7 ansible. Je pratiquais une tâche où je devais ajouter des utilisateurs dont le nom d'utilisateur et l'uid stockés dans le fichier var nommé /home/automation/plays/vars/user_list.yml et le mot de passe pour le même est stocké dans secrets.yml ayant un contenu correct. Je suis également capable d'ajouter un utilisateur avec with_item mais avec la prochaine exigence de la tâche, je dois ajouter des utilisateurs dont les statistiques uid avec 1 * sur le groupe d'hôtes spécifié qui est appelé avec "group_names" J'essayais de faire correspondre regex pour le même mais obtenant une erreur p> Mon exigence est d'ajouter un utilisateur dont l'udi commence par ^ 1 au groupe d'hôtes "webserver"

J'ai utilisé avec des uids explicites tels que 1201/1201 qui fonctionne mais ne fonctionne pas avec regex

fatal: [ansnode_1]: FAILED! => {"msg": "The conditional check 'item.uid  is regex(\"1.*\")' failed. The error was: Unexpected templating type error occurred on ({% if item.uid  is regex(\"1.*\") %} True {% else %} False {% endif %}): expected string or buffer\n\nThe error appears to have been in '/home/automation/plays/users.yml': line 12, column 8, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n       with_items: \"{{ users }}\"\n     - name: Adding Users to webserver groupwith List\n       ^ here\n"}
fatal: [ansnode_4]: FAILED! => {"msg": "The conditional check 'item.uid  is regex(\"1.*\")' failed. The error was: Unexpected templating type error occurred on ({% if item.uid  is regex(\"1.*\") %} True {% else %} False {% endif %}): expected string or buffer\n\nThe error appears to have been in '/home/automation/plays/users.yml': line 12, column 8, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n       with_items: \"{{ users }}\"\n     - name: Adding Users to webserver groupwith List\n       ^ here\n"}
fatal: [ansnode_2]: FAILED! => {"msg": "The conditional check 'item.uid  is regex(\"1.*\")' failed. The error was: Unexpected templating type error occurred on ({% if item.uid  is regex(\"1.*\") %} True {% else %} False {% endif %}): expected string or buffer\n\nThe error appears to have been in '/home/automation/plays/users.yml': line 12, column 8, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n       with_items: \"{{ users }}\"\n     - name: Adding Users to webserver groupwith List\n       ^ here\n"}
fatal: [ansnode_3]: FAILED! => {"msg": "The conditional check 'item.uid  is regex(\"1.*\")' failed. The error was: Unexpected templating type error occurred on ({% if item.uid  is regex(\"1.*\") %} True {% else %} False {% endif %}): expected string or buffer\n\nThe error appears to have been in '/home/automation/plays/users.yml': line 12, column 8, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n       with_items: \"{{ users }}\"\n     - name: Adding Users to webserver groupwith List\n       ^ here\n"}
- hosts: all
  become: yes
  gather_facts: no
  vars_files:
     - /home/automation/plays/vars/user_list.yml    
     - secrets.yml
  tasks:
     - debug:
         msg: "{{users | type_debug}},{{user_password}}"
       with_items: "{{ users }}"  
     - name: Adding Users to webserver groupwith List
       user:
        name: "{{item.username}}"
        uid:   "{{item.uid}}"
        state: absent
        remove: yes  
        password: "{{ user_password }}" 
        shell: /bin/bash
        groups: wheel
        generate_ssh_key: yes
        ssh_key_bits: 2048
        ssh_key_file: .ssh/id_rsa
       when:  item.uid  is regex("1.*")
       with_items: "{{users}}"  


0 commentaires

3 Réponses :


1
votes

Supposons que les utilisateurs ont déjà été créés et " la condition est d'ajouter des utilisateurs dont l'uid commence par '1' au groupe 'webserver' ".

La tâche ci-dessous fait l'affaire.

  when: item.uid|string is match('^.*5$')

Regex↑

1) La condition ci-dessous est un équivalent

  when: item.uid|string is match('^1.*$')

2) Pour correspondre à l'utilisateur " où l'ID utilisateur se termine par 5 "utiliser

- name: Adding users to webserver group
  user:
    name: "{{ item.username }}"
    groups: webserver
  loop: "{{ users }}"
  when:  item.uid|string|first == '1'


3 commentaires

Merci Vladimir Mais ma question initiale concerne l'utilisation de regex comment cela est utilisé dans ce dire que j'ai une autre tâche où l'ID utilisateur se termine par 5 et que dire de ça!


Merci Vladimir ci-dessous la ligne avait aidé mon


quand: ('webserver' dans group_names et item.uid | string est search ("^ 1. *"))



0
votes

Dans la documentation officielle d'Ansible 2.7 , il n'y a aucune référence au filtre regex . Il apparaît uniquement dans la documentation pour Ansible 2.8 , donc je suppose que c'est un nouvel ajout de cette version.

Selon cette même documentation, regex ("1. *") ne correspondra pas aux UID commençant par "1", mais tous les UID contenant "1". Vous voudrez plutôt utiliser match ("1. *") , qui devrait fonctionner avec votre version d'Ansible.


2 commentaires

Merci @ kevin La ligne ci-dessous a fonctionné pendant je suppose que nous devons convertir la variable en chaîne avant d'évaluer


quand: ('webserver' dans group_names et item.uid | string est search ("^ 1. *"))



0
votes

Avec cette tâche.

tasks:
- name: Create users
  user:
    name: "{{ item.username }}"
    group: wheel
    password: "{{ user_password | password_hash('sha512') }}"
    shell: /bin/bash
    update_password: on_create
  with_items: "{{ users }}"
  when:
    - ansible_fqdn in groups['webservers']
    - "item.uid|string|first == '1'"


0 commentaires