diff --git a/ansible/ansible.cfg b/ansible/ansible.cfg index d520afb3ff4..91691208305 100644 --- a/ansible/ansible.cfg +++ b/ansible/ansible.cfg @@ -155,7 +155,9 @@ callback_whitelist = profile_tasks # wanting to use, for example, IP information from one group of servers # without having to talk to them in the same playbook run to get their # current IP information. -fact_caching = memory +fact_caching = jsonfile +fact_caching_connection = ~/.ansible/cache +fact_caching_timeout = 600 # retry files diff --git a/ansible/roles/vm_set/library/vm_topology.py b/ansible/roles/vm_set/library/vm_topology.py index 7fc763ab6fb..e46cabe6342 100644 --- a/ansible/roles/vm_set/library/vm_topology.py +++ b/ansible/roles/vm_set/library/vm_topology.py @@ -444,7 +444,7 @@ def iface_updown(iface_name, state, pid): @staticmethod def cmd(cmdline): with open(CMD_DEBUG_FNAME, 'a') as fp: - pprint(cmdline, fp) + pprint("CMD: %s" % cmdline, fp) cmd = cmdline.split(' ') process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = process.communicate() @@ -453,6 +453,8 @@ def cmd(cmdline): if ret_code != 0: raise Exception("ret_code=%d, error message=%s. cmd=%s" % (ret_code, stderr, cmdline)) + with open(CMD_DEBUG_FNAME, 'a') as fp: + pprint("OUTPUT: %s" % stdout, fp) return stdout @staticmethod @@ -486,7 +488,7 @@ def ifconfig(cmdline): continue terms = row.split() if not row[0].isspace(): - ifaces.add(terms[0]) + ifaces.add(terms[0].rstrip(':')) return ifaces diff --git a/ansible/roles/vm_set/tasks/add_topo.yml b/ansible/roles/vm_set/tasks/add_topo.yml index 2e0463bf823..134ef242d5b 100644 --- a/ansible/roles/vm_set/tasks/add_topo.yml +++ b/ansible/roles/vm_set/tasks/add_topo.yml @@ -10,6 +10,7 @@ net: none detach: True cap_add: NET_ADMIN + become: yes - name: Bind topology {{ topo }} to VMs. base vm = {{ VM_base }} base vlan = {{ vlan_base }} vm_topology: @@ -24,4 +25,4 @@ mgmt_bridge: "{{ mgmt_bridge }}" ext_iface: "{{ external_iface }}" fp_mtu: "{{ fp_mtu_size }}" - + become: yes diff --git a/ansible/roles/vm_set/tasks/main.yml b/ansible/roles/vm_set/tasks/main.yml index e1e3ce64e28..fab8bbd721e 100644 --- a/ansible/roles/vm_set/tasks/main.yml +++ b/ansible/roles/vm_set/tasks/main.yml @@ -4,7 +4,7 @@ # - id: sequence number for vm set on the host. # - external_iface: interface which will be used as parent for vlan interface creation # - vlan_base: first vlan id for the VMs -# - VMs: a dictionary which contains hostnames of VMs as a key and a dictionary with parameters (num, memory, mgmt_ip) for every VM. +# - VMs: a dictionary which contains hostnames of VMs as a key and a dictionary with parameters (num, memory, mgmt_ip) for every VM. # - topology: a dictionary which contains hostnames of VMs as a key and vlans value which define a topology (numbers of connected ports for every VM) # - mgmt_bridge: linux bridge which is used for management interface connections # - root_path: path where disk images for VMs are created @@ -13,8 +13,49 @@ # - vm_images_url: url where base images are located # - vmimages_saskey: a key for Azure download service. Could be set to '' +# Need latest ubuntu 4.10 kernel to fix a openvswitch bug +# https://bugs.launchpad.net/ubuntu/+source/kernel-package/+bug/1685742 +- name: Check if kernel upgrade needed + set_fact: + kernel_upgrade_needed: true + when: + - ansible_distribution == "Ubuntu" + - ansible_distribution_version == "17.04" + - ansible_kernel.find('4.10.0') != -1 + - "{{ ansible_kernel | regex_replace('4.10.0-([0-9]+)-.*', '\\1') | int < 25 }}" + +- block: + - debug: msg="{{ ansible_kernel }}" + + - name: Upgrade kernel package + apt: pkg={{ item }} state=latest + become: yes + with_items: + - linux-image-generic + - linux-image-extra-virtual + + - name: Prompt for rebooting + fail: + msg: "Kernel upgraded, need to reboot!" + when: kernel_upgrade_needed is defined + +- name: Add docker repository for 17.04 + apt_repository: + repo: deb [arch=amd64] https://download.docker.com/linux/ubuntu zesty stable + state: present + become: yes + when: ansible_distribution_version == "17.04" + +- name: Add docker repository for 16.04 + apt_repository: + repo: deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable + state: present + become: yes + when: ansible_distribution_version == "16.04" + - name: Install necessary packages - apt: pkg={{ item }} update_cache=yes cache_valid_time=3600 + apt: pkg={{ item }} update_cache=yes cache_valid_time=86400 + become: yes with_items: - qemu - openvswitch-switch @@ -26,11 +67,24 @@ - libvirt-bin - python-libvirt - python-pip + - apt-transport-https + - ca-certificates + - curl + - software-properties-common + - docker-ce - name: Install python packages pip: name=docker-py state=present version=1.7.2 + become: yes environment: "{{ proxy_env | default({}) }}" +- name: Install br_netfilter kernel module + become: yes + modprobe: name=br_netfilter state=present + +- name: Ensure {{ root_path }} exists + file: path={{ root_path }} state=directory + - name: Install cleanup script template: src=cleanup.sh.j2 dest={{ root_path }}/cleanup.sh diff --git a/ansible/roles/vm_set/tasks/remove_topo.yml b/ansible/roles/vm_set/tasks/remove_topo.yml index 21d00bf497c..6b3558aa730 100644 --- a/ansible/roles/vm_set/tasks/remove_topo.yml +++ b/ansible/roles/vm_set/tasks/remove_topo.yml @@ -3,6 +3,7 @@ name: ptf_{{ vm_set_name }} image: "{{ docker_registry_host }}/{{ ptf_imagename }}" state: absent + become: yes - name: Unbind topology {{ topo }} to VMs. base vm = {{ VM_base }} base vlan = {{ vlan_base }} vm_topology: @@ -13,4 +14,4 @@ vm_base: "{{ VM_base }}" vlan_base: "{{ vlan_base }}" ext_iface: "{{ external_iface }}" - + become: yes diff --git a/ansible/roles/vm_set/tasks/renumber_topo.yml b/ansible/roles/vm_set/tasks/renumber_topo.yml index 838bf84ffec..ebbbca1d463 100644 --- a/ansible/roles/vm_set/tasks/renumber_topo.yml +++ b/ansible/roles/vm_set/tasks/renumber_topo.yml @@ -3,6 +3,7 @@ name: ptf_{{ vm_set_name }} image: "{{ docker_registry_host }}/{{ ptf_imagename }}" state: absent + become: yes - name: Create a docker container ptf_{{ vm_set_name }} docker: @@ -16,6 +17,7 @@ net: none detach: True cap_add: NET_ADMIN + become: yes - name: Renumber topology {{ topo }} to VMs. base vm = {{ VM_base }} base vlan = {{ vlan_base }} vm_topology: @@ -30,4 +32,4 @@ mgmt_bridge: "{{ mgmt_bridge }}" ext_iface: "{{ external_iface }}" fp_mtu: "{{ fp_mtu_size }}" - + become: yes diff --git a/ansible/roles/vm_set/tasks/start.yml b/ansible/roles/vm_set/tasks/start.yml index c5ea4c37712..cc123071d15 100644 --- a/ansible/roles/vm_set/tasks/start.yml +++ b/ansible/roles/vm_set/tasks/start.yml @@ -3,6 +3,7 @@ name: "{{ item }}" value: 0 sysctl_set: yes + become: yes with_items: - net.bridge.bridge-nf-call-arptables - net.bridge.bridge-nf-call-ip6tables @@ -13,6 +14,7 @@ name: "net.core.rmem_max" value: 509430500 sysctl_set: yes + become: yes - name: Create directory for vm images and vm disks file: path={{ item }} state=directory mode=0755 recurse=yes @@ -45,6 +47,7 @@ when: not cd_stat.stat.exists and not skip_image_downloading - name: Create VMs network + become: yes vm_topology: cmd: 'create' vm_names: "{{ VM_hosts }}" diff --git a/ansible/roles/vm_set/tasks/stop.yml b/ansible/roles/vm_set/tasks/stop.yml index abba4780002..bf2ae6b80f1 100644 --- a/ansible/roles/vm_set/tasks/stop.yml +++ b/ansible/roles/vm_set/tasks/stop.yml @@ -9,4 +9,4 @@ vm_topology: cmd: 'destroy' vm_names: "{{ VM_hosts }}" - + become: yes diff --git a/ansible/testbed_add_vm_topology.yml b/ansible/testbed_add_vm_topology.yml index 73f9861ff81..038ddf27f23 100644 --- a/ansible/testbed_add_vm_topology.yml +++ b/ansible/testbed_add_vm_topology.yml @@ -28,7 +28,6 @@ # -e ptf_imagename=docker-ptf - name of a docker-image which will be used for the ptf docker container - hosts: servers:&vm_host - gather_facts: no become: true vars_files: - vars/docker_registry.yml diff --git a/ansible/testbed_start_VMs.yml b/ansible/testbed_start_VMs.yml index f0371f715f8..73afc1506b0 100644 --- a/ansible/testbed_start_VMs.yml +++ b/ansible/testbed_start_VMs.yml @@ -16,11 +16,8 @@ # - hosts: servers:&vm_host - gather_facts: no - become: true vars_files: - vars/azure_storage.yml tasks: roles: - { role: vm_set, action: 'start' } -