我想使用Ansible取消注释文件sshd_config
中的一行,我有以下工作配置:
- name: Uncomment line from /etc/ssh/sshd_config
lineinfile:
dest: /etc/ssh/sshd_config
regexp: '^#AuthorizedKeysFile'
line: 'AuthorizedKeysFile .ssh/authorized_keys'
但是,只有当行以#AuthorizedKeysFile
开头时,此配置才有效,但如果该行以# AuthorizedKeysFile
或# AuthorizedKeysFile
开头(#
之间的空格,则此配置无效单词)。
如何配置正则表达式,以便在'#'后不考虑任意数量的空格?
我尝试在'#'之后添加另一个带有空格的lineinfile选项,但这不是一个好的解决方案:
- name: Uncomment line from /etc/ssh/sshd_config
lineinfile:
dest: /etc/ssh/sshd_config
regexp: '# AuthorizedKeysFile'
line: 'AuthorizedKeysFile .ssh/authorized_keys'
答案 0 :(得分:6)
首先,您使用的是错误的语言。使用Ansible,您不会告诉它该做什么,而是定义所需的状态。所以它不应该是Uncomment line form /etc/ssh/sshd_config
,而是Ensure AuthorizedKeysFile is set to .ssh/authorized_keys
。
其次,初始状态是什么并不重要(如果该行被评论,或不是)。您必须指定一个唯一的标识该行的唯一字符串。
使用sshd_config
这是可能的,因为AuthorizedKeysFile
指令在文件中只出现一次。使用其他配置文件可能会更困难。
- name: Ensure AuthorizedKeysFile is set to .ssh/authorized_keys
lineinfile:
dest: /etc/ssh/sshd_config
regexp: AuthorizedKeysFile
line: 'AuthorizedKeysFile .ssh/authorized_keys'
它将匹配包含AuthorizedKeysFile
字符串的任何行(无论是否注释,或者有多少空格)并确保整行:
AuthorizedKeysFile .ssh/authorized_keys
如果线路不同,Ansible将报告"更改"状态。
在第二次运行中,Ansible将再次找到AuthorizedKeysFile
并发现该线路已经处于所需状态,因此它将以" ok"结束任务。状态。
上述任务的一个警告是,如果任何行包含注释,例如真实的,有意的注释(例如,包含字符串AuthorizedKeysFile
的英语解释),Ansible将用line
中指定的值。
答案 1 :(得分:5)
如果在'#'字符后面需要零个或多个空格,则以下内容就足够了:
- name: Uncomment line from /etc/ssh/sshd_config
lineinfile:
dest: /etc/ssh/sshd_config
regexp: '^#\s*AuthorizedKeysFile.*$'
line: 'AuthorizedKeysFile .ssh/authorized_keys'
对原始代码的修改是在正则表达式中添加了\s*
和.*$
。
说明:
\s
- 匹配空格(空格,制表符,换行符和换页符)
*
- 指定左边的表达式(\s
)在匹配中可以有零个或多个实例
.*
- 匹配任何字符的零个或多个
$
- 匹配行尾
答案 2 :(得分:1)
我应该在@ techraf中指出这一点,99%的时间配置文件的完整模板几乎总是更好。
我完成的时间lineinfile
包括由其他一些流程管理的奇怪而精彩的配置文件,或者配置的懒惰我还没有完全理解,可能因发行版/版本而异,我不会# 39;我想保留所有变种......但是。
前往学习更多Ansible ...这很棒,因为你可以从原始的bash shell命令继续迭代到最佳实践。
还是很高兴看到如何最好地配置管理一个或两个设置稍微好一点:
tasks:
- name: Apply sshd_config settings
lineinfile:
path: /etc/ssh/sshd_config
# might be commented out, whitespace between key and value
regexp: '^#?\s*{{ item.key }}\s'
line: "{{ item.key }} {{ item.value }}"
validate: '/usr/sbin/sshd -T -f %s'
with_items:
- key: MaxSessions
value: 30
- key: AuthorizedKeysFile
value: .ssh/authorized_keys
notify: restart sshd
handlers:
- name: restart sshd
service:
name: sshd
state: restarted
validate
不会进行更改notify
/ handlers
只在最后重启一次的正确方法with_items
(很快将成为loop
)如果您有多个设置^#?
设置可能被注释掉 - 请参阅其他答案\s*{{ item.key }}\s
与其他设置不匹配(即SettingA
无法匹配NotSettingA
或SettingAThisIsNot
)仍然可能会破坏我们必须接受的# AuthorizedKeysFile - is a setting
这样的评论,因为可能会有像AuthorizedKeysFile /some/path # is a setting
这样的设置...重新阅读警告。
- name: Configure sshd
template:
src: sshd_config.j2
dest: /etc/ssh/sshd_config
owner: root
group: root
mode: "0644"
validate: '/usr/sbin/sshd -T -f %s'
notify: restart sshd
handlers:
- name: restart sshd
service:
name: sshd
state: restarted
如果你不是在为支持所有发行版而懒惰,请参阅此提示
- name: configure ssh
template: src={{ item }} dest={{ SSH_CONFIG }} backup=yes
with_first_found:
- "{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.sshd_config.j2"
- "{{ ansible_distribution }}.sshd_config.j2"
https://ansible-tips-and-tricks.readthedocs.io/en/latest/modifying-files/modifying-files/
(需要使用loop
查找更新为first_found
答案 3 :(得分:0)
使用replace
模块是否可以实现相同的目标。
https://docs.ansible.com/ansible/latest/modules/replace_module.html
- name: Uncomment line from /etc/ssh/sshd_config
replace:
path: /etc/ssh/sshd_config
regexp: '^\s*#+AuthorizedKeysFile.*$'
replace: 'AuthorizedKeysFile .ssh/authorized_keys'