diff --git a/.travis.yml b/.travis.yml index 44182f6d..8983c1b1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,6 +14,6 @@ install: - pip install ansible-lint script: - - cp ${PWD}/tests/all.yml.test ${PWD}/group_vars/test.yml + - cp ${PWD}/tests/test.yml ${PWD}/group_vars/all.yml - ansible-lint ${PWD}/nas.yml - ${PWD}/tests/test.sh \ No newline at end of file diff --git a/README.md b/README.md index 7b68eb1d..77d4c497 100644 --- a/README.md +++ b/README.md @@ -102,8 +102,9 @@ Getting help is easy! You can: Contributions are welcome, please feel free to raise a PR! -- Please restrict pull requests to one piece of functionality or bugfix at a time. -- Please run `ansible-lint` against the playbook before committing. (There is a VSCode task set up to run the right command for you) +- Restrict pull requests to one piece of functionality or bugfix at a time. +- Test your new functionality or bugfix using the included `tests/test-vagrant.sh` script to spin up a test VM. +- Run `ansible-lint` against the playbook before committing. (There is a VSCode task set up to run the right command for you) - Please know that your efforts are appreciated, thanks! :+1: Development of Ansible-NAS is carried out in [Visual Studio Code](https://code.visualstudio.com/) - you'll get some nice diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 00000000..5ae1fdf5 --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,18 @@ +Vagrant.require_version ">= 1.7.0" + +Vagrant.configure(2) do |config| + config.vm.box = "ubuntu/bionic64" + + config.ssh.insert_key = false + config.vm.network "private_network", ip: "172.30.1.5" + + + config.vm.provision "ansible_local" do |ansible| + ansible.galaxy_role_file = "requirements.yml" + ansible.playbook = "nas.yml" + ansible.become = true + ansible.raw_arguments = [ + "--extra-vars @tests/test.yml" + ] + end +end diff --git a/tests/all.yml.test b/tests/all.yml.test deleted file mode 100644 index 522c18d1..00000000 --- a/tests/all.yml.test +++ /dev/null @@ -1,294 +0,0 @@ -### -### Ansible NAS Features -### -# Set these options to true or false to toggle specific features - -# External Access -# Traefik will allow access to certain applications externally. To enable this you'll need a domain name that points to your -# home static IP address, or use a dynamic DNS provider like no-ip. You'll also need to map ports 80 and 443 from your router -# to your ansible-nas server. -traefik_enabled: true - -# BitTorrent -# If you plan to use Transmission with OpenVPN, you'll need to copy group_vars/vpn_credentials.yml.dist -# to group_vars/vpn_credentials.yml, then update it with your own settings. -transmission_with_openvpn_enabled: false -transmission_enabled: false - -# Plex -plex_enabled: false -tautulli_enabled: false - -# Emby -emby_enabled: false - -# Media Sourcing -sonarr_enabled: false -sickrage_enabled: false -couchpotato_enabled: false -radarr_enabled: false - -# System Management -portainer_enabled: true -glances_enabled: true -stats_enabled: false -guacamole_enabled: false - -# Backup & Restore -duplicati_enabled: true -nextcloud_enabled: false -gitea_enabled: false - -# IRC bouncer -znc_enabled: false - - -### -### General -### -# Sets the hostname of your Ansible NAS -ansible_nas_hostname: ansible-nas-test - -# Sets the timezone for your Ansible NAS -# You can find a list here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones -ansible_nas_timezone: Etc/UTC - -# Update all apt packages when playbook is run -keep_packages_updated: false - -# Will be added to the docker group to give user command line access to docker -ansible_nas_user: david - -# Your email and domain, used for LetsEncrypt SSL certs -ansible_nas_email: me@example.com - -# Applications will have subdomain SSL certificates created, eg ansible-nas., nextcloud. -ansible_nas_domain: example.com - -### -### Docker -### -# Where you want Docker to store its images and container data. -docker_home: /mnt/Volume2/docker - -# Docker storage driver, see https://docs.docker.com/storage/storagedriver/select-storage-driver/#supported-backing-filesystems -# You'll need to change this if your docker_home isn't on zfs and Docker won't start (you'll probably want overlay2 instead) -docker_storage_driver: overlay2 - -### -### Samba -### -# The location where all shares will be created by default. Can be overridden on a per-share basis. -# This path will be mounted to backup containers, Duplicati -samba_shares_root: /mnt/Volume3 - -# Where stuff downloaded will be stored -downloads_root: "{{ samba_shares_root }}/downloads" - -# Where your movies are stored -movies_root: "{{ samba_shares_root }}/movies" - -# Where your TV episodes are stored -tv_root: "{{ samba_shares_root }}/tv" - -# Where torrent files are stored (picked up by Transmission for downloading) -torrents_root: "{{ samba_shares_root }}/torrents" - -# The account used when Samba shares are accessed. Shouldn't need to change this unless you want to -# mess with Samba user permissions. -samba_guest_account: nobody - -# Shares you want published over Samba. -samba_shares: - - name: downloads - comment: 'Stuff downloaded' - guest_ok: yes - public: yes - writable: yes - path: "{{ downloads_root }}" - - - name: movies - comment: 'Movies' - guest_ok: yes - public: yes - writable: yes - path: "{{ movies_root }}" - - - name: tv - comment: 'TV Episodes' - guest_ok: yes - public: yes - writable: yes - path: "{{ tv_root }}" - - - name: dump - comment: 'File dump' - guest_ok: yes - public: yes - writable: yes - path: "{{ samba_shares_root }}/dump" - - - name: games - comment: 'Games' - guest_ok: yes - public: yes - writable: yes - path: "{{ samba_shares_root }}/games" - - - name: photos - comment: 'Pictures' - guest_ok: yes - public: yes - writable: yes - path: "{{ samba_shares_root }}/photos" - - -################################################################## -###### You shouldn't need to edit anything below this point ###### -################################################################## - -### -### Traefik -### -traefik_docker_image: traefik:1.7 -traefik_data_directory: "{{ docker_home }}/traefik" - -### -### Heimdall -### -heimdall_docker_image: linuxserver/heimdall:latest -heimdall_data_directory: "{{ docker_home }}/heimdall" - -### -### Transmission -### -transmission_config_directory: "{{ docker_home }}/transmission/config" -transmission_download_directory: "{{ downloads_root }}" -transmission_watch_directory: "{{ torrents_root }}" -transmission_user_id: 0 -transmission_group_id: 0 -transmission_local_network: "192.168.1.0/24" - - -### -### Plex -### -plex_config_directory: "{{ docker_home }}/plex/config" -plex_movies_directory: "{{ movies_root }}" -plex_tv_directory: "{{ tv_root }}" -plex_user_id: 0 -plex_group_id: 0 - -### -### Emby -### -emby_config_directory: "{{ docker_home }}/emby/config" -emby_movies_directory: "{{ movies_root }}" -emby_tv_directory: "{{ tv_root }}" -emby_user_id: 0 -emby_group_id: 0 - -### -### Tautulli -### -tautulli_config_directory: "{{ docker_home }}/tautulli/config" -tautulli_user_id: 0 -tautulli_group_id: 0 - - -### -### Duplicati -### -duplicati_data_directory: "{{ docker_home }}/duplicati/config" - - -### -### Sonarr -### -sonarr_data_directory: "{{ docker_home }}/sonarr/config" -sonarr_tv_directory: "{{ tv_root }}" -sonarr_download_directory: "{{ downloads_root }}" -sonarr_user_id: 0 -sonarr_group_id: 0 - - -### -### Radarr -### -radarr_movies_directory: "{{ movies_root }}" -radarr_download_directory: "{{ downloads_root }}" -radarr_data_directory: "{{ docker_home }}/radarr" -radarr_user_id: 0 -radarr_group_id: 0 - - -### -### Couchpotato -### -couchpotato_config_directory: "{{ docker_home }}/couchpotato/config" -couchpotato_movies_directory: "{{ movies_root }}" -couchpotato_downloads_directory: "{{ downloads_root }}" -couchpotato_torrents_directory: "{{ torrents_root }}" -couchpotato_user_id: 0 -couchpotato_group_id: 0 - - -### -### Sickrage -### -sickrage_config_directory: "{{ docker_home }}/sickrage/config" -sickrage_tv_directory: "{{ tv_root }}" -sickrage_downloads_directory: "{{ downloads_root }}" -sickrage_user_id: 0 -sickrage_group_id: 0 - - -### -### OpenVPN -### -openvpn_config_directory: "{{ docker_home }}/openvpn" - - -### -### Portainer -### -portainer_data_directory: "{{ docker_home }}/portainer/config" - - -### -### ZNC -### -znc_data_directory: "{{ docker_home }}/znc" -znc_user_id: 0 -znc_group_id: 0 - - -### -### Stats -### -telegraf_data_directory: "{{ docker_home }}/telegraf" -influxdb_data_directory: "{{ docker_home }}/influxdb" -grafana_data_directory: "{{ docker_home }}/grafana" -stat_collection_interval: 15s - -### -### Gitea -### -gitea_data_directory: "{{ docker_home }}/gitea" - -### -### Nextcloud -### -nextcloud_data_directory: "{{ docker_home }}/nextcloud" - -### -### nginx -### -nginx_data_directory: "{{ docker_home }}/nginx" - -### -### Guacamole -### -guacamole_docker_image: guacamole/guacamole:0.9.14 -guacamole_guacd_docker_image: guacamole/guacd:0.9.14 -guacamole_data_directory: "{{ docker_home }}/guacamole" \ No newline at end of file diff --git a/tests/test-vagrant.sh b/tests/test-vagrant.sh new file mode 100755 index 00000000..71d9cf5e --- /dev/null +++ b/tests/test-vagrant.sh @@ -0,0 +1,46 @@ +#!/bin/bash +DIR=$(dirname "$0") +PLAYBOOK_DIR=$DIR/.. + +header() { + clear + cat << EndOfMessage + ▄▄▄ ███▄ █ ██████ ██▓ ▄▄▄▄ ██▓ ▓█████ ███▄ █ ▄▄▄ ██████ +▒████▄ ██ ▀█ █ ▒██ ▒ ▓██▒▓█████▄ ▓██▒ ▓█ ▀ ██ ▀█ █ ▒████▄ ▒██ ▒ +▒██ ▀█▄ ▓██ ▀█ ██▒░ ▓██▄ ▒██▒▒██▒ ▄██▒██░ ▒███ ▓██ ▀█ ██▒▒██ ▀█▄ ░ ▓██▄ +░██▄▄▄▄██ ▓██▒ ▐▌██▒ ▒ ██▒░██░▒██░█▀ ▒██░ ▒▓█ ▄ ▓██▒ ▐▌██▒░██▄▄▄▄██ ▒ ██▒ + ▓█ ▓██▒▒██░ ▓██░▒██████▒▒░██░░▓█ ▀█▓░██████▒░▒████▒ ▒██░ ▓██░ ▓█ ▓██▒▒██████▒▒ + ▒▒ ▓▒█░░ ▒░ ▒ ▒ ▒ ▒▓▒ ▒ ░░▓ ░▒▓███▀▒░ ▒░▓ ░░░ ▒░ ░ ░ ▒░ ▒ ▒ ▒▒ ▓▒█░▒ ▒▓▒ ▒ ░ + ▒ ▒▒ ░░ ░░ ░ ▒░░ ░▒ ░ ░ ▒ ░▒░▒ ░ ░ ░ ▒ ░ ░ ░ ░ ░ ░░ ░ ▒░ ▒ ▒▒ ░░ ░▒ ░ ░ + ░ ▒ ░ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ▒ ░ ░ ░ + ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ + ░ +EndOfMessage + sleep 5 +} + +log() { + printf "${TIME_FORMAT} %b\n" "$*"; +} + +fatal_error() { + printf "${TIME_FORMAT} \e[41mERROR:\033[0m %b\n" "$*" >&2; + exit 1 +} + +test_needs() { + command -v $1 >/dev/null 2>&1 || fatal_error "Testing Ansible-NAS requires $1 but it's not installed. Please install it and try again." +} + +testing_init() { + log "Checking Vagrant installation" + test_needs vagrant +} + +header +testing_init + +log "Starting Vagrant and running playbook" +vagrant up + +log "Vagrant up completed, you can connect to the VM at http://172.30.1.5:10080. When you've finished testing, run 'vagrant destroy' to kill the VM." \ No newline at end of file