Linux 文件中的Ansible取消注释行
我想使用Ansible取消对文件Linux 文件中的Ansible取消注释行,linux,ansible,Linux,Ansible,我想使用Ansible取消对文件sshd\u config中的一行的注释,我有以下工作配置: - name: Uncomment line from /etc/ssh/sshd_config lineinfile: dest: /etc/ssh/sshd_config regexp: '^#AuthorizedKeysFile' line: 'AuthorizedKeysFile .ssh/authorized_keys' 但是,此配置仅在行以
sshd\u 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
开头(在#
和单词之间的空格)时无效
如何配置regexp,使其不考虑“#”之后的任何空格数
我已尝试添加另一个在“#”之后带有空格的lineinfile选项,但这不是一个好的解决方案:
- name: Uncomment line from /etc/ssh/sshd_config
lineinfile:
dest: /etc/ssh/sshd_config
regexp: '# AuthorizedKeysFile'
line: 'AuthorizedKeysFile .ssh/authorized_keys'
首先,你使用了错误的语言。使用Ansible,您不会告诉它要做什么,而是定义所需的状态。因此,它不应该是
取消注释行表单/etc/ssh/sshd_config
,而是确保AuthorizedKeysFile设置为.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_key
如果行不同,Ansible将报告“更改”状态
在第二次运行时,Ansible将再次找到AuthorizedKeysFile
,并发现该行已处于所需状态,因此它将以“ok”状态结束任务
上述任务的一个警告是,如果任何一行包含注释,例如真实的、有意的注释(例如,包含字符串
AuthorizedKeysFile
的英语解释),Ansible将用line
中指定的值替换该行。如果在“#”字符后需要零个或多个空格,则以下内容应足够:
- 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
)在匹配中可以有零个或多个实例
*
-匹配任何字符的零个或多个
$
-匹配行尾我应该警告@techraf,配置文件的完整模板在99%的时间内几乎总是更好
我所做的lineinfle
包括由其他进程管理的奇怪而精彩的配置文件,或者我还没有完全理解的配置惰性,可能会因发行版/版本而异,我不想维护所有的变体。。。然而
继续学习更多的英语。。。这很好,因为您可以从原始bashshell命令一直迭代到最佳实践
LINEINFLE模块
仍然很高兴看到如何更好地配置管理一个或两个设置,只需使用以下内容:
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
如果更改无效,请不要进行更改验证
/通知
仅在结束时重新启动一次的正确方法处理程序
- 如果您有多个设置,
(很快将成为带有_项
)循环
该设置可能被注释掉-请参阅其他答案^#?
将与其他设置不匹配(即\s*{{item.key}}\s
无法与SettingA
或NotSettingA
)SettingAThisIsNot
#AuthorizedKeysFile-这是一个我们必须接受的设置
,因为可能存在类似AuthorizedKeysFile/some/path的设置#这是一个设置
。。。重新阅读警告
模板模块
多发行版支持
如果你不是懒得支持你所有的发行版,看看这个提示
- 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"
(需要使用
first\u found
查找更新为循环
)使用replace
模块是否可以实现相同的目标
请分享您尝试过的内容?+:在第二次运行时,Ansible将再次找到AuthorizedKeysFile,并发现该行已处于所需状态,因此它将以“ok”状态结束任务。-:上述任务的一个警告:如果任何一行包含注释,Ansible可能会用第行中指定的值替换该行。除非您知道自己在做什么,否则不应使用Ansible修改现有文件。改用模板。模板最适合完整文件。当修改文件的某些部分时,lineinfle是完全可以接受的,事实上这就是它的用途。对不起,如果您使用模板以外的任何东西来实现像
sshd\u config
这样对安全性至关重要的东西,您就是在自找麻烦。总之,这也是一种错误的想法。文件是否“已满”无关紧要,但需要修改单个配置文件的不同部分的独立进程(角色/扮演/外部脚本)有多少。#AuthorizedKeysFile-用于显示正则表达式替换合法注释(此注释)的示例
+:它将在所需的行上工作,而不是在可能的注释中。-:它不会在ok状态下完成。它不应该在ok状态下完成,因为它已更改了文件。第一次运行时,它将被更改。第二次运行将被跳过,因为它与正则表达式不匹配。我不确定这有什么关系?这是一个反示例,说明如何使用Ansible或任何语言进行操作。值的更改需要手动检查和重写代码逻辑。我发现您需要在后续的
- 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"
- name: Uncomment line from /etc/ssh/sshd_config
replace:
path: /etc/ssh/sshd_config
regexp: '^\s*#+AuthorizedKeysFile.*$'
replace: 'AuthorizedKeysFile .ssh/authorized_keys'