Linux 文件中的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' 但是,此配置仅在行以

我想使用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'
但是,此配置仅在行以
#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'