我开始研究使用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_messages
ansible这样的行会添加在上述规则的最后一项上。
我可以制定三个不同的规则,例如
lineinfile:
dest: /etc/rsyslog.conf
line: user.* -/var/log/user_messages
regexp: 'user.\*\s+-/var/log/user_messages'
state: present
应该可以工作,但是然后我需要编写三个不同的规则以将三行添加到/etc/syslog.conf中。
有什么办法可以设置一个规则来维护文件,但是我要添加的每一行都使用不同的正则表达式?
系统的,更健壮的和幂等的方式是分别声明选择器和操作,并在正则表达式和行中都使用它。例如
- 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] 删除。
我来说两句