Ansible-忽略lineinfile中的空格差异

莫滕·西克尔(MortenSickel)

我开始研究使用ansible维护一组服务器。我在使用lineinfile时遇到了困难。我正在设置rsyslog并想确保/etc/rsyslog.conf中有几行:

  - name: set up rsyslog
    lineinfile:
       dest: /etc/rsyslog.conf
       line: '{{ item }}'
    with_items:
       - "*.* @@rsysserver.example.com:514"
       - "*.info;mail.none;authpriv.none;cron.none;user.none      /var/log/messages"
       - "user.*                                                  -/var/log/user_messages"

这在一个新盒子上可以正常工作,但是我的问题是一些服务器已经手工维护了一段时间,这意味着这些行中的空白量可能会有所不同,因此如果应该有一行像user.* -/var/log/user_messagesansible这样的行会添加在上述规则的最后一项上。

我可以制定三个不同的规则,例如

    lineinfile:
       dest: /etc/rsyslog.conf
       line: user.*                                                  -/var/log/user_messages
       regexp: 'user.\*\s+-/var/log/user_messages'
       state: present

应该可以工作,但是然后我需要编写三个不同的规则以将三行添加到/etc/syslog.conf中。

有什么办法可以设置一个规则来维护文件,但是我要添加的每一行都使用不同的正则表达式?

弗拉基米尔·博特卡(Vladimir Botka)

系统的,更健壮的和幂等的方式是分别声明选择器和操作,并在正则表达式和行中都使用它。例如

- name: set up rsyslog
  lineinfile:
    dest: rsyslog.conf
    regexp: '^\s*{{ item.selector|regex_escape() }}\s+{{ item.action|regex_escape() }}\s*$'
    line: '{{ item.selector }} {{ item.action }}'
  loop:
    - selector: '*.*'
      action: '@@rsysserver.example.com:514'
    - selector: '*.info;mail.none;authpriv.none;cron.none;user.none'
      action: '/var/log/messages'
    - selector: 'user.*'
      action: '-/var/log/user_messages'

shell> cat rsyslog.conf 
*.* @@rsysserver.example.com:514
*.info;mail.none;authpriv.none;cron.none;user.none /var/log/messages
user.* -/var/log/user_messages

如果要在选择器和动作之间保持间距,请使用backrefs例如,下面的任务

- name: set up rsyslog
  lineinfile:
    dest: rsyslog.conf
    backrefs: true
    regexp: '^\s*{{ item.selector|regex_escape() }} (\s*){{ item.action|regex_escape() }}\s*$'
    line: '{{ item.selector }} \1{{ item.action }}'
  loop:
    - selector: '*.*'
      action: '@@rsysserver.example.com:514'
    - selector: '*.info;mail.none;authpriv.none;cron.none;user.none'
      action: '/var/log/messages'
    - selector: 'user.*'
      action: '-/var/log/user_messages'

将保持此文件不变

shell> cat rsyslog.conf
*.*                                                @@rsysserver.example.com:514
*.info;mail.none;authpriv.none;cron.none;user.none /var/log/messages
user.*                                             -/var/log/user_messages

不幸的是,不会添加新行。引用backrefs

如果正则表达式与文件中的任何地方都不匹配,则文件将保持不变

请参阅格式以尝试更复杂的格式化。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章