From ba615ff94e004bcaafcb0c09b689fdc50c75217d Mon Sep 17 00:00:00 2001 From: Paul Czarkowski Date: Tue, 17 May 2016 23:30:01 -0500 Subject: [PATCH] race condition in download role under vagrant using a shared folder can cause race conditions for the download role as it tries to download files on all the nodes to the same shared path. This adds a flag to run the tasks in the download role on just one node. --- README.md | 57 +++----------------------------- Vagrantfile | 4 ++- roles/download/defaults/main.yml | 3 ++ roles/download/tasks/main.yml | 4 +++ 4 files changed, 14 insertions(+), 54 deletions(-) diff --git a/README.md b/README.md index f90a0ac0c..0acb16c67 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ![Kubespray Logo](http://s9.postimg.org/md5dyjl67/kubespray_logoandkubespray_small.png) -# Deploy a production ready kubernetes cluster +##Deploy a production ready kubernetes cluster - Can be deployed on **AWS, GCE, OpenStack or Baremetal** - **High available** cluster @@ -10,61 +10,12 @@ - Support most popular **Linux distributions** - **Continuous integration tests** -# Getting Started To deploy the cluster you can use : -## kargo-cli - -[**kargo-cli**](https://github.com/kubespray/kargo-cli) - -## Vagrant - -Assuming you have Vagrant (1.8+) installed with virtualbox (it may work -with vmware, but is untested) you should be able to launch a 3 node -Kubernetes cluster by simply running `$ vagrant up`. - -This will spin up 3 VMs and install kubernetes on them. Once they are -completed you can connect to any of them by running -`$ vagrant ssh k8s-0[1..3]`. - -``` -$ vagrant up -Bringing machine 'k8s-01' up with 'virtualbox' provider... -Bringing machine 'k8s-02' up with 'virtualbox' provider... -Bringing machine 'k8s-03' up with 'virtualbox' provider... -==> k8s-01: Box 'bento/ubuntu-14.04' could not be found. Attempting to find and install... -... -... - k8s-03: Running ansible-playbook... - -PLAY [k8s-cluster] ************************************************************* - -TASK [setup] ******************************************************************* -ok: [k8s-03] -ok: [k8s-01] -ok: [k8s-02] -... -... -PLAY RECAP ********************************************************************* -k8s-01 : ok=157 changed=66 unreachable=0 failed=0 -k8s-02 : ok=137 changed=59 unreachable=0 failed=0 -k8s-03 : ok=86 changed=51 unreachable=0 failed=0 - -$ vagrant ssh k8s-01 -vagrant@k8s-01:~$ kubectl get nodes -NAME STATUS AGE -k8s-01 Ready 45s -k8s-02 Ready 45s -k8s-03 Ready 45s -``` - - -## Ansible - -**Ansible** usual commands - -# Further Reading +* [**kargo-cli**](https://github.com/kubespray/kargo-cli) +* **vagrant** by simply running `vagrant up` +* **Ansible** usual commands A complete **documentation** can be found [**here**](https://docs.kubespray.io) diff --git a/Vagrantfile b/Vagrantfile index e32ced39f..ac8b91827 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -79,7 +79,8 @@ Vagrant.configure("2") do |config| "access_ip" => ip, "flannel_interface" => ip, "flannel_backend_type" => "host-gw", - "local_release_dir" => "/vagrant/temp" + "local_release_dir" => "/vagrant/temp", + "download_run_once" => "True" } config.vm.network :private_network, ip: ip @@ -96,6 +97,7 @@ Vagrant.configure("2") do |config| ansible.host_key_checking = false ansible.raw_arguments = ["--forks=#{$num_instances}"] ansible.host_vars = host_vars + #ansible.tags = ['download'] ansible.groups = { # The first three nodes should be etcd servers "etcd" => ["k8s-0[1:3]"], diff --git a/roles/download/defaults/main.yml b/roles/download/defaults/main.yml index 30952f691..72ae6e2e3 100644 --- a/roles/download/defaults/main.yml +++ b/roles/download/defaults/main.yml @@ -1,6 +1,9 @@ --- local_release_dir: /tmp +# if this is set to true will only download files once +download_run_once: False + # Versions kube_version: "v1.2.4" etcd_version: v2.2.5 diff --git a/roles/download/tasks/main.yml b/roles/download/tasks/main.yml index 746be939e..df9b652b1 100644 --- a/roles/download/tasks/main.yml +++ b/roles/download/tasks/main.yml @@ -2,6 +2,7 @@ - name: Create dest directories file: path={{local_release_dir}}/{{item.dest|dirname}} state=directory recurse=yes with_items: "{{ downloads }}" + run_once: "{{ download_run_once|bool }}" - name: Download items get_url: @@ -11,6 +12,7 @@ owner: "{{ item.owner|default(omit) }}" mode: "{{ item.mode|default(omit) }}" with_items: "{{ downloads }}" + run_once: "{{ download_run_once|bool }}" - name: Extract archives unarchive: @@ -21,6 +23,7 @@ copy: no when: "{{item.unarchive is defined and item.unarchive == True}}" with_items: "{{ downloads }}" + run_once: "{{ download_run_once|bool }}" - name: Fix permissions file: @@ -30,3 +33,4 @@ mode: "{{ item.mode|default(omit) }}" when: "{{item.unarchive is not defined or item.unarchive == False}}" with_items: "{{ downloads }}" + run_once: "{{ download_run_once|bool }}"