2017-04-18 15 views
0

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.

+0

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

+0

Et pour cet exemple particulier, pourquoi n'utilisez-vous pas le module 'lineinfile'? – techraf

+0

@techraf: J'avais essayé d'utiliser le module lineinfile avec les mêmes résultats. J'ai donc essayé le module de remplacement. – Steven

Répondre

2

En plus de l'erreur en essayant de faire correspondre security avec system, vous n'avez pas besoin pour échapper aux guillemets doubles dans l'un des arguments ou le signe dollar dans l'argument replace (sinon la barre oblique inverse sera inséré dans le fichier):

- name: disable auto updates 
    replace: 
    dest: /etc/apt/apt.conf.d/50unattended-upgrades 
    regexp: '(?:[ \t]*"\${distro_id}:\${distro_codename}-system";)' 
    replace: '// "${distro_id}:${distro_codename}-system";' 

Et vous pouvez obtenir le même résultat en utilisant le module lineinfile (ce qui rend le code un peu plus lisible, IMHO):

- name: disable auto updates 
    lineinfile: 
    dest: /etc/apt/apt.conf.d/50unattended-upgrades 
    regexp: '"\${distro_id}:\${distro_codename}-system"' 
    line: '// "${distro_id}:${distro_codename}-system";' 
+0

Merci de m'avoir aidé à comprendre les problèmes multiples. – Steven