2016-04-25 5 views
1

Ich versuche, einen benutzerdefinierten HBA Eintrag hinzufügen die Host-Maschine zu ermöglichen, zu einer PostgreSQL-Instanz läuft auf dem Vagabunden-Box zu verbinden:Kann nicht Array von Hashes ansible.host_vars in Vagrant des ansible_local provisioner Pass verschachtelt

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 

ich erhalte die Fehlermeldung:

AnsibleUndefinedVariable: 'unicode object' has no attribute 'type'

Wie kann ich einen verschachtelten (komplexen) Konfigurationswert für ein Host-Variable rechts in meinem Vagrantfile passieren?

Antwort

2

prüfen, wie die Host-Variablen in einer einzigen Zeile für einen Host-Eintrag in der automatisch generierten Inventardatei codiert sind,/tmp/Vagabund-ansible/Inventar/vagrant_ansible_local_inventory:

 
# Generated by Vagrant 

default ... 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 

Der Wert postgresql_pg_hba_custom vergangen ist nicht in einem gültigen Format.

Die Ansible documentation on variables Staaten:

As of Ansible 1.2, you can also pass in extra vars as quoted JSON, like so:

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

Also, sollten Sie innerhalb Apostrophe komplexe Werte als JSON eingewickelt übergeben. Anstatt den Wert manuell Crafting, können Sie die Verwendung von Ruby JSON module und String-Interpolation machen:

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 

Die erzeugte Inventardatei jetzt sein:

 
# Generated by Vagrant 

default ... 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 
+1

Diese in der Dokumentation sein sollte. – Starx