2017-04-18 5 views
0

Ich habe Probleme, ein Regex-Muster in Ansible 2 zu finden. Könnte jemand mir helfen zu verstehen, was ich falsch mache? Vielen Dank.Wie verwende ich Regex mit 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\";' 

I https://regex101.com/ verwendet, um die regex gegen eine Kopieren/Einfügen des Dateiinhalts gesucht wird zu validieren. Dieser Test meldet, dass das Regexp-Muster korrekt ist. Jedes Mal, es auf einem Ubuntu 16.04.2 Box läuft ich die folgenden Ergebnisse erhalten:

[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 

Hier ist ein Schnipsel der Datei gesucht wird:

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 

Eine letzte Anmerkung: Ich habe Erfolg Suchen und Ersetzen innerhalb dieser Datei, wenn nur nach Strings gesucht wird. Wenn Sie nach der ganzen Linie suchen, ist dies nicht möglich. Zusätzlich habe ich versucht, den Sonderzeichen zu entkommen, z. [/][/] anstelle von \/\/\ usw. ohne Glück.

+0

Und was wollen Sie damit erreichen? Die Ergebnisse scheinen vollkommen in Ordnung zu sein. Die Zeichenfolge befindet sich nicht in der Eingabedatei, daher wird sie nicht ersetzt. Die Aufgabe endet mit dem Status 'OK'. – techraf

+0

Und für dieses spezielle Beispiel warum verwenden Sie nicht 'lineinfile' Modul? – techraf

+0

@techraf: Ich hatte versucht, das lineinfile-Modul mit den gleichen Ergebnissen zu verwenden. So versuchte das Ersatzmodul. – Steven

Antwort

2

Auf dem Fehler bei dem Versuch, security mit system zu entsprechen, müssen Sie nicht die doppelten Anführungszeichen in eines des Argumente zu entkommen oder die Dollar-Zeichen in dem replace Argumente (sonst wird der Backslash in die Datei eingefügt werden):

- 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";' 

Und Sie können das gleiche Ergebnis mit lineinfile Modul erreichen (die Code ein bisschen besser lesbar, imho) macht:

- 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

Danke, dass Sie mir geholfen haben, die verschiedenen Probleme zu verstehen. – Steven

Verwandte Themen