Ansible "lineinfile":添加新行(使用 PATH=)或附加到现有行(使用 PATH=)
Ansible "lineinfile": add new line (with PATH=) or append to existing line (with PATH=)
我正在尝试将路径部分替换或附加到 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 }}:'
现在,当我 运行 这个角色时,它可以很好地更新现有的 PATH 行,但不会在该行内创建重复项,甚至不会创建重复行。到目前为止一切顺利。
当没有包含 "PATH=" 的行时,我希望它添加一个新行。但事实并非如此。
是我的预期有误还是问题出在哪里?
您正在使用 backrefs: true
标志,如果该行尚不存在,它会阻止 lineinfile 更改文件。来自文档:
Used with state=present. If set, line can contain backreferences (both
positional and named) that will get populated if the regexp matches.
This flag changes the operation of the module slightly; insertbefore
and insertafter will be ignored, and if the regexp doesn't match
anywhere in the file, the file will be left unchanged. If the regexp
does match, the last matching line will be replaced by the expanded
line parameter.
由于如果行不存在则需要创建行,因此应使用:
- 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 }}:'
when: checkpath.rc == 0
与这里的想法相同: or here :
步骤是:
- 尝试更换线路。
- 如果替换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
我正在尝试将路径部分替换或附加到 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 }}:'
现在,当我 运行 这个角色时,它可以很好地更新现有的 PATH 行,但不会在该行内创建重复项,甚至不会创建重复行。到目前为止一切顺利。
当没有包含 "PATH=" 的行时,我希望它添加一个新行。但事实并非如此。
是我的预期有误还是问题出在哪里?
您正在使用 backrefs: true
标志,如果该行尚不存在,它会阻止 lineinfile 更改文件。来自文档:
Used with state=present. If set, line can contain backreferences (both positional and named) that will get populated if the regexp matches. This flag changes the operation of the module slightly; insertbefore and insertafter will be ignored, and if the regexp doesn't match anywhere in the file, the file will be left unchanged. If the regexp does match, the last matching line will be replaced by the expanded line parameter.
由于如果行不存在则需要创建行,因此应使用:
- 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 }}:'
when: checkpath.rc == 0
与这里的想法相同:
步骤是:
- 尝试更换线路。
- 如果替换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