From e505bac08a9493cebaf62e40c7cdeb1e22ff0d54 Mon Sep 17 00:00:00 2001 From: Mehdi BEN ABDALLAH Date: Wed, 26 Jun 2019 20:53:15 +0200 Subject: [PATCH] wip ansible inventory --- .gitignore | 3 ++- Vagrantfile | 49 +++++++++++++++++++++++++++++------------- ansible.cfg | 3 +++ inventory/vagrant.py | 51 ++++++++++++++++++++++++++++++++++++++++++++ masters.yml | 0 workers.yml | 0 6 files changed, 90 insertions(+), 16 deletions(-) create mode 100644 ansible.cfg create mode 100755 inventory/vagrant.py create mode 100644 masters.yml create mode 100644 workers.yml diff --git a/.gitignore b/.gitignore index 4bc910d..2907a5d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .vagrant kubernetes/ etcd*/ -cluster.config \ No newline at end of file +cluster.config +inventory/generated \ No newline at end of file diff --git a/Vagrantfile b/Vagrantfile index a53709e..c99fef8 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -4,6 +4,19 @@ require 'open-uri' Vagrant.require_version ">= 2.2.4" +unless Vagrant.has_plugin?("vagrant-scp") + raise 'vagrant-scp is not installed! Please run vagrant plugin install vagrant-scp' +end + +hosts = { + masters: [ + "master-node" + ], + workers: (1..2).map { |i| "worker-node-#{i}" } +} + +generated_ansible_inventory_file="./inventory/generated" + Vagrant.configure("2") do |config| config.vm.box = "debian/stretch64" config.vm.box_version = "= 9.9.1" @@ -13,26 +26,32 @@ Vagrant.configure("2") do |config| # greet from every configured VM, revealing its hostname config.vm.provision "shell", inline: "echo Hello from \$HOSTNAME" - config.vm.define "master-node" do |node| - node.vm.hostname = "master-node" - - node.vm.provider :virtualbox do |v| - v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] - v.customize ["modifyvm", :id, "--memory", 512] - v.customize ["modifyvm", :id, "--name", "master-node"] - end - end - - (1..2).each do |i| - config.vm.define "worker-node-#{i}" do |node| - node.vm.hostname = "worker-node-#{i}" - + (hosts[:masters] + hosts[:workers]).each do |node_name| + config.vm.define node_name do |node| + node.vm.hostname = node_name + node.vm.provider :virtualbox do |v| v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] v.customize ["modifyvm", :id, "--memory", 512] - v.customize ["modifyvm", :id, "--name", "worker-node-#{i}"] + v.customize ["modifyvm", :id, "--name", node_name] end end end + + config.trigger.after :up do |trigger| + File.open(generated_ansible_inventory_file, "w") do |w| + w.puts "[masters]" + hosts[:masters].each { |host| w.puts host } + + w.puts "[workers]" + hosts[:workers].each { |host| w.puts host } + end + end + + """ + config.trigger.after :destroy do |trigger| + File.delete(generated_ansible_inventory_file) if File.exist?(generated_ansible_inventory_file) + end + """ end diff --git a/ansible.cfg b/ansible.cfg new file mode 100644 index 0000000..aa5b92c --- /dev/null +++ b/ansible.cfg @@ -0,0 +1,3 @@ +[defaults] +remote_tmp = /tmp/$USER/ansible +inventory = inventory/ diff --git a/inventory/vagrant.py b/inventory/vagrant.py new file mode 100755 index 0000000..11c1385 --- /dev/null +++ b/inventory/vagrant.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python +# Shameless copy of https://gist.github.com/d-a-n/baabf3b010a6851f0e84 +import argparse +import json +import paramiko +import subprocess +import sys + + +def parse_args(): + parser = argparse.ArgumentParser(description="Vagrant inventory script") + group = parser.add_mutually_exclusive_group(required=True) + group.add_argument('--list', action='store_true') + group.add_argument('--host') + return parser.parse_args() + + +def list_running_hosts(): + cmd = "vagrant status --machine-readable" + status = subprocess.check_output(cmd.split()).rstrip() + hosts = [] + for line in status.split('\n'): + (_, host, key, value) = line.split(',',3) + if key == 'state' and value == 'running': + hosts.append(host) + return hosts + + +def get_host_details(host): + cmd = "vagrant ssh-config {}".format(host) + p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) + config = paramiko.SSHConfig() + config.parse(p.stdout) + c = config.lookup(host) + return {'ansible_ssh_host': c['hostname'], + 'ansible_ssh_port': c['port'], + 'ansible_ssh_user': c['user'], + 'ansible_ssh_private_key_file': c['identityfile'][0]} + + +def main(): + args = parse_args() + if args.list: + hosts = list_running_hosts() + json.dump({'vagrant': hosts}, sys.stdout) + else: + details = get_host_details(args.host) + json.dump(details, sys.stdout) + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/masters.yml b/masters.yml new file mode 100644 index 0000000..e69de29 diff --git a/workers.yml b/workers.yml new file mode 100644 index 0000000..e69de29