BSD + ansible で sysrc を用いて利用可能にする

BSD 系では rc.conf に *_enable="YES" のような形で設定しないと init script 等で起動しない挙動をするようにするのが一般的な様子?(詳しくは未調査)

ansible でこのあたりを編集するのはつらいのでコマンドを用いて設定できるようにするには sysrc を使うと便利。 sysrc はどうやらデフォルトで入ってなさそう(少なくとも DragonflyBSD においては)なのでこれをインストールするタスクも入れる必要がある。 (汎用的に使うには role に設定して dependences にいれておいたほうが便利そう)

- name: install sysrc
  package:
    name: sysrc
    state: present

- name: enable openvpn
  command: sysrc -ni openvpn_enable="YES"
  register: openvpn_enable_rc
  changed_when: (openvpn_enable_rc.stdout == "NO -> YES") or (openvpn_enable_rc.stdout == " -> YES") 

上記の動作確認は DragonflyBSD で行ったがこの sysrc は存在してもしなくて return code は 0 を返すため設定に成功したかどうかわからず そのままでは changed 設定ができない。苦肉の策として標準出力を用いている。

sysrc の 実行例

以下はもとに設定がない場合。

n をつけない場合

$ sysrc openvpn_enable="YES" 
openvpn_enable:  -> YES

n をつけた場合

$ sysrc -n openvpn_enable="YES" 
 -> YES

i をつけない場合

$ sysrc openvpn_enable
sysrc: unknown variable 'openvpn_enable'

i をつける場合何もかえらない。そのキーが存在しない場合に sysrc: unknown variable 'openvpn_enable' といったメッセージを出す場合があるので前述の ansible task では 念のためつけている。(影響があるのは 設定する場合と -x で削除する場合)

$ sysrc -i openvpn_enable

e は以下のように ダブルクオーテーションの挙動がなにかおかしいので使ってない。

$ sysrc -e openvpn_enable="YES"
openvpn_enable=" -> YES