すでにある環境に対して、Ansibleで構成変更するとき、lineinfile で行を置き換えるのではなく、既存の行の一部を変更したいことがある。
しかし、このようなときに、冪等性を確保するのは意外に難しい。正規表現では、最小一致や否定先読みアサーションを使ったとしても、うまく行を選択できないか、あるいは複数回実行すると、そのたびに変更されてしまったりする。
とりあえず、grepで書き換えるべきかどうかを判定して、必要なときだけ書き換えるようにしてみた。
- hosts: servers
vars:
httpd_conf: /etc/apache2/apache2.conf
tasks:
- name: grep %{Session}C
command: grep '^LogFormat[[:space:]].*%{Session}C.*[[:space:]]combined' {{httpd_conf}}
register: grep
ignore_errors: True
failed_when: False
changed_when: False
- name: change httpd.conf
lineinfile:
backup=yes
backrefs=yes
dest={{httpd_conf}}
state=present
regexp="^(LogFormat\s+\")(.*)(\"\s+combined)$"
line="\1\2 \\\\\"%{Session}C\\\\\" \3"
when: grep.rc == 1
0 件のコメント:
コメントを投稿