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}}"
3 Réponses :
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'
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. *"))
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.
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. *"))
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'"