Ansible“lineinfile”:添加新行(使用 PATH=)或附加到现有行(使用 PATH=)

Dom*_*nik 3 regex ansible

我正在尝试将路径部分替换或附加到 Linux 机器上 /etc/environment 中的路径定义。

这是我所拥有的:

//all.yml
my_path: "/usr/bin:/usr/sbin"
my_extra_path: "/usr/extra/path"
Run Code Online (Sandbox Code Playgroud)

在我的角色文件中:

//updatePath.yml
- name: update /etc/environment
  lineinfile:
    dest=/etc/environment
    state=present
    backrefs=yes
    regexp='PATH=({{ my_path }}:?)?({{ my_extra_path }}:?)?(.*)'
    line='PATH={{ my_extra_path }}:{{ my_extra_path }}:\3'
Run Code Online (Sandbox Code Playgroud)

现在,当我运行该角色时,它可以很好地更新现有的 PATH 行,但不会在该行内创建重复项,甚至不会创建重复的行。到目前为止,一切都很好。

当没有包含“PATH=”的行时,我希望它添加一个新行。但事实并非如此。

是我的预期错误还是问题出在哪里?

Mil*_*eek 5

您正在使用该backrefs: true标志,如果该行尚不存在,该标志将阻止 lineinfile 更改文件。来自文档:

与状态=存在一起使用。如果设置,行可以包含反向引用(位置引用和命名引用),如果正则表达式匹配,这些引用将被填充。该标志稍微改变了模块的操作;insertbefore 和 insertafter 将被忽略,如果正则表达式与文件中的任何位置都不匹配,则文件将保持不变。如果正则表达式匹配,则最后一个匹配行将被扩展的行参数替换。

由于如果该行不存在则需要创建该行,因此应该使用:

- name: Check whether /etc/environment contains PATH
  command: grep -Fxq "PATH=" /etc/environment
  register: checkpath
  ignore_errors: True
  changed_when: False

//updatePath.yml
- name: Add path to /etc/environment
  lineinfile:
    dest=/etc/environment
    state=present
    regexp='^PATH='
    line='PATH={{ my_extra_path }}'
  when: not checkpath.rc == 0

- name: update /etc/environment
  lineinfile:
    dest=/etc/environment
    state=present
    backrefs=yes
    regexp='PATH=({{ my_path }}:?)?({{ my_extra_path }}:?)?(.*)'
    line='PATH={{ my_extra_path }}:{{ my_extra_path }}:\3'
  when: checkpath.rc == 0
Run Code Online (Sandbox Code Playgroud)