我正在尝试将路径部分替换或附加到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 ="目前,我希望它能添加一个新的。但它没有。
我的期望是错的还是问题出在哪里?
答案 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
步骤是:
实施例
# 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