続・Windowsでも(略

VagrantでAnsibleを使ってvagrant provisionするときに、Vagrantfileに以下のように書くんですが

config.vm.provision :ansible do |ansible|
  ansible.playbook = "site.yml"
  ansible.inventory_path = "ansible_hosts"
  ansible.extra_vars = { foo:'bar' }
  ansible.verbose = "extra"
end

このextra_varsが曲者で、渡す値が1組なら問題ない(とりあえず意図通り動くという意味で)のですが、値を2組渡すと実行時にエラーになっちゃいます。

config.vm.provision :ansible do |ansible|
  ansible.playbook = "site.yml"
  ansible.inventory_path = "ansible_hosts"
  ansible.extra_vars = { foo:'bar', baz:'zoo' }
  ansible.verbose = "extra"
end

エラー内容はこんな感じ

ERROR: the playbook: baz=zoo could not be found
Ansible failed to complete successfully. Any error output should be
visible above. Please fix these errors and try again.

extra_varsに設定したはずのパラメータがなぜかplaybookとして扱われる模様。 ログに出力された実行したと思われるコマンドを見るとこんな感じ。

c:\cygwin\bin\python2.7.exe c:\cygwin\bin\ansible-playbook --private-key=C:/Users/xxxx/.vagrant.d/insecure_private_key --user=vagrant "--extra-vars="foo=bar  baz=zoo"" --inventory-file=ansible_hosts -vvv site.yml

extra_vars周りが余分な""で囲まれていて、baz=zooが裸→ansible-playbookコマンドにとってはplaybookのように見えてるのかな・・・と。

で、このままだと困るので一応回避策。

config.vm.provision :ansible do |ansible|
  ansible.playbook = "site.yml"
  ansible.inventory_path = "ansible_hosts"
  ansible.raw_arguments = "--extra-vars=\\\"foo=bar\\\" \\\"baz=zoo\\\""
  ansible.verbose = "extra"
end

ソースを読んだ結果、raw_argumentsを発見。 コメントが恐ろしい感じだけどとりあえず気にしない。 これにより

c:\cygwin\bin\python2.7.exe c:\cygwin\bin\ansible-playbook --private-key=C:/Users/xxxx/.vagrant.d/insecure_private_key --user=vagrant "--extra-vars=\"foo=bar\" \"baz=zoo\"" --inventory-file=ansible_hosts -vvv site.yml

になって、ちゃんと複数のextra_varsが認識される。

オマケ。 verboseって公式ドキュメントを読む限り真偽値だと思ってたら、ソースを読んだら"extra"という文字列でも指定できて、そうすると-vvvとして実行されるのでより詳しいログが出てきます。