簡體   English   中英

使用insertafter復制Ansible Lineinfile

[英]Ansible lineinfile duplication using insertafter

我正在嘗試使用ansibles lineinfile將條目添加到我的/etc/hosts文件中。 我希望邏輯是,如果找到條目127.0.0.1 mysite.local則不執行任何操作,否則將其插入到127.0.1.1127.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

domainmysite.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”

非捕獲組處理三種不同的情況:

  1. 情況1 :127.0.1.1和127.0.0.1不存在,因此請在末尾插入
  2. 情況2 :127.0.0.1與其他主機存在,因此替換條目
  3. 情況3 :存在127.0.1.1,因此請在其后插入

第二種情況是通過避免匹配“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM