[英]Ansible lineinfile duplication using insertafter
我正在嘗試使用ansibles lineinfile
將條目添加到我的/etc/hosts
文件中。 我希望邏輯是,如果找到條目127.0.0.1 mysite.local
則不執行任何操作,否則將其插入到127.0.1.1
行127.0.1.1
127.0.0.1 localhost
127.0.1.1 mypc
127.0.0.1 mysite.local
我可以在部分工作后進行插入,但是似乎實際的正則表達式搜索無法找到現有條目,因此我不斷重復插入127.0.0.1 mysite.local
文檔確實會說;
修改線時,正則表達式通常應匹配線的初始狀態以及被線替換后的狀態,以確保冪等。
但是我不確定這對我的正則表達式如何適用。 目前我的戲是;
- name: Add the site to hosts
lineinfile:
path: /etc/hosts
# Escape special chars
regex: "^{{ domain|regex_escape() }}"
line: "127.0.0.1 {{ domain }}"
insertafter: '127\.0\.1\.1'
firstmatch: yes
become: yes
domain
是mysite.local
。
我已經看了這個答案,但是我很確定自從文檔狀態以來,我不能使用backrefs
。
這個標志稍微改變了模塊的操作。 insertbefore和insertafter將被忽略,並且如果regexp與文件中的任何地方都不匹配,則文件將保持不變。
我試過了;
regex: '127\.0\.0\.1\s+?{{ domain|regex_escape() }}'
也沒有運氣
根據此鏈接 ,lineinfile掃描文件並一次應用正則表達式一行,這意味着您不能使用瀏覽整個文件的正則表達式。 我不熟悉lineinfile工具,但是如果可以使用上面鏈接中使用的“替換”工具,則可以根據需要使用以下Python正則表達式進行匹配:
\A((?:(?!127\.0\.0\.1\s)[\s\S])*?)(?:\Z|127\.0\.0\.1\s+(?!{{ domain|regex_escape() }})\S+\n|(127\.0\.1\.1\s+\S+(?![\s\S]*\n127\.0\.0\.1\s)\n))
替換為:“ \\ 1 \\ 2127.0.0.1 {{域}} \\ n”
非捕獲組處理三種不同的情況:
第二種情況是通過避免匹配“ 127.0.0.1”條目(如果已經存在)來解決冪等性。
似乎是firstmatch: yes
正在打破事情。 它適用於以下任務(我將空格替換為Tab以獲得漂亮的外觀,但空格也可以正常工作):
- name: Add the site to hosts
lineinfile:
path: /etc/hosts
# Escape special chars
regexp: "{{ domain|regex_escape() }}"
line: "127.0.0.1{{ '\t' }}{{ domain }}"
insertafter: '127\.0\.1\.1'
醫生說:
insertafter:...如果將正則表達式同時傳遞給regexp和insertafter,則僅在找不到與regexp匹配的情況下才使用insertafter。
任務中的正則表達式擴展為
regex: ^mysite\.local
找不到此正則表達式,因為沒有以“ mysite.local”開頭的行。 因此,執行insertafter並在127.0.1.1之后插入“行”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.