无法将嵌套的哈希数组传递给 Vagrant 的 ansible_local 配置器中的 ansible.host_vars

Ate*_*ral 2 vagrant ansible

我正在尝试添加一个自定义 HBA 条目以允许主机连接到在 Vagrant 框上运行的 PostgreSQL 实例:

config.vm.provision "ansible_local" do |ansible|
  ansible.playbook = "provisioning/playbook.yml"
  ansible.galaxy_role_file = "provisioning/requirements.yml"
  ansible.host_vars = {
    "default" => {
      "postgresql_listen_addresses" => "*",
      "postgresql_pg_hba_custom" => [{
        "type" => "host",
        "database" => "vagrant",
        "user" => "vagrant",
        "address" => "samenet",
        "method" => "password"
      }],
      "database_name" => "vagrant",
      "database_username" => "vagrant",
      "database_password" => "password",
      "node_environment" => "development"
    }
  }
end
Run Code Online (Sandbox Code Playgroud)

我收到错误:

AnsibleUndefinedVariable: 'unicode object' 没有属性 'type'

如何在 Vagrantfile 中为宿主变量传递嵌套(复杂)配置值?

Ate*_*ral 5

检查主机变量如何在自动生成的清单文件 /tmp/vagrant-ansible/inventory/vagrant_ansible_local_inventory 中的主机条目的单行中编码:

# 由 Vagrant 生成

默认 ... postgresql_pg_hba_custom=[{"type"=>"host", "database"=>"vagrant", "user"=>"vagrant", "address"=>"samenet", "method"=>"密码"}] database_name=vagrant database_username=vagrant database_password=密码 node_environment=development

传递给 postgresql_pg_hba_custom 的值的格式无效。

关于变量Ansible 文档指出:

从 Ansible 1.2 开始,您还可以将额外的变量作为引用的 JSON 传递,如下所示:

--extra-vars '{"pacman":"mrs","ghosts":["inky","pinky","clyde","sue"]}'

因此,您应该将复杂值作为包裹在单引号中的 JSON 传递。您可以使用 Ruby 的JSON 模块和字符串插值,而不是手动制作值:

config.vm.provision "ansible_local" do |ansible|
  require 'json'

  postgresql_pg_hba_custom = [{
    "type" => "host",
    "database" => "vagrant",
    "user" => "vagrant",
    "address" => "samenet",
    "method" => "password"
  }]

  ansible.playbook = "provisioning/playbook.yml"
  ansible.galaxy_role_file = "provisioning/requirements.yml"
  ansible.host_vars = {
    "default" => {
      "postgresql_listen_addresses" => "*",
      "postgresql_pg_hba_custom" => "'#{postgresql_pg_hba_custom.to_json}'",
      "database_name" => "vagrant",
      "database_username" => "vagrant",
      "database_password" => "password",
      "node_environment" => "development"
    }
  }
end
Run Code Online (Sandbox Code Playgroud)

生成的清单文件现在将是:

# 由 Vagrant 生成

默认 ... postgresql_pg_hba_custom='[{"type":"host","database":"vagrant","user":"vagrant","address":"samenet","method":"password"}] ' database_name=vagrant database_username=vagrant database_password=密码 node_environment=development