J'ai de la difficulté à trouver un motif regex dans Ansible 2. Quelqu'un pourrait-il m'aider à comprendre ce que je fais de mal? Je vous remercie.Comment utiliser regex avec Ansible?
--- # Disable auto update for Ubuntu
- hosts: nonedgeLinux
become: yes
tasks:
- name: disable auto updates
replace:
dest: /etc/apt/apt.conf.d/50unattended-upgrades
regexp: '(?:[ \t]*\"\${distro_id}:\${distro_codename}-security\";)'
replace: '// "\${distro_id}:\${distro_codename}-security\";'
J'ai utilisé https://regex101.com/ pour valider l'expression rationnelle contre une copie/coller du contenu du fichier recherché. Ce test signale que le motif regexp est correct. Chaque fois qu'il est exécuté sur une boîte Ubuntu 16.04.2 je reçois les résultats suivants:
[email protected]:/data/scripts/ansible# ansible-playbook disableAutoUpdate.yml -vvvv
Using /data/scripts/ansible/ansible.cfg as config file
Loaded callback default of type stdout, v2.0
1 plays in disableAutoUpdate.yml
PLAY ****************************************************************************
TASK [setup] *******************************************************************
ESTABLISH LOCAL CONNECTION FOR USER: root
localhost EXEC (umask 22 && mkdir -p "$(echo $HOME/.ansible/tmp/ansible-tmp-1492480514.73-9504514182168)" && echo "$(echo $HOME/.ansible/tmp/ansible-tmp-1492480514.73-9504514182168)")
localhost PUT /tmp/tmpkYPc6g TO /root/.ansible/tmp/ansible-tmp-1492480514.73-9504514182168/setup
localhost EXEC LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 /usr/bin/python /root/.ansible/tmp/ansible-tmp-1492480514.73-9504514182168/setup; rm -rf "/root/.ansible/tmp/ansible-tmp-1492480514.73-9504514182168/" > /dev/null 2>&1
ok: [localhost]
TASK [disable auto updates] ****************************************************
task path: /data/scripts/ansible/disableAutoUpdate.yml:15
ESTABLISH LOCAL CONNECTION FOR USER: root
localhost EXEC (umask 22 && mkdir -p "$(echo $HOME/.ansible/tmp/ansible-tmp-1492480515.71-278594852314124)" && echo "$(echo $HOME/.ansible/tmp/ansible-tmp-1492480515.71-278594852314124)")
localhost PUT /tmp/tmpG3gchf TO /root/.ansible/tmp/ansible-tmp-1492480515.71-278594852314124/replace
localhost EXEC LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 /usr/bin/python /root/.ansible/tmp/ansible-tmp-1492480515.71-278594852314124/replace; rm -rf "/root/.ansible/tmp/ansible-tmp-1492480515.71-278594852314124/" > /dev/null 2>&1
ok: [localhost] => {"changed": false, "invocation": {"module_args": {"backup": false, "content": null, "delimiter": null, "dest": "/etc/apt/apt.conf.d/50unattended-upgrades", "directory_mode": null, "follow": false, "force": null, "group": null, "mode": null, "owner": null, "regexp": "(?:(?!\\/\\/).*[ \\t]*\\\"\\${distro_id}:\\${distro_codename}-security\\\";)/g", "remote_src": null, "replace": "replaced", "selevel": null, "serole": null, "setype": null, "seuser": null, "src": null, "validate": null}, "module_name": "replace"}, "msg": ""}
PLAY RECAP *********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0
Voici un snip du fichier recherché:
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}";
"${distro_id}:${distro_codename}-system";
// "${distro_id}:${distro_codename}-updates";
// "${distro_id}:${distro_codename}-proposed";
// "${distro_id}:${distro_codename}-backports";
};
# ansible --version
ansible 2.0.0.2
config file = /data/scripts/ansible/ansible.cfg
configured module search path = Default w/o overrides
Une dernière note: Je n'ai succès dans la recherche et remplacer dans ce fichier lorsque vous recherchez seulement des chaînes. Lorsque vous cherchez la ligne entière, c'est quand cela échoue. De plus, j'ai essayé d'échapper aux caractères spéciaux, par exemple. [/][/]
au lieu de \/\/\
, etc. sans chance.
Et que voulez-vous atteindre avec cela? Les résultats semblent parfaitement bien. La chaîne n'est pas dans le fichier d'entrée, elle n'est donc pas remplacée. La tâche se termine par le statut "ok". – techraf
Et pour cet exemple particulier, pourquoi n'utilisez-vous pas le module 'lineinfile'? – techraf
@techraf: J'avais essayé d'utiliser le module lineinfile avec les mêmes résultats. J'ai donc essayé le module de remplacement. – Steven