From 666b6a434c35a19f293f77eb1e53808b94cf189f Mon Sep 17 00:00:00 2001 From: pkrupa Date: Wed, 21 Mar 2018 12:17:45 +0100 Subject: [PATCH 1/6] add molecule and testinfra test suite --- .molecule/ansible.cfg | 16 +++++++++++ .molecule/ansible_inventory | 5 ++++ .molecule/rakefile | 30 ++++++++++++++++++++ .molecule/state.yml | 18 ++++++++++++ .travis.yml | 39 ++++++++++---------------- .travis/images.sh | 7 +++++ Vagrantfile | 32 --------------------- molecule.yml | 43 +++++++++++++++++++++++++++++ tests/inventory | 1 - tests/playbook.yml | 11 ++++++++ tests/test.yml | 6 ---- tests/test_default.py | 55 +++++++++++++++++++++++++++++++++++++ tests/vagrant.yml | 24 ---------------- 13 files changed, 200 insertions(+), 87 deletions(-) create mode 100644 .molecule/ansible.cfg create mode 100644 .molecule/ansible_inventory create mode 100644 .molecule/rakefile create mode 100644 .molecule/state.yml create mode 100755 .travis/images.sh delete mode 100644 Vagrantfile create mode 100644 molecule.yml delete mode 100644 tests/inventory create mode 100644 tests/playbook.yml delete mode 100644 tests/test.yml create mode 100644 tests/test_default.py delete mode 100644 tests/vagrant.yml diff --git a/.molecule/ansible.cfg b/.molecule/ansible.cfg new file mode 100644 index 0000000..4c598b5 --- /dev/null +++ b/.molecule/ansible.cfg @@ -0,0 +1,16 @@ +# Molecule managed + +[defaults] +roles_path = .molecule/roles/:.molecule/../roles/:../:../../ +library = .molecule/library/:library/ +action_plugins = .molecule/plugins/actions/:plugins/actions/ +callback_plugins = .molecule/plugins/callbacks/:plugins/callbacks/ +connection_plugins = .molecule/plugins/connections/:plugins/connections/ +lookup_plugins = .molecule/plugins/lookups/:plugins/lookups/ +vars_plugins = .molecule/plugins/vars/:plugins/vars/ +filter_plugins = .molecule/plugins/filters/:plugins/filters/ +ansible_managed = Ansible managed: Do NOT edit this file manually! +nocows = 1 +retry_files_enabled = False + +[ssh_connection] diff --git a/.molecule/ansible_inventory b/.molecule/ansible_inventory new file mode 100644 index 0000000..dc5d291 --- /dev/null +++ b/.molecule/ansible_inventory @@ -0,0 +1,5 @@ +[all] +xenial ansible_connection=docker +stretch ansible_connection=docker +jessie ansible_connection=docker +centos7 ansible_connection=docker diff --git a/.molecule/rakefile b/.molecule/rakefile new file mode 100644 index 0000000..301d5a0 --- /dev/null +++ b/.molecule/rakefile @@ -0,0 +1,30 @@ +# Molecule managed + +require 'rake' +require 'rspec/core/rake_task' +require 'yaml' +require 'fileutils' + +task spec: 'serverspec:all' +task default: :spec + +hosts = YAML.load_file('.molecule/state.yml')['hosts'] + +namespace :serverspec do + task all: hosts.keys + hosts.each do |name, host| + desc "Run serverspec on #{name}" + pattern = ['spec/*_spec.rb', "spec/#{name}/*_spec.rb", "spec/hosts/#{name}/*_spec.rb"] + + host['groups'].each do |group| + pattern << "spec/#{group}/*_spec.rb" + pattern << "spec/groups/#{group}/*_spec.rb" + end + + RSpec::Core::RakeTask.new(name.to_sym) do |target| + puts "*** Run serverspec on #{name} ***" + ENV['TARGET_HOST'] = name + target.pattern = pattern.join(',') + end + end +end diff --git a/.molecule/state.yml b/.molecule/state.yml new file mode 100644 index 0000000..18a779c --- /dev/null +++ b/.molecule/state.yml @@ -0,0 +1,18 @@ +--- +converged: null +created: true +default_platform: null +default_provider: null +driver: docker +driver_config: {} +hosts: + centos7: + groups: [] + jessie: + groups: [] + stretch: + groups: [] + xenial: + groups: [] +installed_deps: true +multiple_platforms: null diff --git a/.travis.yml b/.travis.yml index 49e7e1c..badbc0f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,29 +1,20 @@ ---- +sudo: required language: python -python: "2.7" - -# Use the new container infrastructure -sudo: false - -# Install ansible -addons: - apt: - packages: - - python-pip - +cache: pip +services: + - docker +env: + - ANSIBLE=2.2.3 + - ANSIBLE=2.3.2 + - ANSIBLE=2.4.2 install: - # Install ansible - - pip install ansible - - # Check ansible version - - ansible --version - - # Create ansible.cfg with correct roles_path - - printf '[defaults]\nroles_path=../' >ansible.cfg - + - pip install ansible==${ANSIBLE} ansible-lint>=3.4.15 molecule==1.25.0 docker git-semver testinfra>=1.7.0 +before_script: + - ansible-lint tests/playbook.yml script: - # Basic role syntax check - - ansible-playbook tests/test.yml -i tests/inventory --syntax-check - + - molecule test +branches: + only: + - master notifications: webhooks: https://galaxy.ansible.com/api/v1/notifications/ diff --git a/.travis/images.sh b/.travis/images.sh new file mode 100755 index 0000000..20395a7 --- /dev/null +++ b/.travis/images.sh @@ -0,0 +1,7 @@ +#!/bin/bash +for i in ubuntu-molecule:16.04 debian-molecule:9 debian-molecule:8 centos-molecule:7 fedora-molecule:27 +do + docker pull paulfantom/$i & +done + +wait diff --git a/Vagrantfile b/Vagrantfile deleted file mode 100644 index 290859e..0000000 --- a/Vagrantfile +++ /dev/null @@ -1,32 +0,0 @@ -# -*- mode: ruby -*- -# vi: set ft=ruby : - -Vagrant.configure(2) do |config| - config.vm.provider "virtualbox" do |vb| - vb.memory = "512" - end - - config.vm.define "centos-7" do |machine| - machine.vm.box = "minimal/centos7" - machine.vm.provision "shell", inline: "yum update -y" - machine.vm.provision "ansible" do |ansible| - ansible.playbook = "tests/vagrant.yml" - end - end - - config.vm.define "debian-jessie" do |machine| - machine.vm.box = "minimal/jessie64" - machine.vm.provision "shell", inline: "apt-get update && apt-get install -y python" - machine.vm.provision "ansible" do |ansible| - ansible.playbook = "tests/vagrant.yml" - end - end - - config.vm.define "ubuntu-xenial" do |machine| - machine.vm.box = "ubuntu/xenial64" - machine.vm.provision "shell", inline: "apt-get update && apt-get install -y python" - machine.vm.provision "ansible" do |ansible| - ansible.playbook = "tests/vagrant.yml" - end - end -end diff --git a/molecule.yml b/molecule.yml new file mode 100644 index 0000000..ff1f1af --- /dev/null +++ b/molecule.yml @@ -0,0 +1,43 @@ +--- +ansible: + playbook: tests/playbook.yml +driver: + name: docker +verifier: + name: testinfra +dependency: + name: shell + command: ./.travis/images.sh +docker: + build_image: False + containers: + - name: xenial + image: paulfantom/ubuntu-molecule + image_version: 16.04 + privileged: true + volume_mounts: + - /sys/fs/cgroup:/sys/fs/cgroup:ro + - name: stretch + image: paulfantom/debian-molecule + image_version: 9 + privileged: true + volume_mounts: + - /sys/fs/cgroup:/sys/fs/cgroup:ro + - name: jessie + image: paulfantom/debian-molecule + image_version: 8 + privileged: true + volume_mounts: + - /sys/fs/cgroup:/sys/fs/cgroup:ro + - name: centos7 + image: paulfantom/centos-molecule + image_version: 7 + privileged: true + volume_mounts: + - /sys/fs/cgroup:/sys/fs/cgroup:ro +# - name: fedora +# image: paulfantom/fedora-molecule +# image_version: 27 +# privileged: true +# volume_mounts: +# - /sys/fs/cgroup:/sys/fs/cgroup:ro diff --git a/tests/inventory b/tests/inventory deleted file mode 100644 index d18580b..0000000 --- a/tests/inventory +++ /dev/null @@ -1 +0,0 @@ -localhost \ No newline at end of file diff --git a/tests/playbook.yml b/tests/playbook.yml new file mode 100644 index 0000000..23a7fca --- /dev/null +++ b/tests/playbook.yml @@ -0,0 +1,11 @@ +--- +- hosts: all + become: yes + roles: + - ansible-role-docker + vars: + default_docker_config: + storage-driver: vfs + log-level: info + + diff --git a/tests/test.yml b/tests/test.yml deleted file mode 100644 index 352cff1..0000000 --- a/tests/test.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -- hosts: localhost - become: yes - become_user: root - roles: - - . diff --git a/tests/test_default.py b/tests/test_default.py new file mode 100644 index 0000000..cae0c54 --- /dev/null +++ b/tests/test_default.py @@ -0,0 +1,55 @@ +from testinfra.utils.ansible_runner import AnsibleRunner + +testinfra_hosts = AnsibleRunner('.molecule/ansible_inventory').get_hosts('all') + + +def test_directories(host): + present = [ + "/etc/docker", + ] + absent = [] + if present: + for directory in present: + d = host.file(directory) + assert d.is_directory + assert d.exists + if absent: + for directory in absent: + d = host.file(directory) + assert not d.exists + + +def test_files(host): + present = [ + "/etc/docker/daemon.json", + ] + if present: + for file in present: + f = host.file(file) + assert f.exists + assert f.is_file + + +# def test_socket(host): +# assert host.socket("unix:///var/run/docker.sock").is_listening + + +def test_service(host): + present = [ + "docker" + ] + if present: + for service in present: + s = host.service(service) + assert s.is_running + assert s.is_enabled + + +def test_packages(host): + if host.system_info.distribution == 'ol': + DOCKER = 'docker-engine' + else: + DOCKER = 'docker-ce' + + assert host.package(DOCKER).is_installed + diff --git a/tests/vagrant.yml b/tests/vagrant.yml deleted file mode 100644 index a0af3bf..0000000 --- a/tests/vagrant.yml +++ /dev/null @@ -1,24 +0,0 @@ ---- -- hosts: all - become: yes - become_user: root - vars: - docker_clusterstore: yes - vagrant: yes - roles: - - ../docker - tasks: - - name: check consul state - command: docker ps -q -f name=consul - register: consulcheck - changed_when: no - - - name: ensure consul is running - command: > - docker run \ - -d \ - --name consul \ - -p "8500:8500" \ - --restart always \ - progrium/consul -server -bootstrap - when: consulcheck.stdout_lines | length == 0 From 3dafd33fc6b21347705df32546fad1cd4bb53f8b Mon Sep 17 00:00:00 2001 From: pkrupa Date: Wed, 21 Mar 2018 12:22:02 +0100 Subject: [PATCH 2/6] comment-out not working envs --- molecule.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/molecule.yml b/molecule.yml index ff1f1af..d7192b9 100644 --- a/molecule.yml +++ b/molecule.yml @@ -17,24 +17,24 @@ docker: privileged: true volume_mounts: - /sys/fs/cgroup:/sys/fs/cgroup:ro - - name: stretch - image: paulfantom/debian-molecule - image_version: 9 - privileged: true - volume_mounts: - - /sys/fs/cgroup:/sys/fs/cgroup:ro +# - name: stretch +# image: paulfantom/debian-molecule +# image_version: 9 +# privileged: true +# volume_mounts: +# - /sys/fs/cgroup:/sys/fs/cgroup:ro - name: jessie image: paulfantom/debian-molecule image_version: 8 privileged: true volume_mounts: - /sys/fs/cgroup:/sys/fs/cgroup:ro - - name: centos7 - image: paulfantom/centos-molecule - image_version: 7 - privileged: true - volume_mounts: - - /sys/fs/cgroup:/sys/fs/cgroup:ro +# - name: centos7 +# image: paulfantom/centos-molecule +# image_version: 7 +# privileged: true +# volume_mounts: +# - /sys/fs/cgroup:/sys/fs/cgroup:ro # - name: fedora # image: paulfantom/fedora-molecule # image_version: 27 From f6ec780a0152a842be3bd9e306f86485a8492da8 Mon Sep 17 00:00:00 2001 From: paulfantom Date: Sun, 25 Mar 2018 16:05:15 +0200 Subject: [PATCH 3/6] use systemd module to reload config; make linter happy --- .gitignore | 4 ++++ .molecule/ansible.cfg | 16 ---------------- .molecule/ansible_inventory | 5 ----- .molecule/rakefile | 30 ------------------------------ .molecule/state.yml | 18 ------------------ handlers/main.yml | 3 ++- tasks/install.yml | 7 +++++-- tests/playbook.yml | 2 -- tests/test_default.py | 1 - 9 files changed, 11 insertions(+), 75 deletions(-) delete mode 100644 .molecule/ansible.cfg delete mode 100644 .molecule/ansible_inventory delete mode 100644 .molecule/rakefile delete mode 100644 .molecule/state.yml diff --git a/.gitignore b/.gitignore index bccdf40..90dfd6d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,9 @@ # Ignore Vagrant cache files /.vagrant/ +# Ignore molecule and pytest files +**__pycache__** +.molecule + # Ignore retry files *.retry diff --git a/.molecule/ansible.cfg b/.molecule/ansible.cfg deleted file mode 100644 index 4c598b5..0000000 --- a/.molecule/ansible.cfg +++ /dev/null @@ -1,16 +0,0 @@ -# Molecule managed - -[defaults] -roles_path = .molecule/roles/:.molecule/../roles/:../:../../ -library = .molecule/library/:library/ -action_plugins = .molecule/plugins/actions/:plugins/actions/ -callback_plugins = .molecule/plugins/callbacks/:plugins/callbacks/ -connection_plugins = .molecule/plugins/connections/:plugins/connections/ -lookup_plugins = .molecule/plugins/lookups/:plugins/lookups/ -vars_plugins = .molecule/plugins/vars/:plugins/vars/ -filter_plugins = .molecule/plugins/filters/:plugins/filters/ -ansible_managed = Ansible managed: Do NOT edit this file manually! -nocows = 1 -retry_files_enabled = False - -[ssh_connection] diff --git a/.molecule/ansible_inventory b/.molecule/ansible_inventory deleted file mode 100644 index dc5d291..0000000 --- a/.molecule/ansible_inventory +++ /dev/null @@ -1,5 +0,0 @@ -[all] -xenial ansible_connection=docker -stretch ansible_connection=docker -jessie ansible_connection=docker -centos7 ansible_connection=docker diff --git a/.molecule/rakefile b/.molecule/rakefile deleted file mode 100644 index 301d5a0..0000000 --- a/.molecule/rakefile +++ /dev/null @@ -1,30 +0,0 @@ -# Molecule managed - -require 'rake' -require 'rspec/core/rake_task' -require 'yaml' -require 'fileutils' - -task spec: 'serverspec:all' -task default: :spec - -hosts = YAML.load_file('.molecule/state.yml')['hosts'] - -namespace :serverspec do - task all: hosts.keys - hosts.each do |name, host| - desc "Run serverspec on #{name}" - pattern = ['spec/*_spec.rb', "spec/#{name}/*_spec.rb", "spec/hosts/#{name}/*_spec.rb"] - - host['groups'].each do |group| - pattern << "spec/#{group}/*_spec.rb" - pattern << "spec/groups/#{group}/*_spec.rb" - end - - RSpec::Core::RakeTask.new(name.to_sym) do |target| - puts "*** Run serverspec on #{name} ***" - ENV['TARGET_HOST'] = name - target.pattern = pattern.join(',') - end - end -end diff --git a/.molecule/state.yml b/.molecule/state.yml deleted file mode 100644 index 18a779c..0000000 --- a/.molecule/state.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- -converged: null -created: true -default_platform: null -default_provider: null -driver: docker -driver_config: {} -hosts: - centos7: - groups: [] - jessie: - groups: [] - stretch: - groups: [] - xenial: - groups: [] -installed_deps: true -multiple_platforms: null diff --git a/handlers/main.yml b/handlers/main.yml index e1c0207..e2c74b0 100644 --- a/handlers/main.yml +++ b/handlers/main.yml @@ -1,7 +1,8 @@ --- - name: reload unit become: true - command: systemctl daemon-reload + systemd: + daemon_reload: yes when: - ansible_service_mgr == "systemd" diff --git a/tasks/install.yml b/tasks/install.yml index 89c6fd3..315f152 100644 --- a/tasks/install.yml +++ b/tasks/install.yml @@ -1,6 +1,7 @@ --- -- set_fact: +- name: Compose md5 checksum + set_fact: setup_script_checksum: "md5:{{ setup_script_md5_sum }}" when: setup_script_md5_sum is defined and setup_script_md5_sum @@ -12,4 +13,6 @@ mode: 0755 - name: Execute docker setup script - shell: "/tmp/docker-setup.sh" \ No newline at end of file + shell: "/tmp/docker-setup.sh" + tags: + - skip_ansible_lint diff --git a/tests/playbook.yml b/tests/playbook.yml index 23a7fca..a3d5cdc 100644 --- a/tests/playbook.yml +++ b/tests/playbook.yml @@ -7,5 +7,3 @@ default_docker_config: storage-driver: vfs log-level: info - - diff --git a/tests/test_default.py b/tests/test_default.py index cae0c54..5e6a256 100644 --- a/tests/test_default.py +++ b/tests/test_default.py @@ -52,4 +52,3 @@ def test_packages(host): DOCKER = 'docker-ce' assert host.package(DOCKER).is_installed - From cd9ed94d39b7ad544ff9560ecf90b4fa8af2f9e1 Mon Sep 17 00:00:00 2001 From: paulfantom Date: Sun, 25 Mar 2018 16:11:49 +0200 Subject: [PATCH 4/6] move to systemd --- handlers/main.yml | 11 +++-------- tasks/main.yml | 10 +--------- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/handlers/main.yml b/handlers/main.yml index e2c74b0..2a1d256 100644 --- a/handlers/main.yml +++ b/handlers/main.yml @@ -1,12 +1,7 @@ --- -- name: reload unit - become: true - systemd: - daemon_reload: yes - when: - - ansible_service_mgr == "systemd" - - name: restart docker - service: + become: yes + systemd: name: docker state: restarted + daemon_reload: yes diff --git a/tasks/main.yml b/tasks/main.yml index 300f091..2a8c4c7 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -48,19 +48,11 @@ src: docker.j2.service dest: /usr/lib/systemd/system/docker.service notify: - - reload unit - restart docker - meta: flush_handlers - name: ensure starts on system boot - service: + systemd: name: docker enabled: yes - -- name: ensure vagrant user can run docker commands - user: - name: vagrant - groups: docker - append: yes - when: vagrant From 458a65dc1103bfa579f558fc463c6391569b05d8 Mon Sep 17 00:00:00 2001 From: paulfantom Date: Sun, 25 Mar 2018 16:47:15 +0200 Subject: [PATCH 5/6] always use latest ansible patch release --- .travis.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index badbc0f..b46aa21 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,11 +4,11 @@ cache: pip services: - docker env: - - ANSIBLE=2.2.3 - - ANSIBLE=2.3.2 - - ANSIBLE=2.4.2 + - ANSIBLE='ansible>=2.2.0,<2.3.0' + - ANSIBLE='ansible>=2.3.0,<2.4.0' + - ANSIBLE='ansible>=2.4.0,<2.5.0' install: - - pip install ansible==${ANSIBLE} ansible-lint>=3.4.15 molecule==1.25.0 docker git-semver testinfra>=1.7.0 + - pip install ${ANSIBLE} ansible-lint>=3.4.15 molecule==1.25.0 docker git-semver testinfra>=1.7.0,<=1.10.1 before_script: - ansible-lint tests/playbook.yml script: From af53c7fe119127fa15f5cc892d5889d24f2317c9 Mon Sep 17 00:00:00 2001 From: paulfantom Date: Sun, 25 Mar 2018 17:08:58 +0200 Subject: [PATCH 6/6] fix pip installation in travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b46aa21..d5a065b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ env: - ANSIBLE='ansible>=2.3.0,<2.4.0' - ANSIBLE='ansible>=2.4.0,<2.5.0' install: - - pip install ${ANSIBLE} ansible-lint>=3.4.15 molecule==1.25.0 docker git-semver testinfra>=1.7.0,<=1.10.1 + - pip install ${ANSIBLE} 'ansible-lint>=3.4.15' 'molecule==1.25.0' docker git-semver 'testinfra>=1.7.0,<=1.10.1' before_script: - ansible-lint tests/playbook.yml script: