Comment puis-je utiliser les regex avec Ansible?
Je vais avoir du mal à obtenir une regex modèle pour correspondre à Ansible 2. Quelqu'un pourrait-il m'aider à comprendre ce que je fais de mal? Merci.
--- # 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 la regex contre un copier/coller du contenu du fichier en cours de recherche. Ce test des rapports de l'expression régulière pattern est correct. Chaque fois qu'il est exécuté sur un Ubuntu 16.04.2 boîte j'obtiens les résultats suivants:
root@sbx54:/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 une capture du fichier en cours de recherche:
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 remarque: je n'ai avoir du succès dans la recherche et le remplacer au sein de ce fichier lorsque vous recherchez uniquement des chaînes de caractères. Lors de la recherche pour l'ensemble de la ligne est lorsque cela ne fonctionne pas. En outre, j'ai essayé d'échapper les caractères spéciaux ainsi, par exemple, [/][/]
en place de \/\/\
, etc. avec pas de chance.
- Et que voulez-vous atteindre avec ce? Les résultats semblent parfaitement bien. La chaîne n'est pas dans le fichier d'entrée, de sorte qu'il n'est pas remplacé. La tâche se termine avec
ok
état. - Et pour cet exemple particulier, pourquoi n'êtes-vous pas à l'aide de
lineinfile
module? - J'avais essayé d'utiliser le lineinfile module avec les mêmes résultats. donc essayé de la remplacer le module.
- pouvez-vous m'éclairer quant à ce qui est mal avec la regexp qu'il ne trouve pas la chaîne? Veuillez vous reporter à la troisième ligne dans le snip: "${distro_id}:${distro_codename}-système";
- Vous n'avez pas
security
chaîne dans votre fichier d'entrée. Et le moteur d'expressions régulières ne correspond passecurity
avecsystem
. Vous sentez-vous éclairé maintenant? - Merci pour l'aperçu. Je vais devoir aller apprendre cette regex match
security
vssystem
.
Vous devez vous connecter pour publier un commentaire.
Sur le dessus de l'erreur en essayant de le match
security
avecsystem
, vous n'avez pas besoin d'échapper les guillemets dans l'un des arguments ou le signe de dollar dans lereplace
argument (sinon, la barre oblique inverse sera inséré dans le fichier):Et vous pouvez obtenir le même résultat à l'aide de
lineinfile
module (ce qui rend le code un peu plus lisible, à mon humble avis):