mirror of
https://github.com/geerlingguy/ansible-role-ansible.git
synced 2024-11-22 11:35:11 +01:00
Switch tests to use Molecule.
This commit is contained in:
parent
cfeb18a90f
commit
130efa010e
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,2 +1,3 @@
|
||||
*.retry
|
||||
tests/test.sh
|
||||
*/__pycache__
|
||||
*.pyc
|
||||
|
38
.travis.yml
38
.travis.yml
@ -1,29 +1,29 @@
|
||||
---
|
||||
language: python
|
||||
services: docker
|
||||
|
||||
env:
|
||||
- distro: centos7
|
||||
- distro: centos6
|
||||
- distro: fedora27
|
||||
- distro: ubuntu1604
|
||||
- distro: ubuntu1404
|
||||
- distro: ubuntu1204
|
||||
- distro: debian8
|
||||
global:
|
||||
- ROLE_NAME: ansible
|
||||
matrix:
|
||||
- MOLECULE_DISTRO: centos7
|
||||
- MOLECULE_DISTRO: fedora27
|
||||
- MOLECULE_DISTRO: ubuntu1804
|
||||
- MOLECULE_DISTRO: debian9
|
||||
|
||||
install:
|
||||
# Install test dependencies.
|
||||
- pip install molecule docker
|
||||
|
||||
before_script:
|
||||
# Use actual Ansible Galaxy role name for the project directory.
|
||||
- cd ../
|
||||
- mv ansible-role-$ROLE_NAME geerlingguy.$ROLE_NAME
|
||||
- cd geerlingguy.$ROLE_NAME
|
||||
|
||||
script:
|
||||
# Configure test script so we can run extra tests after playbook is run.
|
||||
- export container_id=$(date +%s)
|
||||
- export cleanup=false
|
||||
|
||||
# Download test shim.
|
||||
- wget -O ${PWD}/tests/test.sh https://gist.githubusercontent.com/geerlingguy/73ef1e5ee45d8694570f334be385e181/raw/
|
||||
- chmod +x ${PWD}/tests/test.sh
|
||||
|
||||
# Run tests.
|
||||
- ${PWD}/tests/test.sh
|
||||
|
||||
# Ensure Ansible is installed (contrived... since it's already installed).
|
||||
- 'docker exec --tty ${container_id} env TERM=xterm ansible --version'
|
||||
- molecule test
|
||||
|
||||
notifications:
|
||||
webhooks: https://galaxy.ansible.com/api/v1/notifications/
|
||||
|
25
molecule/default/molecule.yml
Normal file
25
molecule/default/molecule.yml
Normal file
@ -0,0 +1,25 @@
|
||||
---
|
||||
dependency:
|
||||
name: galaxy
|
||||
driver:
|
||||
name: docker
|
||||
lint:
|
||||
name: yamllint
|
||||
platforms:
|
||||
- name: instance
|
||||
image: geerlingguy/docker-${MOLECULE_DISTRO:-centos7}-ansible
|
||||
command: ${MOLECULE_DOCKER_COMMAND:-"sleep infinity"}
|
||||
privileged: true
|
||||
pre_build_image: true
|
||||
provisioner:
|
||||
name: ansible
|
||||
lint:
|
||||
name: ansible-lint
|
||||
playbooks:
|
||||
converge: ${MOLECULE_PLAYBOOK:-playbook.yml}
|
||||
scenario:
|
||||
name: default
|
||||
verifier:
|
||||
name: testinfra
|
||||
lint:
|
||||
name: flake8
|
7
molecule/default/playbook.yml
Normal file
7
molecule/default/playbook.yml
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
- name: Converge
|
||||
hosts: all
|
||||
become: true
|
||||
|
||||
roles:
|
||||
- role: geerlingguy.ansible
|
14
molecule/default/tests/test_default.py
Normal file
14
molecule/default/tests/test_default.py
Normal file
@ -0,0 +1,14 @@
|
||||
import os
|
||||
|
||||
import testinfra.utils.ansible_runner
|
||||
|
||||
testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
|
||||
os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all')
|
||||
|
||||
|
||||
def test_hosts_file(host):
|
||||
f = host.file('/etc/hosts')
|
||||
|
||||
assert f.exists
|
||||
assert f.user == 'root'
|
||||
assert f.group == 'root'
|
96
tests/test.sh
Executable file
96
tests/test.sh
Executable file
@ -0,0 +1,96 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Ansible role test shim.
|
||||
#
|
||||
# Usage: [OPTIONS] ./tests/test.sh
|
||||
# - distro: a supported Docker distro version (default = "centos7")
|
||||
# - playbook: a playbook in the tests directory (default = "test.yml")
|
||||
# - cleanup: whether to remove the Docker container (default = true)
|
||||
# - container_id: the --name to set for the container (default = timestamp)
|
||||
|
||||
# Exit on any individual command failure.
|
||||
set -e
|
||||
|
||||
# Pretty colors.
|
||||
red='\033[0;31m'
|
||||
green='\033[0;32m'
|
||||
neutral='\033[0m'
|
||||
|
||||
timestamp=$(date +%s)
|
||||
|
||||
# Allow environment variables to override defaults.
|
||||
distro=${distro:-"centos7"}
|
||||
playbook=${playbook:-"test.yml"}
|
||||
cleanup=${cleanup:-"true"}
|
||||
container_id=${container_id:-$timestamp}
|
||||
|
||||
## Set up vars for Docker setup.
|
||||
# CentOS 7
|
||||
if [ $distro = 'centos7' ]; then
|
||||
init="/usr/lib/systemd/systemd"
|
||||
opts="--privileged --volume=/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
||||
# CentOS 6
|
||||
elif [ $distro = 'centos6' ]; then
|
||||
init="/sbin/init"
|
||||
opts=""
|
||||
# Ubuntu 16.04
|
||||
elif [ $distro = 'ubuntu1604' ]; then
|
||||
init="/lib/systemd/systemd"
|
||||
opts="--privileged --volume=/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
||||
# Ubuntu 14.04
|
||||
elif [ $distro = 'ubuntu1404' ]; then
|
||||
init="/sbin/init"
|
||||
opts=""
|
||||
# Ubuntu 12.04
|
||||
elif [ $distro = 'ubuntu1204' ]; then
|
||||
init="/sbin/init"
|
||||
opts=""
|
||||
# Debian 8
|
||||
elif [ $distro = 'debian8' ]; then
|
||||
init="/lib/systemd/systemd"
|
||||
opts="--privileged --volume=/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
||||
# Fedora 24
|
||||
elif [ $distro = 'fedora24' ]; then
|
||||
init="/usr/lib/systemd/systemd"
|
||||
opts="--privileged --volume=/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
||||
fi
|
||||
|
||||
# Run the container using the supplied OS.
|
||||
printf ${green}"Starting Docker container: geerlingguy/docker-$distro-ansible."${neutral}"\n"
|
||||
docker pull geerlingguy/docker-$distro-ansible:latest
|
||||
docker run --detach --volume="$PWD":/etc/ansible/roles/role_under_test:rw --name $container_id $opts geerlingguy/docker-$distro-ansible:latest $init
|
||||
|
||||
printf "\n"
|
||||
|
||||
# Install requirements if `requirements.yml` is present.
|
||||
if [ -f "$PWD/tests/requirements.yml" ]; then
|
||||
printf ${green}"Requirements file detected; installing dependencies."${neutral}"\n"
|
||||
docker exec --tty $container_id env TERM=xterm ansible-galaxy install -r /etc/ansible/roles/role_under_test/tests/requirements.yml
|
||||
fi
|
||||
|
||||
printf "\n"
|
||||
|
||||
# Test Ansible syntax.
|
||||
printf ${green}"Checking Ansible playbook syntax."${neutral}
|
||||
docker exec --tty $container_id env TERM=xterm ansible-playbook /etc/ansible/roles/role_under_test/tests/$playbook --syntax-check
|
||||
|
||||
printf "\n"
|
||||
|
||||
# Run Ansible playbook.
|
||||
printf ${green}"Running command: docker exec $container_id env TERM=xterm ansible-playbook /etc/ansible/roles/role_under_test/tests/$playbook"${neutral}
|
||||
docker exec $container_id env TERM=xterm env ANSIBLE_FORCE_COLOR=1 ansible-playbook /etc/ansible/roles/role_under_test/tests/$playbook
|
||||
|
||||
# Run Ansible playbook again (idempotence test).
|
||||
printf ${green}"Running playbook again: idempotence test"${neutral}
|
||||
idempotence=$(mktemp)
|
||||
docker exec $container_id ansible-playbook /etc/ansible/roles/role_under_test/tests/$playbook | tee -a $idempotence
|
||||
tail $idempotence \
|
||||
| grep -q 'changed=0.*failed=0' \
|
||||
&& (printf ${green}'Idempotence test: pass'${neutral}"\n") \
|
||||
|| (printf ${red}'Idempotence test: fail'${neutral}"\n" && exit 1)
|
||||
|
||||
# Remove the Docker container (if configured).
|
||||
if [ "$cleanup" = true ]; then
|
||||
printf "Removing Docker container...\n"
|
||||
docker rm -f $container_id
|
||||
fi
|
Loading…
Reference in New Issue
Block a user