【问题标题】:Add word to end of line in Ansible在 Ansible 中将单词添加到行尾
【发布时间】:2019-11-22 12:11:02
【问题描述】:

我一直在尝试很多 lineinfile 和替换示例,但我无法让它工作。

我有以下几行:

deb-src http://httpredir.debian.org/debian buster main
deb http://security.debian.org/debian-security buster/updates main
deb-src http://security.debian.org/debian-security buster/updates main 

我希望它们看起来像这样:

deb-src http://httpredir.debian.org/debian buster main contrib
deb http://security.debian.org/debian-security buster/updates main contrib
deb-src http://security.debian.org/debian-security buster/updates main contrib

我尝试使用 Ansible 这样做;

- name: Add contrib repository
  lineinfile:
    dest: /etc/apt/sources.list
    backup: yes
    state: present
    regexp: '^(deb (.*)$)'
    backrefs: yes
    line: '\1 contrib'
  check_mode: no

哪种方法可行,但在第二次运行后显示为,例如

deb http://security.debian.org/debian-security buster/updates main contrib contrib

所以它会在每次运行时不断添加单词。

显然这些行并不是在每个系统上都保持原样,但它们确实以 deb 或 deb-src 开头

谢谢!

【问题讨论】:

  • lineinfile: This is primarily useful when you want to change a single line in a file only. 尝试使用replace 模块

标签: linux ansible debian


【解决方案1】:
- name: Add contrib repository
  replace:
    dest: /etc/apt/sources.list
    regexp: '^(deb.+)(?<! contrib)$'
    replace: '\1 contrib'

【讨论】:

  • 不检查单词 contrib 是否在该行的其他位置
【解决方案2】:

lineinfile 仅替换 1 行。 replace 更改所有匹配的行。

- name: Add contrib repository
  replace:
    dest: /etc/apt/sources.list
    regexp: '^(deb(?!.* contrib).*)'
    replace: '\1 contrib'

请注意,像 (?!bar) 这样的否定前瞻正则表达式意味着:“断言 'bar' 不会立即作为下一个单词” 并且 不是:“断言 'bar' 不在行的其余部分”。还要注意.* 的贪婪。

这个 Ansible 代码 sn-p 可用于将任何选项/字符串添加到所有还没有该选项/字符串的行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多