繁体   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