[Ansible] host_vars en Vagrant lokaal testen

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • wilmardo
  • Registratie: Februari 2011
  • Laatst online: 11:38
Ha devs,

Na een halfjaar op stage bezig te zijn geweest met Ansible ben ik enthousiast geworden en ben het nu ook aan het opzetten voor mijzelf. Ik run een Proxmox server met een aantal containers die ik met Ansible wil gaan provisionen.

Ik loop alleen nu tegen een issue aan, ik gebruik Vagrant om lokaal Ansible te testen. In de Vagrantfile creëer ik een dynamische inventory. Mijn productie inventory bevind zich onder /inventory/hosts met de bijbehorende host_vars. Ook nog even geprobeerd of het verschil maakt met de host_vars en host file in de root directory maar dat maakt ook niet uit.
De dynamische inventory maakt het lastig, eerst zaten mijn hosts niet in een group, dat heb ik opgelost door in een loop de een groups array te creëren. Maar nu kwam ik erachter dat Vagrant de hosts_vars uit de /inventory niet gebruikt (ook wel logisch aangezien er op deze manier een losse inventory wordt gemaakt). De vars in group_vars worden wel netjes opgepikt.

Nu heb ik hetzelfde truukje geprobeerd toe te passen als voor de groups maar Vagrant vind variabelen als de onderstaande niet zo fijn in zijn dynamische inventory en gooit de daar weer onderstaande foutmelding.
Python:
1
nextcloud_instance_name: "{{ nextcloud_trusted_domain | first }}"

code:
1
2
ERROR! Attempted to read "/home/wilmardo/Documents/Development/lansible/.vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory" as YAML: 'AnsibleUnicode' object has no attribute 'keys'
Attempted to read "/home/wilmardo/Documents/Development/lansible/.vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory" as ini file: /home/wilmardo/Documents/Development/lansible/.vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory:3: Expected key=value host variable assignment, got: {{ hostvars[loadbalancer.lansible.nl]['ansible_eth0']['ipv4']['address'] }}]


Nu vraag ik me allereerst af, hoe kan ik dit beter aanpakken? Wat zijn de ervaringen hier wat betreft lokaal testen? Is het de moeite waard uit te gaan zoeken of ik dit kan oplossen of is er een betere opzet mogelijk om lokaal te testen.
Ik zou graag alle host_vars op een plek houden en niet constant hoeven knippen en plakken tussen twee inventories (lokaal en productie).
Wie heeft hier meer ervaring mee? Google helpt me ook niet echt verder tot nu toe.

Dit is mijn huidige Vagrantfile:
Ruby:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# Require YAML module
require 'yaml'

Vagrant.configure("2") do |config|

  vms = {
    "jenkins" => {
      "hostname" => "jenkins.domain.nl",
      "group" => "jenkins",
      "os" => "centos/7",
    },
    "nextcloud" => {
      "hostname" => "nextcloud.domain.nl",
      "group" => "nextcloud",
      "os" => "wholebits/ubuntu16.04-64",
    },
    "loadbalancer" => {
      "hostname" => "loadbalancer.domain.nl",
      "group" => "loadbalancer",
      "os" => "centos/7",
    },
  }

  groups = {}
  host_vars = {}
  vms.each do |key, value|
    # create groups
    groups[value['group']] = value['hostname']

    # get host_vars
    host_vars[value['hostname']] = YAML.load_file("inventory/host_vars/#{value['hostname']}.yml")
  end

  if Vagrant.has_plugin?("vagrant-cachier")
    config.cache.scope = :box
  end

  config.vm.provider "libvirt" do |v|
    v.memory = 512
    v.cpus = 4
  end

  vms.each do |key, value|
    config.vm.define "#{value['hostname']}" do |define|
      define.vm.box = "#{value['os']}"
      define.vm.hostname = "#{value['hostname']}"

      define.vm.provision "ansible" do |ansible|
        #ansible.verbose = "vvv" #uncomment for debug, more v's, more debug output where 3 v's is the logical max
        ansible.playbook = "#{value['group']}.yml"
        ansible.groups = groups
        ansible.host_vars = host_vars
      end
    end
  end
end

Alle reacties


Acties:
  • 0 Henk 'm!

  • naam
  • Registratie: Oktober 2007
  • Laatst online: 20-09 22:03
Probeer de blokken op regel 26 en 43 eens om te draaien, het lijkt erop dat je een bestand probeert te lezen dat pas later aangemaakt wordt.

Acties:
  • 0 Henk 'm!

  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 09:25

Salandur

Software Engineer

Wat ik heb gedaan is voor ansible/vagrant een aparte inventory directory gemaakt (vagrant_inventory) en de volgende code opgenomen in mijn Vagrantfile:

code:
1
2
3
4
5
6
7
  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "vagrant.yml"
    ansible.vault_password_file = ".ansible_vault_password"
    ansible.inventory_path = "vagrant_inventory/local"
    ansible.limit = "all"
    # ansible.galaxy_role_file = 'requirements.yml'
  end


Hiermee heb ik aparte en betere controle over de ansible configuration. Mijn vagrant_inventory directory heeft de 'local' hosts file en een 'host_vars' directory met de correct settings. En het houdt je Vagrant file lekker compact.

Assumptions are the mother of all fuck ups | iRacing Profiel


Acties:
  • 0 Henk 'm!

  • wilmardo
  • Registratie: Februari 2011
  • Laatst online: 11:38
naam schreef op donderdag 23 maart 2017 @ 12:01:
Probeer de blokken op regel 26 en 43 eens om te draaien, het lijkt erop dat je een bestand probeert te lezen dat pas later aangemaakt wordt.
Dat gaat volgens mij niet werken, in het blok op regel 26 wordt een variable aangemaakt voor in blok 43.
Salandur schreef op donderdag 23 maart 2017 @ 18:28:
Wat ik heb gedaan is voor ansible/vagrant een aparte inventory directory gemaakt (vagrant_inventory) en de volgende code opgenomen in mijn Vagrantfile:

code:
1
2
3
4
5
6
7
  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "vagrant.yml"
    ansible.vault_password_file = ".ansible_vault_password"
    ansible.inventory_path = "vagrant_inventory/local"
    ansible.limit = "all"
    # ansible.galaxy_role_file = 'requirements.yml'
  end


Hiermee heb ik aparte en betere controle over de ansible configuration. Mijn vagrant_inventory directory heeft de 'local' hosts file en een 'host_vars' directory met de correct settings. En het houdt je Vagrant file lekker compact.
Dat is inderdaad ook waar ik aan zit te denken maar ik wil de host_vars van de productie omgeving lokaal gebruiken, zodat ik zeker weet dat ik lokaal met dezelfde variabelen test als productie.
Ik ga nog even verder puzzelen, ik nu als tussenoplossing het onderstaande
Ruby:
1
2
3
# copy hostvars
project_dir = File.dirname(__FILE__)
FileUtils.copy_entry("#{project_dir}/plays/host_vars", "#{project_dir}/.vagrant/provisioners/ansible/inventory/host_vars", preserve=true)

Zodra ik wat moois heb gemaakt zal ik het hier nog even posten maar ik ben nog steeds wel nieuwsgierig naar de ervaringen met lokaal testen :)