Ansible の Variables の名前付けとデフォルト値の上書き

role で使う変数の名前が衝突しないよう配慮すると、素朴に辞書を定義して名前空間を導入したいと考えると思う:

--- # roles/mackerel-agent/defaults/main.yml
mackerel_agent:
  pid_file: '...'
  id: '...'

ところが Ansible の Variables は辞書の deep merge を行ってくれないので、デフォルト値の一部上書きができない:

--- # host_vars/app001.yml
mackerel_agent:
  id: '...'
  # !!! mackerel_agent.pid_file が未定義になる !!!

なので辞書を用いて衝突を回避するのは諦めて、気をつけるしかなさそう:

--- # roles/mackerel-agent/defaults/main.yml
mackerel_agent_pid_file: '...'
mackerel_agent_id: '...'