Ansible" lineinfile":添加新行(使用PATH =)或追加到现有行(使用PATH =)

时间:2016-10-03 15:12:44

标签: regex ansible ansible-playbook

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

以下是我所拥有的:

//all.yml
my_path: "/usr/bin:/usr/sbin"
my_extra_path: "/usr/extra/path"

在我的角色文件中:

//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'

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

如果没有" PATH ="目前,我希望它能添加一个新的。但它没有。

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

2 个答案:

答案 0 :(得分:2)

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

  

与state = present一起使用。如果设置,则行可以包含反向引用(两者都包含)   如果正则表达式匹配,将填充的位置和命名。   该标志稍微改变了模块的操作;的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

答案 1 :(得分:0)

与此处相同:https://stackoverflow.com/a/40890850/7231194或此处:https://stackoverflow.com/a/40891927/7231194

步骤是:

  • 尝试更换该行。
  • 如果替换mod改变它。很酷,结束了!
  • 如果替换mod未更改,请添加行

实施例

# Vars
- name: Set parameters
  set_fact:
    my_path: "/usr/bin:/usr/sbin"
    my_extra_path: "/usr/extra/path"

# Tasks
- name: Try to replace the line if it exists
  replace:
    dest    : /dir/file
    replace : 'PATH={{ my_extra_path }}'
    regexp  : '^PATH=.*'
    backup  : yes
  register  : tryToReplace

# If the line not is here, I add it
- name: Add line
  lineinfile:
    state   : present
    dest    : /dir/file
    line    : '{{ my_extra_path }}'
    regexp  : ''
    insertafter: EOF
  when: tryToReplace.changed == false