2017-04-18 8 views
0

Ansible 2で一致する正規表現のパターンを取得できません。誰かが私が間違っていることを理解するのを助けることができますか?ありがとうございました。正規表現を使用するにはどうすればよいですか?

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

私が検索されるファイルの内容のコピー/ペーストに対して正規表現を検証するためにhttps://regex101.com/を使用。このテストは正規表現パターンが正しいことを報告します。それはUbuntuの16.04.2ボックス上で実行されるたびに、私は次のような結果を得る:ここで

[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 

が検索されているファイルのスニップです:

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 

最後の一つのノート:私は成功を持っていませんでした文字列のみを検索する場合はこのファイル内を検索して置換します。これが失敗すると、行全体を検索するときです。また、私は特殊文字をエスケープしようとしました。幸運のない\/\/\などの代わりに[/][/]などがあります。 systemsecurityと一致するように試みることに間違いの上に

+0

そして、あなたがこれを達成するために何をしたいですか?結果は完璧に見えます。文字列が入力ファイルにないため、置換されません。タスクは 'ok'ステータスで終了します。 – techraf

+0

そしてこの特定の例ではなぜ 'lineinfile'モジュールを使用していませんか? – techraf

+0

@techraf:同じ結果を持つlineinfileモジュールを使ってみました。交換モジュールを試しました。 – Steven

答えて

2

、あなたは、引数またはreplace引数にドル記号(のいずれかで二重引用符をエスケープする必要はありません。そうでない場合は、バックスラッシュは、ファイルに挿入されます):

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

そして、あなたは、コードは少し読みやすくなりlineinfileモジュール(私見)を使用して同じ結果を得ることができます。

- 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

複数の問題を理解していただきありがとうございます。 – Steven

関連する問題