lineinfile で複数行を一括置換したい

今回のお題では、ansible で /etc/chrony.conf にあるタイムサーバを変更します。CentOS7 の /etc/chrony.conf は、デフォルトでは以下のようになっています。

変更前)

vagrant@localhost:~$ head -5 /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst

これを、デフォルトではインターネット上の国内サーバ(複数個)を指すようにします:

変更後)

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server ntp1.jst.mfeed.ad.jp iburst
server ntp2.jst.mfeed.ad.jp iburst
server ntp3.jst.mfeed.ad.jp iburst

さらに、もし固有のタイムサーバが決まっている場合は上書き指定できるようにします。実のところ、[0-2].centos.pool.ntp.org も実際に DNS を引いてみると、そのうちのどれかは国内のアドレスを返すようになっていたりもするので、本来そこまで神経質になる必要はなさそうですけどね。

結果的には、一発ではできませんでした(汗)。一応冪等性は確保できたみたいですが、毎回ステータスが Changed になってしまうのが玉にキズです。ちなみに blockinfile というのもありますが、これはマークで囲まれている部分の置換なので、今回のようなケースでは使えないと思われます。

まずは global_vars/all 。ここにデフォルト値を設定しておきます。

vagrant@localhost:~/deploy$ cat group_vars/all
# global_vars/all
TIME_ZONE: 'Asia/Tokyo'
# ---- オンプレ用のタイムサーバが決定したら、host_vars 側を変更してください。
TIME_SERVERS:
- 'ntp1.jst.mfeed.ad.jp'
- 'ntp2.jst.mfeed.ad.jp'
- 'ntp3.jst.mfeed.ad.jp'

固有のタイムサーバがある場合は host_vars 側で指定します(オプション)。

vagrant@localhost:~/deploy$ cat host_vars/localhost.yml
# 顧客専用のタイムサーバが決定している場合は以下を有効にしてください。
# (複数サーバの指定も可能です)
# コメントアウトの場合は global_vars/all にある値が使われます。
TIME_SERVERS:
- '192.168.0.1'
- '192.168.0.2'

Playbook はこんな感じ。tags はテスト用なので、なくても構いません。

vagrant@localhost:~/deploy$ cat roles/base/tasks/time.yml
# Set time stuff
---
- name: roles/base/tasks/time.yml
  command: echo

- name: (OSレベルの)タイムゾーンの設定
  timezone:
  name: "{{ TIME_ZONE }}"
  become: yes

- name: /etc/chrony.conf にあるデフォルトのタイムサーバを削除
  lineinfile:
  path: /etc/chrony.conf
  regexp: '^server'
  state: absent
  become: yes
  tags: chrony

- name: オンプレ用タイムサーバを設定
  lineinfile:
  path: /etc/chrony.conf
  line: "server {{ item }} iburst"
  insertafter: '^# Please consider joining the pool'
  become: yes
  with_items:
    - "{{ TIME_SERVERS }}"
  tags: chrony
タイトルとURLをコピーしました