Ansible でファイルの中身を編集するモジュール lineinfile がある。
使い方の例として「設定ファイルに一行パラメータを追加するときに使うんだよ」と教わった。
たとえば /etc/sudoers
に一行追加しよう。
$ ansible hostname -i inventory -m lineinfile -a 'path=/etc/sudoers line="user01 ALL=(ALL) ALL"'
これで line で指定した内容が path で指定したファイルに 1行追加される。
で、再実行すると。何も起きない!1行追加されない!
なんで?
と思ったんだけど説明書を読んでようやく納得できた。
lineinfile - Manage lines in text files — Ansible Documentation
これはファイルに行を追加する命令じゃないんだ。line で指定した行が必ず存在するようにする命令なんだ。場所を指定しなければファイルの末尾が使われるんだ。
暗黙の初期値 state=present
というのを読んでようやく理解した。必須パラメータじゃないから書かなくても動くんだけど。明示的に指定されるとそういう役目かとよくわかる。
なるほど冪等性。