Ansible取消注释文件中的行

时间:2017-02-02 11:38:26

标签: linux ansible

我想使用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'

4 个答案:

答案 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命令继续迭代到最佳实践。

lineinfile module

还是很高兴看到如何最好地配置管理一个或两个设置稍微好一点:

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无法匹配NotSettingASettingAThisIsNot

仍然可能会破坏我们必须接受的# 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'