Merge "Create Ansible role to install arbitrary Python version"
This commit is contained in:
commit
30efd97718
4
.ansible-lint
Normal file
4
.ansible-lint
Normal file
@ -0,0 +1,4 @@
|
||||
---
|
||||
|
||||
skip_list:
|
||||
- '403'
|
1
roles/python/.gitignore
vendored
Normal file
1
roles/python/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
tox-py38
|
94
roles/python/Vagrantfile
vendored
Normal file
94
roles/python/Vagrantfile
vendored
Normal file
@ -0,0 +1,94 @@
|
||||
# -*- mode: ruby -*-
|
||||
# vi: set ft=ruby :
|
||||
|
||||
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
|
||||
VAGRANTFILE_API_VERSION = "2"
|
||||
|
||||
# Customize the count of CPU cores on the VM
|
||||
CPUS = 4
|
||||
|
||||
# Customize the amount of memory on the VM
|
||||
MEMORY = 8192
|
||||
|
||||
# Every Vagrant development environment requires a box. You can search for
|
||||
# boxes at https://vagrantcloud.com/search.
|
||||
BOX = "generic/centos7"
|
||||
|
||||
HOSTNAME = "tobiko"
|
||||
|
||||
TOX_INI_DIR = '../..'
|
||||
|
||||
|
||||
# All Vagrant configuration is done below. The "2" in Vagrant.configure
|
||||
# configures the configuration version (we support older styles for
|
||||
# backwards compatibility). Please don't change it unless you know what
|
||||
# you're doing.
|
||||
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
||||
# The most common configuration options are documented and commented below.
|
||||
# For a complete reference, please see the online documentation at
|
||||
# https://docs.vagrantup.com.
|
||||
|
||||
config.vm.box = BOX
|
||||
config.vm.hostname = HOSTNAME
|
||||
|
||||
# Disable automatic box update checking. If you disable this, then
|
||||
# boxes will only be checked for updates when the user runs
|
||||
# `vagrant box outdated`. This is not recommended.
|
||||
config.vm.box_check_update = false
|
||||
|
||||
# Create a forwarded port mapping which allows access to a specific port
|
||||
# within the machine from a port on the host machine. In the example below,
|
||||
# accessing "localhost:8080" will access port 80 on the guest machine.
|
||||
# NOTE: This will enable public access to the opened port
|
||||
# config.vm.network "forwarded_port", guest: 80, host: 8080
|
||||
|
||||
# Create a forwarded port mapping which allows access to a specific port
|
||||
# within the machine from a port on the host machine and only allow access
|
||||
# via 127.0.0.1 to disable public access
|
||||
# config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
|
||||
|
||||
# Create a private network, which allows host-only access to the machine
|
||||
# using a specific IP.
|
||||
# config.vm.network "private_network", ip: DEVSTACK_HOST_IP
|
||||
|
||||
# Create a public network, which generally matched to bridged network.
|
||||
# Bridged networks make the machine appear as another physical device on
|
||||
# your network.
|
||||
# config.vm.network "public_network", ip: "172.18.161.6"
|
||||
|
||||
# Share an additional folder to the guest VM. The first argument is
|
||||
# the path on the host to the actual folder. The second argument is
|
||||
# the path on the guest to mount the folder. And the optional third
|
||||
# argument is a set of non-required options.
|
||||
# config.vm.synced_folder "../data", "/vagrant_data"
|
||||
|
||||
# Provider-specific configuration so you can fine-tune various
|
||||
# backing providers for Vagrant. These expose provider-specific options.
|
||||
# Example for VirtualBox:
|
||||
|
||||
config.vm.provider "virtualbox" do |vb|
|
||||
# Display the VirtualBox GUI when booting the machine
|
||||
vb.gui = false
|
||||
|
||||
vb.cpus = CPUS
|
||||
vb.memory = MEMORY
|
||||
end
|
||||
|
||||
config.vm.provider "libvirt" do |libvirt|
|
||||
libvirt.cpus = CPUS
|
||||
libvirt.memory = MEMORY
|
||||
end
|
||||
|
||||
# No need to copy tox.ini folder to nodes to execute test cases
|
||||
config.vm.synced_folder TOX_INI_DIR, "/vagrant", type: "rsync",
|
||||
rsync__exclude: [".tox/"]
|
||||
|
||||
config.vm.provision "ansible" do |ansible|
|
||||
ansible.playbook = "resolv_conf.yaml"
|
||||
end
|
||||
|
||||
config.vm.provision "ansible" do |ansible|
|
||||
ansible.playbook = "tox-py38.yaml"
|
||||
end
|
||||
|
||||
end
|
3
roles/python/ansible.cfg
Normal file
3
roles/python/ansible.cfg
Normal file
@ -0,0 +1,3 @@
|
||||
[default]
|
||||
# human-readable stdout/stderr results display
|
||||
stdout_callback = debug
|
31
roles/python/defaults/main.yaml
Normal file
31
roles/python/defaults/main.yaml
Normal file
@ -0,0 +1,31 @@
|
||||
python_release: "3.8.0"
|
||||
python_version: "3.8"
|
||||
python_command: "python{{ python_version }}"
|
||||
python_name: "Python-{{ python_release }}"
|
||||
python_prefix: "/opt/{{ python_name }}"
|
||||
python_executable: "{{ python_prefix }}/bin/{{ python_command }}"
|
||||
python_url: "https://www.python.org/ftp/python/{{ python_release }}/{{ python_name }}.tgz"
|
||||
python_tar: "{{ ansible_env.HOME }}/{{ python_url | basename }}"
|
||||
python_src_dir: "{{ ansible_env.HOME }}/{{ python_name }}"
|
||||
|
||||
pip_command: "pip{{ python_version }}"
|
||||
pip_executable: "{{ python_prefix }}/bin/{{ pip_command }}"
|
||||
pip_url: "https://bootstrap.pypa.io/get-pip.py"
|
||||
pip_installer: "{{ ansible_env.HOME }}/{{ pip_url | basename }}"
|
||||
|
||||
profile_file: "/etc/profile.d/{{ python_name }}.sh"
|
||||
make_jobs: "{{ ansible_processor_vcpus }}"
|
||||
|
||||
yum_install_packages:
|
||||
- "@Development tools"
|
||||
- zlib-devel
|
||||
- openssl-devel
|
||||
- bzip2-devel
|
||||
- libffi-devel
|
||||
|
||||
pip_install_base_packages:
|
||||
- setuptools
|
||||
- pip
|
||||
- wheel
|
||||
|
||||
pip_install_packages: []
|
13
roles/python/resolv_conf.yaml
Normal file
13
roles/python/resolv_conf.yaml
Normal file
@ -0,0 +1,13 @@
|
||||
---
|
||||
|
||||
- hosts: all
|
||||
tasks:
|
||||
- name: Copy /etc/resolv.conf
|
||||
become: yes
|
||||
become_user: root
|
||||
copy:
|
||||
src: /etc/resolv.conf
|
||||
dest: /etc/resolv.conf
|
||||
owner: root
|
||||
group: root
|
||||
mode: '0644'
|
105
roles/python/tasks/main.yaml
Normal file
105
roles/python/tasks/main.yaml
Normal file
@ -0,0 +1,105 @@
|
||||
---
|
||||
|
||||
- block:
|
||||
- name: check '{{ python_executable }}' is installed
|
||||
shell: |
|
||||
'{{ python_executable }}' --version 2>&1 | \
|
||||
grep 'Python {{ python_version}}'
|
||||
changed_when: false
|
||||
|
||||
rescue:
|
||||
- name: install '{{ python_name }}' build requeirements
|
||||
become: yes
|
||||
become_user: root
|
||||
yum:
|
||||
state: present
|
||||
name: '{{ yum_install_packages }}'
|
||||
when: "(yum_install_packages | length) > 0"
|
||||
|
||||
- name: download '{{ python_name }}' from '{{ python_url }}'
|
||||
get_url:
|
||||
url: "{{ python_url }}"
|
||||
dest: "{{ python_tar }}"
|
||||
|
||||
- name: ensure '{{ python_src_dir | dirname }}' directory exists
|
||||
file:
|
||||
path: '{{ python_src_dir }}'
|
||||
state: directory
|
||||
|
||||
- name: extract '{{ python_tar | basename }}' into '{{ python_src_dir }}'
|
||||
unarchive:
|
||||
src: '{{ python_tar }}'
|
||||
dest: '{{ python_src_dir | dirname }}'
|
||||
remote_src: yes
|
||||
|
||||
- name: configure '{{ python_name }}'
|
||||
command:
|
||||
cmd: './configure "--prefix={{ python_prefix }}"'
|
||||
chdir: '{{ python_src_dir }}'
|
||||
|
||||
- name: compile '{{ python_name }}'
|
||||
command:
|
||||
cmd: 'make -j {{ make_jobs }}'
|
||||
chdir: '{{ python_src_dir }}'
|
||||
|
||||
- name: install '{{ python_name }}'
|
||||
become: yes
|
||||
become_user: root
|
||||
command:
|
||||
cmd: 'make install'
|
||||
chdir: '{{ python_src_dir }}'
|
||||
|
||||
- name: check '{{ python_executable }}' is installed
|
||||
shell: |
|
||||
'{{ python_executable }}' --version 2>&1 | \
|
||||
grep 'Python {{ python_version}}'
|
||||
changed_when: false
|
||||
|
||||
|
||||
- block:
|
||||
- name: check '{{ pip_executable }}' is installed
|
||||
command: "'{{ pip_executable }}' --version"
|
||||
changed_when: false
|
||||
|
||||
rescue:
|
||||
|
||||
|
||||
- name: download Pip installer from '{{ pip_url }}'
|
||||
get_url:
|
||||
url: "{{ pip_url }}"
|
||||
dest: "{{ pip_installer }}"
|
||||
|
||||
- name: "Install '{{ pip_executable }}'"
|
||||
become: yes
|
||||
become_user: root
|
||||
command: "'{{ python_executable }}' '{{ pip_installer }}'"
|
||||
|
||||
- name: check Pip is installed for '{{ pip_executable }}'
|
||||
command: "'{{ pip_executable }}' --version"
|
||||
changed_when: false
|
||||
|
||||
|
||||
- name: "ensure base Python packages are installed and up-to-date"
|
||||
become: true
|
||||
become_user: root
|
||||
pip:
|
||||
executable: '{{ pip_executable }}'
|
||||
state: latest
|
||||
name: "{{ item }}"
|
||||
vars:
|
||||
ansible_python_interpreter: '{{ python_executable }}'
|
||||
when: (item | length ) > 0
|
||||
loop:
|
||||
- "{{ pip_install_base_packages }}"
|
||||
- "{{ pip_install_packages }}"
|
||||
|
||||
|
||||
- name: add '{{ profile_file }}'
|
||||
become: yes
|
||||
become_user: root
|
||||
template:
|
||||
src: profile.sh.j2
|
||||
dest: '{{ profile_file }}'
|
||||
owner: root
|
||||
group: root
|
||||
mode: '0644'
|
1
roles/python/templates/profile.sh.j2
Normal file
1
roles/python/templates/profile.sh.j2
Normal file
@ -0,0 +1 @@
|
||||
PATH={{ python_executable | dirname }}:$PATH
|
42
roles/python/tox-py38.yaml
Normal file
42
roles/python/tox-py38.yaml
Normal file
@ -0,0 +1,42 @@
|
||||
---
|
||||
|
||||
- hosts: all
|
||||
roles:
|
||||
- role: .
|
||||
vars:
|
||||
python_version: "3.8"
|
||||
python_release: "3.8.0"
|
||||
pip_install_packages:
|
||||
- virtualenv
|
||||
- tox
|
||||
|
||||
tasks:
|
||||
- name: run test cases
|
||||
shell:
|
||||
cmd: tox -e py38
|
||||
chdir: /vagrant
|
||||
register: run_test_cases
|
||||
ignore_errors: true
|
||||
|
||||
- name: produce test reports
|
||||
shell:
|
||||
cmd: tox -e report 2>&1
|
||||
chdir: /vagrant
|
||||
|
||||
- name: get test reports
|
||||
fetch:
|
||||
src: "/vagrant/{{ item }}"
|
||||
dest: "{{ playbook_dir }}/tox-py38/{{ inventory_hostname }}/{{ item }}"
|
||||
flat: yes
|
||||
loop:
|
||||
- tobiko_results.html
|
||||
|
||||
- name: check test cases result
|
||||
assert:
|
||||
that: run_test_cases.rc == 0
|
||||
fail_msg: |
|
||||
Test cases failed
|
||||
{{ run_test_cases.stdout }}
|
||||
success_msg: |
|
||||
Test cases passed
|
||||
{{ run_test_cases.stdout }}
|
Loading…
Reference in New Issue
Block a user