saltyorg / saltbox Goto Github PK
View Code? Open in Web Editor NEWAnsible-based solution for rapidly deploying a Docker containerized cloud media server.
Home Page: https://docs.saltbox.dev
License: GNU General Public License v3.0
Ansible-based solution for rapidly deploying a Docker containerized cloud media server.
Home Page: https://docs.saltbox.dev
License: GNU General Public License v3.0
cron:
cron_time: weekly
cron_state: absent/present
That "absent/present" thing is really non-intuitive. I'd suggest changing it to something like:
cron:
cron_time: weekly
schedule_with_cron: yes/no
Implement router for webtools as a workaround for this issue.
Expand the options to include custom vfs cache location.
Redo the edited theme.park implementation since hotio support was implemented upstream and then continue rolling it out onto the additional supported roles.
Implement a free space check when using the current backup implementation if we're not going to ditch it outright for duplicacy. Could make it a user definable size.
Ansible Docker module supports a wide variety of options that have yet to be implemented: https://docs.ansible.com/ansible/latest/collections/community/docker/docker_container_module.html#ansible-collections-community-docker-docker-container-module
Describe the problem
Only change on this (unmaintained?) image is a health check which can be added during runtime anyway.
Describe any solutions you think might work
Choose a maintained image and implement mount health check during runtime https://docs.ansible.com/ansible/latest/collections/community/docker/docker_container_module.html#parameter-healthcheck
Explore the possibility of a specific role or flag to indicate a Cloudbox backup is being used and avoid bringing in stale settings.
Ideas could be as simple as setting a shortcut on the restore drive, or dragging the wanted tarred app files into the saltbox default.
I imagine this being required only for those that are quite new to X box or do not understand the backup restore process.
I would consider priority low as it would be a one shot use.
Similarly might be to consider the PG restorers if structure is close enough and I think it is.
Consider making the service start conditions more tweakable now that vfs cache full is a feature. VFS cache full mounts can take a lot of time to start up if you ever upload through them directly so maybe we should have optional changes to which service starts after which.
My initial thoughts would be to have docker wait for mergerfs and mergerfs wait for rclone_vfs.service (but make service names configurable in case of custom setups.
Ideal candidate for proper roleX support in roles that need port bindings. Requirements are that ports are assigned within a range and checked for availability and the application configuration can also be updated through the Ansible role itself.
Users may be accustomed to using native git commands to update repos.
A change point from Cloudbox is that Saltbox no longer runs a settings update with every tag run; the problem with this was seen in the discord when someone ran a manual git pull
and the settings file wasn't updated, which caused an install to fail when the new setting wasn't found.
The preferred sb update
command wouldn't fix it at that point, since it wouldn't see any changes that required action.
It would be friendly to auto-recover from this situation. There were some options discussed in the Discord. One of them is on the task/update-settings-on-manual-pull
branch.
Need to update the syntax according to https://mikefarah.gitbook.io/yq/v/v4.x/upgrading-from-v3#updating-writing-documents so that the version lock can be removed.
Currently doesn't make a whole lot of sense
sonarr_docker_ports_defaults:
- "{{ sonarr_web_port }}"
sonarr_docker_ports_custom: []
sonarr_docker_ports: "{{ sonarr_docker_ports_defaults
+ sonarr_docker_ports_custom
if (not reverse_proxy_is_enabled)
else [] + sonarr_docker_ports_custom }}"
Where defaults is only active if running without reverse proxy and you need to add another variable to add "default" port bindings. Should make a webui specific port label so that defaults will contain the ports that need to be used in addition to the webui port.
Is there an Overseerx role? I am unable to install it on my server. Before migration, I was using cloudbox community role but I can't find this here.
The theme park themes doesn't load the script for Hotio. Changing this code fixed it for me.
Saltbox/roles/radarr/defaults/main.yml
Line 121 in 5974b77
- "{{ radarr_paths_location }}/98-themepark.sh:/etc/cont-init.d/99-themepark"
Same issue with all the other roles that can use themepark (Sonarr / Readarr / nzbget / etc...)
Hey there ๐
Love the work that's been going on with Saltbox!
I'm currently toying around with CloudBox and happened upon your project. It is clearly inspired by the work done on Cloudbox, but I've noticed a few clear differences:
Are there other big ones that users should be made aware of?
In addition to being more actively maintained, are there any high-level goals for the project that differ from that of Cloudbox, or should this project be viewed as a fork with the same goals as Cloudbox?
I am looking to have Koel added as a community app if possible, It is available from https://github.com/koel/docker.
Worth noting that the base version does not have on-demand scanning, but inotifywait can be set up to facilitate this, as described here: https://docs.koel.dev/watch.html#introduction - not sure if it is possible to include this within the app so that it doesn't require setting up manually.
Migrate rutorrent image to https://github.com/crazy-max/docker-rtorrent-rutorrent instead of the currently used one (horjulf/rutorrent-autodl).
Describe the problem
Currently the setup is set to globally upgrade HTTP requests to HTTPS which may not be wanted in some circumstances.
Describe any solutions you think might work
Define the upgrade on the router used in each role so it can be toggled individually.
Add support for additional DNS challenge providers: https://doc.traefik.io/traefik/https/acme/#dnschallenge
Hi, I am a Cloudbox user. Lately, I have been contemplating on moving to Saltbox. I wonder if it is possible to migrate using cloudbox backups (on gdrive), like cloudbox restore feature which automagically handles everything:
https://github.com/Cloudbox/Cloudbox/wiki/Cloudbox-Backup-and-Restore
I would love to know about any other way that can help me move to saltbox with all my cloudbox data.
Thanks!
Execute custom user scripts to restore any custom configuration the user wants handled on a restore for instance.
Deploy all python scripts/tools in their own venv to avoid conflicts when installing or whenever user does something outside of what ansible manages.
A replacement for skip_tags will have to be implemented in the sb tool saltyorg/sb#2
Describe the bug
plex_dupefinder
Traceback (most recent call last):
File "/usr/local/bin/plex_dupefinder", line 9, in <module>
from tabulate import tabulate
ModuleNotFoundError: No module named 'tabulate'
To Reproduce
Steps to reproduce the behavior:
sb install plex_dupefinder and launch plex_dupefinder
Logs
Running Saltbox Tags: plex_dupefinder
ansible-playbook [core 2.12.1]
config file = /srv/git/saltbox/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share /ansible/plugins/modules']
ansible python module location = /usr/local/lib/python3.8/dist-packages/ansibl e
ansible collection location = /root/.ansible/collections:/usr/share/ansible/co llections
executable location = /usr/local/bin/ansible-playbook
python version = 3.8.10 (default, Nov 26 2021, 20:14:08) [GCC 9.3.0]
jinja version = 2.10.1
libyaml = True
Using /srv/git/saltbox/ansible.cfg as config file
statically imported: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/01_syste m.yml
statically imported: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/02_ansib le_version.yml
statically imported: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/03_pytho n_version.yml
statically imported: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/04_ansib le_tags.yml
statically imported: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/05_backu p.yml
statically imported: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/06_logs. yml
statically imported: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/07_tmp.y ml
statically imported: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/08_setti ngs.yml
statically imported: /srv/git/saltbox/roles/pre_tasks/tasks/subtasks/apt.yml
statically imported: /srv/git/saltbox/roles/backup/tasks/sanity_check.yml
statically imported: /srv/git/saltbox/roles/backup/tasks/variables.yml
statically imported: /srv/git/saltbox/roles/backup/tasks/cron.yml
statically imported: /srv/git/saltbox/roles/backup/tasks/snapshot.yml
statically imported: /srv/git/saltbox/roles/backup/tasks/restore_service.yml
redirecting (type: action) ansible.builtin.synchronize to ansible.posix.synchron ize
statically imported: /srv/git/saltbox/roles/restore/tasks/variables.yml
statically imported: /srv/git/saltbox/roles/restore/tasks/restore_remote.yml
statically imported: /srv/git/saltbox/roles/restore/tasks/permissions.yml
statically imported: /srv/git/saltbox/roles/hetzner/tasks/subtasks/hetzner.yml
statically imported: /srv/git/saltbox/roles/user/tasks/subtasks/user_account.yml
statically imported: /srv/git/saltbox/roles/rclone/tasks/subtasks/01_build_url.y ml
statically imported: /srv/git/saltbox/roles/rclone/tasks/subtasks/02_install_bin ary.yml
statically imported: /srv/git/saltbox/roles/rclone/tasks/subtasks/03_import_conf ig.yml
statically imported: /srv/git/saltbox/roles/system/tasks/subtasks/logrotate.yml
statically imported: /srv/git/saltbox/roles/system/tasks/subtasks/network.yml
statically imported: /srv/git/saltbox/roles/system/tasks/subtasks/mounts.yml
redirecting (type: modules) ansible.builtin.mount to ansible.posix.mount
statically imported: /srv/git/saltbox/roles/system/tasks/subtasks/timezone.yml
statically imported: /srv/git/saltbox/roles/system/tasks/subtasks/locale.yml
redirecting (type: modules) ansible.builtin.locale_gen to community.general.loca le_gen
redirecting (type: modules) ansible.builtin.locale_gen to community.general.loca le_gen
redirecting (type: modules) ansible.builtin.ini_file to community.general.ini_fi le
redirecting (type: modules) ansible.builtin.docker_container to community.docker .docker_container
redirecting (type: modules) ansible.builtin.docker_container to community.docker .docker_container
statically imported: /srv/git/saltbox/roles/docker/tasks/subtasks/daemon.yml
redirecting (type: modules) ansible.builtin.ini_file to community.general.ini_fi le
statically imported: /srv/git/saltbox/roles/docker/tasks/subtasks/network.yml
redirecting (type: modules) ansible.builtin.docker_network to community.docker.d ocker_network
redirecting (type: modules) ansible.builtin.docker_network to community.docker.d ocker_network
redirecting (type: modules) ansible.builtin.docker_network to community.docker.d ocker_network
redirecting (type: modules) ansible.builtin.docker_network to community.docker.d ocker_network
statically imported: /srv/git/saltbox/roles/docker/tasks/subtasks/housekeeping.y ml
statically imported: /srv/git/saltbox/roles/docker/tasks/subtasks/dockerhub.yml
statically imported: /srv/git/saltbox/roles/docker/tasks/subtasks/dns.yml
statically imported: /srv/git/saltbox/roles/remote/tasks/subtasks/variables.yml
statically imported: /srv/git/saltbox/roles/remote/tasks/subtasks/containers.yml
statically imported: /srv/git/saltbox/roles/remote/tasks/subtasks/basics.yml
statically imported: /srv/git/saltbox/roles/unionfs/tasks/subtasks/variables.yml
statically imported: /srv/git/saltbox/roles/unionfs/tasks/subtasks/docker/contai ners_stop.yml
statically imported: /srv/git/saltbox/roles/unionfs/tasks/subtasks/mount_path.ym l
statically imported: /srv/git/saltbox/roles/unionfs/tasks/subtasks/basics.yml
statically imported: /srv/git/saltbox/roles/unionfs/tasks/subtasks/docker/daemon .yml
redirecting (type: modules) ansible.builtin.ini_file to community.general.ini_fi le
statically imported: /srv/git/saltbox/roles/unionfs/tasks/subtasks/docker/contai ners_start.yml
statically imported: /srv/git/saltbox/roles/authelia/tasks/subtasks/settings.yml
statically imported: /srv/git/saltbox/roles/traefik/tasks/subtasks/zerossl.yml
statically imported: /srv/git/saltbox/roles/traefik/tasks/subtasks/config.yml
statically imported: /srv/git/saltbox/roles/cloudflare/tasks/subtasks/variables. yml
statically imported: /srv/git/saltbox/roles/cloudflare/tasks/subtasks/subdomains .yml
statically imported: /srv/git/saltbox/roles/cloudflare/tasks/subtasks/subdomains /add_subdomain.yml
redirecting (type: modules) ansible.builtin.cloudflare_dns to community.general. cloudflare_dns
statically imported: /srv/git/saltbox/roles/cloudflare/tasks/subtasks/subdomains /remove_subdomain.yml
redirecting (type: modules) ansible.builtin.cloudflare_dns to community.general. cloudflare_dns
statically imported: /srv/git/saltbox/roles/cloudflare/tasks/subtasks/purge_cach e.yml
statically imported: /srv/git/saltbox/roles/cloudflare/tasks/subtasks/page_rules .yml
statically imported: /srv/git/saltbox/roles/cloudflare/tasks/subtasks/page_rules /remove_page_rule.yml
statically imported: /srv/git/saltbox/roles/cloudflare/tasks/subtasks/page_rules /add_page_rule.yml
statically imported: /srv/git/saltbox/roles/plex/tasks/subtasks/pre-install/main .yml
statically imported: /srv/git/saltbox/roles/plex/tasks/subtasks/preferences/pref erences.yml
redirecting (type: modules) ansible.builtin.xml to community.general.xml
redirecting (type: modules) ansible.builtin.xml to community.general.xml
statically imported: /srv/git/saltbox/roles/plex/tasks/subtasks/preferences/clai m_server.yml
redirecting (type: modules) ansible.builtin.ini_file to community.general.ini_fi le
redirecting (type: modules) ansible.builtin.ini_file to community.general.ini_fi le
statically imported: /srv/git/saltbox/roles/plex/tasks/subtasks/post-install/mai n.yml
statically imported: /srv/git/saltbox/roles/plex/tasks/subtasks/post-install/upd ate_ports.yml
redirecting (type: modules) ansible.builtin.xml to community.general.xml
statically imported: /srv/git/saltbox/roles/plex_extra_tasks/tasks/main2.yml
statically imported: /srv/git/saltbox/roles/plex_extra_tasks/tasks/subtasks/post _install_checks.yml
redirecting (type: modules) ansible.builtin.docker_container to community.docker .docker_container
statically imported: /srv/git/saltbox/roles/plex_extra_tasks/tasks/subtasks/sett ings/db_cache_size.yml
redirecting (type: modules) ansible.builtin.docker_container to community.docker .docker_container
redirecting (type: modules) ansible.builtin.docker_container to community.docker .docker_container
redirecting (type: modules) ansible.builtin.xml to community.general.xml
redirecting (type: modules) ansible.builtin.docker_container to community.docker .docker_container
redirecting (type: modules) ansible.builtin.xml to community.general.xml
redirecting (type: modules) ansible.builtin.docker_container to community.docker .docker_container
redirecting (type: modules) ansible.builtin.docker_container to community.docker .docker_container
redirecting (type: modules) ansible.builtin.docker_container to community.docker .docker_container
redirecting (type: modules) ansible.builtin.docker_container to community.docker .docker_container
statically imported: /srv/git/saltbox/roles/plex_autoscan/tasks/subtasks/service s.yml
statically imported: /srv/git/saltbox/roles/plex_autoscan/tasks/subtasks/setting s.yml
statically imported: /srv/git/saltbox/roles/cloudplow/tasks/subtasks/settings.ym l
statically imported: /srv/git/saltbox/roles/nzbget/tasks/subtasks/post-install/m ain.yml
redirecting (type: modules) ansible.builtin.docker_container to community.docker .docker_container
statically imported: /srv/git/saltbox/roles/nzbget/tasks/subtasks/post-install/s cripts/main.yml
statically imported: /srv/git/saltbox/roles/nzbget/tasks/subtasks/post-install/s ettings/main.yml
redirecting (type: modules) ansible.builtin.docker_container to community.docker .docker_container
statically imported: /srv/git/saltbox/roles/rutorrent/tasks/subtasks/pre-install/main.yml
statically imported: /srv/git/saltbox/roles/rutorrent/tasks/subtasks/post-install/main.yml
redirecting (type: modules) ansible.builtin.docker_container to community.docker.docker_container
statically imported: /srv/git/saltbox/roles/rutorrent/tasks/subtasks/post-install/settings/main.yml
statically imported: /srv/git/saltbox/roles/rutorrent/tasks/subtasks/post-install/settings/new_installs.yml
redirecting (type: modules) ansible.builtin.ini_file to community.general.ini_file
redirecting (type: modules) ansible.builtin.ini_file to community.general.ini_file
statically imported: /srv/git/saltbox/roles/rutorrent/tasks/subtasks/post-install/settings/existing_installs.yml
redirecting (type: modules) ansible.builtin.ini_file to community.general.ini_file
redirecting (type: modules) ansible.builtin.docker_container to community.docker.docker_container
statically imported: /srv/git/saltbox/roles/nzbhydra2/tasks/subtasks/post-install/main.yml
statically imported: /srv/git/saltbox/roles/nzbhydra2/tasks/subtasks/post-install/settings.yml
redirecting (type: modules) ansible.builtin.docker_container to community.docker.docker_container
redirecting (type: modules) ansible.builtin.docker_container to community.docker.docker_container
statically imported: /srv/git/saltbox/roles/sonarr/tasks/subtasks/post-install/main.yml
statically imported: /srv/git/saltbox/roles/sonarr/tasks/subtasks/post-install/update_ports.yml
redirecting (type: modules) ansible.builtin.xml to community.general.xml
statically imported: /srv/git/saltbox/roles/radarr/tasks/subtasks/post-install/main.yml
statically imported: /srv/git/saltbox/roles/radarr/tasks/subtasks/post-install/update_ports.yml
redirecting (type: modules) ansible.builtin.xml to community.general.xml
statically imported: /srv/git/saltbox/roles/authelia/tasks/subtasks/settings.yml
redirecting (type: modules) ansible.builtin.ini_file to community.general.ini_file
redirecting (type: modules) ansible.builtin.ini_file to community.general.ini_file
redirecting (type: modules) ansible.builtin.xml to community.general.xml
redirecting (type: modules) ansible.builtin.docker_container to community.docker.docker_container
redirecting (type: modules) ansible.builtin.xml to community.general.xml
redirecting (type: modules) ansible.builtin.docker_container to community.docker.docker_container
redirecting (type: modules) ansible.builtin.docker_container to community.docker.docker_container
redirecting (type: modules) ansible.builtin.docker_container to community.docker.docker_container
statically imported: /srv/git/saltbox/roles/emby/tasks/subtasks/post-install.yml
statically imported: /srv/git/saltbox/roles/emby/tasks/subtasks/settings.yml
redirecting (type: modules) ansible.builtin.docker_container to community.docker.docker_container
redirecting (type: modules) ansible.builtin.xml to community.general.xml
redirecting (type: modules) ansible.builtin.docker_container to community.docker.docker_container
redirecting (type: modules) ansible.builtin.xml to community.general.xml
redirecting (type: modules) ansible.builtin.xml to community.general.xml
statically imported: /srv/git/saltbox/roles/netdata/tasks/subtasks/settings.yml
redirecting (type: modules) ansible.builtin.docker_container to community.docker.docker_container
redirecting (type: modules) ansible.builtin.docker_container to community.docker.docker_container
statically imported: /srv/git/saltbox/roles/sabnzbd/tasks/subtasks/post-install/main.yml
statically imported: /srv/git/saltbox/roles/sabnzbd/tasks/subtasks/post-install/settings.yml
redirecting (type: modules) ansible.builtin.docker_container to community.docker.docker_container
redirecting (type: modules) ansible.builtin.ini_file to community.general.ini_file
redirecting (type: modules) ansible.builtin.docker_container to community.docker.docker_container
redirecting (type: modules) ansible.builtin.docker_container to community.docker.docker_container
redirecting (type: modules) ansible.builtin.docker_container to community.docker.docker_container
redirecting (type: modules) ansible.builtin.docker_container to community.docker.docker_container
redirecting (type: modules) ansible.builtin.docker_container to community.docker.docker_container
statically imported: /srv/git/saltbox/roles/autoscan/tasks/subtasks/settings.yml
redirecting (type: modules) ansible.builtin.xml to community.general.xml
statically imported: /srv/git/saltbox/roles/jellyfin/tasks/subtasks/preinstall.yml
statically imported: /srv/git/saltbox/roles/jellyfin/tasks/subtasks/postinstall.yml
statically imported: /srv/git/saltbox/roles/jellyfin/tasks/subtasks/settings.yml
redirecting (type: modules) ansible.builtin.docker_container to community.docker.docker_container
redirecting (type: modules) ansible.builtin.xml to community.general.xml
redirecting (type: modules) ansible.builtin.xml to community.general.xml
redirecting (type: modules) ansible.builtin.docker_container to community.docker.docker_container
redirecting (type: modules) ansible.builtin.docker_container to community.docker.docker_container
redirecting (type: modules) ansible.builtin.docker_container to community.docker.docker_container
redirecting (type: callback) ansible.builtin.profile_tasks to ansible.posix.profile_tasks
Skipping callback 'default', as we already have a stdout callback.
Skipping callback 'minimal', as we already have a stdout callback.
Skipping callback 'oneline', as we already have a stdout callback.
PLAYBOOK: saltbox.yml **********************************************************
1 plays in /srv/git/saltbox/saltbox.yml
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
task path: /srv/git/saltbox/saltbox.yml:2
Thursday 13 January 2022 18:45:09 +0100 (0:00:00.714) 0:00:00.714 ******
ok: [localhost]
META: ran handlers
META:
TASK [sanity_check : System | Ensure Ansible is running on Ubuntu 20.04] *******
task path: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/01_system.yml:10
Thursday 13 January 2022 18:45:17 +0100 (0:00:07.756) 0:00:08.471 ******
ok: [localhost] => {
"changed": false,
"msg": "System is running Ubuntu 20.04.3 LTS."
}
TASK [sanity_check : Find Ansible version] *************************************
task path: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/02_ansible_version.yml:10
Thursday 13 January 2022 18:45:17 +0100 (0:00:00.081) 0:00:08.552 ******
changed: [localhost] => {"changed": true, "cmd": "python3 -c 'from ansible_collections.ansible_release import ansible_version; print(ansible_version)'", "delta": "0:00:00.036154", "end": "2022-01-13 18:45:17.797318", "msg": "", "rc": 0, "start": "2022-01-13 18:45:17.761164", "stderr": "", "stderr_lines": [], "stdout": "5.1.0", "stdout_lines": ["5.1.0"]}
TASK [sanity_check : Print Ansible version] ************************************
task path: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/02_ansible_version.yml:14
Thursday 13 January 2022 18:45:17 +0100 (0:00:00.548) 0:00:09.101 ******
ok: [localhost] => {
"msg": [
"Installed Ansible version: 5.1.0.",
"Installed Ansible Core version: 2.12.1."
]
}
TASK [sanity_check : Check if Ansible needs upgrading] *************************
task path: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/02_ansible_version.yml:20
Thursday 13 January 2022 18:45:17 +0100 (0:00:00.062) 0:00:09.164 ******
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}
TASK [sanity_check : Upgrade Ansible] ******************************************
task path: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/02_ansible_version.yml:25
Thursday 13 January 2022 18:45:17 +0100 (0:00:00.063) 0:00:09.228 ******
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}
TASK [sanity_check : Upgrade Ansible | Print Instructions] *********************
task path: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/02_ansible_version.yml:34
Thursday 13 January 2022 18:45:18 +0100 (0:00:00.062) 0:00:09.291 ******
skipping: [localhost] => {}
TASK [sanity_check : Upgrade Ansible | Exit] ***********************************
task path: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/02_ansible_version.yml:40
Thursday 13 January 2022 18:45:18 +0100 (0:00:00.068) 0:00:09.359 ******
META:
skipping: [localhost] => {"msg": "", "skip_reason": "end_play conditional evaluated to False, continuing play"}
TASK [sanity_check : Python Version | Ensure Ansible is running on Python 3.8+] ***
task path: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/03_python_version.yml:10
Thursday 13 January 2022 18:45:18 +0100 (0:00:00.071) 0:00:09.431 ******
ok: [localhost] => {
"changed": false,
"msg": "Ansible running on Python version: 3.8.10"
}
TASK [sanity_check : Ansible Tags | Get all available Ansible tags] ************
task path: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/04_ansible_tags.yml:10
Thursday 13 January 2022 18:45:18 +0100 (0:00:00.066) 0:00:09.497 ******
ok: [localhost] => {"changed": false, "cmd": "ansible-playbook saltbox.yml --list-tags 2>&1 | grep \"TASK TAGS\" \\\n | cut -d\":\" -f2 | awk '{sub(/\\[/, \"\")sub(/\\]/, \"\")}1' | sed -e 's/,//g' | xargs -n 1 | sort -u\n", "delta": "0:00:04.036822", "end": "2022-01-13 18:45:22.522446", "msg": "", "rc": 0, "start": "2022-01-13 18:45:18.485624", "stderr": "", "stderr_lines": [], "stdout": "always\nasshama\nauthelia\nautoscan\nbackup\nbpytop\nbtrfsmaintenance\ncloudflare\ncloudplow\ncommon\ncommunity\ncore\nctop\ncustom\nddclient\ndocker\ndocker-housekeeping\nemby\nfeederbox\nglances\nhetzner\niperf3\njackett\njellyfin\nkernel\nlidarr\nmariadb\nmediabox\nmongodb\nmotd\nmounts\nmounts_override\nnetdata\nnethogs\nnginx\nnvidia\nnzbget\nnzbhydra2\nnzbthrottle\nopt-permissions-reset\norganizr\noverseerr\npetio\nplex\nplex_auth_token\nplex_autoscan\nplex-db-cache-size\nplex_dupefinder\nplex-extra-tasks\nplex_patrol\nplex-plugins-sub-zero\nplex-plugins-sub-zero-reinstall\nplex-plugins-webtools\nplex-plugins-webtools-reinstall\nportainer\npreinstall\npre_tasks\nprowlarr\npython-plexlibrary\nradarr\nrclone\nredis\nrestore\nrestore-service\nrutorrent\nsabnzbd\nsaltbox\nsaltbox-restore-service\nsandbox\nsanity_check\nscripts\nset-backup\nset-locale\nset-timezone\nsettings\nshell\nsonarr\nsstv\nsubliminal\nsystem\ntautulli\ntrackarr\ntraefik\ntraefik_reset_certs\ntraktarr\ntransfer\nuser\nyyq", "stdout_lines": ["always", "asshama", "authelia", "autoscan", "backup", "bpytop", "btrfsmaintenance", "cloudflare", "cloudplow", "common", "community", "core", "ctop", "custom", "ddclient", "docker", "docker-housekeeping", "emby", "feederbox", "glances", "hetzner", "iperf3", "jackett", "jellyfin", "kernel", "lidarr", "mariadb", "mediabox", "mongodb", "motd", "mounts", "mounts_override", "netdata", "nethogs", "nginx", "nvidia", "nzbget", "nzbhydra2", "nzbthrottle", "opt-permissions-reset", "organizr", "overseerr", "petio", "plex", "plex_auth_token", "plex_autoscan", "plex-db-cache-size", "plex_dupefinder", "plex-extra-tasks", "plex_patrol", "plex-plugins-sub-zero", "plex-plugins-sub-zero-reinstall", "plex-plugins-webtools", "plex-plugins-webtools-reinstall", "portainer", "preinstall", "pre_tasks", "prowlarr", "python-plexlibrary", "radarr", "rclone", "redis", "restore", "restore-service", "rutorrent", "sabnzbd", "saltbox", "saltbox-restore-service", "sandbox", "sanity_check", "scripts", "set-backup", "set-locale", "set-timezone", "settings", "shell", "sonarr", "sstv", "subliminal", "system", "tautulli", "trackarr", "traefik", "traefik_reset_certs", "traktarr", "transfer", "user", "yyq"]}
TASK [sanity_check : Ansible Tags | Ensure valid Ansible tag(s) were provided] ***
task path: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/04_ansible_tags.yml:18
Thursday 13 January 2022 18:45:22 +0100 (0:00:04.326) 0:00:13.823 ******
ok: [localhost] => (item=plex_dupefinder) => {"ansible_loop_var": "item", "changed": false, "item": "plex_dupefinder", "msg": "All assertions passed"}
TASK [sanity_check : Backup | Check if 'backup.lock' is present] ***************
task path: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/05_backup.yml:10
Thursday 13 January 2022 18:45:22 +0100 (0:00:00.093) 0:00:13.917 ******
ok: [localhost] => {"changed": false, "stat": {"exists": false}}
TASK [sanity_check : Backup | Get age of 'backup.lock' file] *******************
task path: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/05_backup.yml:16
Thursday 13 January 2022 18:45:23 +0100 (0:00:00.505) 0:00:14.422 ******
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}
TASK [sanity_check : Backup | Delete stale 'backup.lock'] **********************
task path: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/05_backup.yml:22
Thursday 13 January 2022 18:45:23 +0100 (0:00:00.059) 0:00:14.481 ******
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}
TASK [sanity_check : Backup | Fail when 'backup.lock' exists] ******************
task path: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/05_backup.yml:28
Thursday 13 January 2022 18:45:23 +0100 (0:00:00.061) 0:00:14.542 ******
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}
TASK [sanity_check : Logs | Get 'saltbox.yml' info] ****************************
task path: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/06_logs.yml:10
Thursday 13 January 2022 18:45:23 +0100 (0:00:00.056) 0:00:14.599 ******
ok: [localhost] => {"changed": false, "stat": {"atime": 1641838429.4430397, "attr_flags": "e", "attributes": ["extents"], "block_size": 4096, "blocks": 16, "charset": "us-ascii", "checksum": "f2b887f03856609feb87d808b666b8fd24ca6471", "ctime": 1641838429.523039, "dev": 64773, "device_type": 0, "executable": false, "exists": true, "gid": 1000, "gr_name": "skullknight", "inode": 165937728, "isblk": false, "ischr": false, "isdir": false, "isfifo": false, "isgid": false, "islnk": false, "isreg": true, "issock": false, "isuid": false, "mimetype": "text/plain", "mode": "0644", "mtime": 1641838429.4430397, "nlink": 1, "path": "/srv/git/saltbox/saltbox.yml", "pw_name": "skullknight", "readable": true, "rgrp": true, "roth": true, "rusr": true, "size": 5117, "uid": 1000, "version": "3835694510", "wgrp": false, "woth": false, "writeable": true, "wusr": true, "xgrp": false, "xoth": false, "xusr": false}}
TASK [sanity_check : Logs | Touch 'saltbox.log'] *******************************
task path: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/06_logs.yml:15
Thursday 13 January 2022 18:45:23 +0100 (0:00:00.308) 0:00:14.908 ******
changed: [localhost] => {"changed": true, "dest": "/srv/git/saltbox/saltbox.log", "gid": 1000, "group": "skullknight", "mode": "0664", "owner": "skullknight", "size": 35000, "state": "file", "uid": 1000}
TASK [sanity_check : Tmp | Create Ansible Temp directories] ********************
task path: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/07_tmp.yml:10
Thursday 13 January 2022 18:45:24 +0100 (0:00:00.466) 0:00:15.375 ******
ok: [localhost] => (item=/tmp/ansible) => {"ansible_loop_var": "item", "changed": false, "gid": 0, "group": "root", "item": "/tmp/ansible", "mode": "0777", "owner": "root", "path": "/tmp/ansible", "size": 4096, "state": "directory", "uid": 0}
TASK [sanity_check : Settings | Ensure TLS validation isn't used with ZeroSSL] ***
task path: /srv/git/saltbox/roles/sanity_check/tasks/subtasks/08_settings.yml:10
Thursday 13 January 2022 18:45:24 +0100 (0:00:00.299) 0:00:15.674 ******
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}
META: role_complete for localhost
TASK [pre_tasks : APT | Remove APT locks] **************************************
task path: /srv/git/saltbox/roles/pre_tasks/tasks/subtasks/apt.yml:10
Thursday 13 January 2022 18:45:24 +0100 (0:00:00.087) 0:00:15.762 ******
ok: [localhost] => (item=/var/lib/apt/lists/lock) => {"ansible_loop_var": "item", "changed": false, "item": "/var/lib/apt/lists/lock", "path": "/var/lib/apt/lists/lock", "state": "absent"}
ok: [localhost] => (item=/var/cache/apt/archives/lock) => {"ansible_loop_var": "item", "changed": false, "item": "/var/cache/apt/archives/lock", "path": "/var/cache/apt/archives/lock", "state": "absent"}
ok: [localhost] => (item=/var/lib/dpkg/lock) => {"ansible_loop_var": "item", "changed": false, "item": "/var/lib/dpkg/lock", "path": "/var/lib/dpkg/lock", "state": "absent"}
META: role_complete for localhost
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
TASK [plex_dupefinder : Create plex_dupefinder directories] ********************
task path: /srv/git/saltbox/roles/plex_dupefinder/tasks/main.yml:10
Thursday 13 January 2022 18:45:27 +0100 (0:00:03.197) 0:00:18.960 ******
changed: [localhost] => (item=/opt/plex_dupefinder) => {"ansible_loop_var": "item", "changed": true, "gid": 1000, "group": "skullknight", "item": "/opt/plex_dupefinder", "mode": "0775", "owner": "skullknight", "path": "/opt/plex_dupefinder", "size": 302, "state": "directory", "uid": 1000}
TASK [plex_dupefinder : Clone plex_dupefinder] *********************************
task path: /srv/git/saltbox/roles/plex_dupefinder/tasks/main.yml:21
Thursday 13 January 2022 18:45:28 +0100 (0:00:00.432) 0:00:19.393 ******
changed: [localhost] => {"after": "393569b8f0e38937eab055b827ad9dbf6610d783", "before": "393569b8f0e38937eab055b827ad9dbf6610d783", "changed": true, "msg": "Local modifications exist.", "remote_url_changed": false}
TASK [plex_dupefinder : Install pip requirements] ******************************
task path: /srv/git/saltbox/roles/plex_dupefinder/tasks/main.yml:31
Thursday 13 January 2022 18:45:29 +0100 (0:00:01.021) 0:00:20.414 ******
ok: [localhost] => {"changed": false, "cmd": ["/opt/plex_dupefinder/venv/bin/pip3", "install", "-r", "/opt/plex_dupefinder/requirements.txt"], "name": null, "requirements": "/opt/plex_dupefinder/requirements.txt", "state": "present", "stderr": "", "stderr_lines": [], "stdout": "Requirement already satisfied: tabulate~=0.8.2 in /opt/plex_dupefinder/venv/lib/python3.8/site-packages (from -r /opt/plex_dupefinder/requirements.txt (line 1)) (0.8.9)\nRequirement already satisfied: requests~=2.18.4 in /opt/plex_dupefinder/venv/lib/python3.8/site-packages (from -r /opt/plex_dupefinder/requirements.txt (line 2)) (2.18.4)\nRequirement already satisfied: attrdict~=2.0.0 in /opt/plex_dupefinder/venv/lib/python3.8/site-packages (from -r /opt/plex_dupefinder/requirements.txt (line 3)) (2.0.1)\nRequirement already satisfied: PlexAPI~=3.0.6 in /opt/plex_dupefinder/venv/lib/python3.8/site-packages (from -r /opt/plex_dupefinder/requirements.txt (line 4)) (3.0.6)\nRequirement already satisfied: certifi>=2017.4.17 in /opt/plex_dupefinder/venv/lib/python3.8/site-packages (from requests~=2.18.4->-r /opt/plex_dupefinder/requirements.txt (line 2)) (2021.10.8)\nRequirement already satisfied: idna<2.7,>=2.5 in /opt/plex_dupefinder/venv/lib/python3.8/site-packages (from requests~=2.18.4->-r /opt/plex_dupefinder/requirements.txt (line 2)) (2.6)\nRequirement already satisfied: urllib3<1.23,>=1.21.1 in /opt/plex_dupefinder/venv/lib/python3.8/site-packages (from requests~=2.18.4->-r /opt/plex_dupefinder/requirements.txt (line 2)) (1.22)\nRequirement already satisfied: chardet<3.1.0,>=3.0.2 in /opt/plex_dupefinder/venv/lib/python3.8/site-packages (from requests~=2.18.4->-r /opt/plex_dupefinder/requirements.txt (line 2)) (3.0.4)\nRequirement already satisfied: six in /opt/plex_dupefinder/venv/lib/python3.8/site-packages (from attrdict~=2.0.0->-r /opt/plex_dupefinder/requirements.txt (line 3)) (1.16.0)\nRequirement already satisfied: tqdm in /opt/plex_dupefinder/venv/lib/python3.8/site-packages (from PlexAPI~=3.0.6->-r /opt/plex_dupefinder/requirements.txt (line 4)) (4.62.3)\nRequirement already satisfied: websocket-client in /opt/plex_dupefinder/venv/lib/python3.8/site-packages (from PlexAPI~=3.0.6->-r /opt/plex_dupefinder/requirements.txt (line 4)) (1.2.3)\n", "stdout_lines": ["Requirement already satisfied: tabulate~=0.8.2 in /opt/plex_dupefinder/venv/lib/python3.8/site-packages (from -r /opt/plex_dupefinder/requirements.txt (line 1)) (0.8.9)", "Requirement already satisfied: requests~=2.18.4 in /opt/plex_dupefinder/venv/lib/python3.8/site-packages (from -r /opt/plex_dupefinder/requirements.txt (line 2)) (2.18.4)", "Requirement already satisfied: attrdict~=2.0.0 in /opt/plex_dupefinder/venv/lib/python3.8/site-packages (from -r /opt/plex_dupefinder/requirements.txt (line 3)) (2.0.1)", "Requirement already satisfied: PlexAPI~=3.0.6 in /opt/plex_dupefinder/venv/lib/python3.8/site-packages (from -r /opt/plex_dupefinder/requirements.txt (line 4)) (3.0.6)", "Requirement already satisfied: certifi>=2017.4.17 in /opt/plex_dupefinder/venv/lib/python3.8/site-packages (from requests~=2.18.4->-r /opt/plex_dupefinder/requirements.txt (line 2)) (2021.10.8)", "Requirement already satisfied: idna<2.7,>=2.5 in /opt/plex_dupefinder/venv/lib/python3.8/site-packages (from requests~=2.18.4->-r /opt/plex_dupefinder/requirements.txt (line 2)) (2.6)", "Requirement already satisfied: urllib3<1.23,>=1.21.1 in /opt/plex_dupefinder/venv/lib/python3.8/site-packages (from requests~=2.18.4->-r /opt/plex_dupefinder/requirements.txt (line 2)) (1.22)", "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /opt/plex_dupefinder/venv/lib/python3.8/site-packages (from requests~=2.18.4->-r /opt/plex_dupefinder/requirements.txt (line 2)) (3.0.4)", "Requirement already satisfied: six in /opt/plex_dupefinder/venv/lib/python3.8/site-packages (from attrdict~=2.0.0->-r /opt/plex_dupefinder/requirements.txt (line 3)) (1.16.0)", "Requirement already satisfied: tqdm in /opt/plex_dupefinder/venv/lib/python3.8/site-packages (from PlexAPI~=3.0.6->-r /opt/plex_dupefinder/requirements.txt (line 4)) (4.62.3)", "Requirement already satisfied: websocket-client in /opt/plex_dupefinder/venv/lib/python3.8/site-packages (from PlexAPI~=3.0.6->-r /opt/plex_dupefinder/requirements.txt (line 4)) (1.2.3)"], "version": null, "virtualenv": "/opt/plex_dupefinder/venv"}
TASK [plex_dupefinder : Check config exists] ***********************************
task path: /srv/git/saltbox/roles/plex_dupefinder/tasks/main.yml:39
Thursday 13 January 2022 18:45:34 +0100 (0:00:05.259) 0:00:25.674 ******
ok: [localhost] => {"changed": false, "stat": {"atime": 1642095225.4535952, "attr_flags": "", "attributes": [], "block_size": 4096, "blocks": 8, "charset": "us-ascii", "checksum": "8edfda27352343e7648d5458b4655b1791d6ab0a", "ctime": 1642095085.5904522, "dev": 48, "device_type": 0, "executable": true, "exists": true, "gid": 1000, "gr_name": "skullknight", "inode": 442528, "isblk": false, "ischr": false, "isdir": false, "isfifo": false, "isgid": false, "islnk": false, "isreg": true, "issock": false, "isuid": false, "mimetype": "application/json", "mode": "0775", "mtime": 1642095085.110455, "nlink": 1, "path": "/opt/plex_dupefinder/config.json", "pw_name": "skullknight", "readable": true, "rgrp": true, "roth": true, "rusr": true, "size": 1420, "uid": 1000, "version": "28224", "wgrp": true, "woth": false, "writeable": true, "wusr": true, "xgrp": true, "xoth": true, "xusr": true}}
TASK [plex_auth_token : Auth Token | Create directories] ***********************
task path: /srv/git/saltbox/roles/plex_auth_token/tasks/main.yml:10
Thursday 13 January 2022 18:45:34 +0100 (0:00:00.298) 0:00:25.972 ******
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}
TASK [plex_auth_token : Auth Token | Check if PIN exists] **********************
task path: /srv/git/saltbox/roles/plex_auth_token/tasks/main.yml:18
Thursday 13 January 2022 18:45:34 +0100 (0:00:00.073) 0:00:26.046 ******
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}
TASK [plex_auth_token : Auth Token | Set plex_auth_client_identifier] **********
task path: /srv/git/saltbox/roles/plex_auth_token/tasks/main.yml:23
Thursday 13 January 2022 18:45:34 +0100 (0:00:00.071) 0:00:26.117 ******
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}
TASK [plex_auth_token : Auth Token | Set plex_auth_client_identifier] **********
task path: /srv/git/saltbox/roles/plex_auth_token/tasks/main.yml:28
Thursday 13 January 2022 18:45:34 +0100 (0:00:00.071) 0:00:26.188 ******
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}
TASK [plex_auth_token : Auth Token | Set plex_auth_token variable if previously saved] ***
task path: /srv/git/saltbox/roles/plex_auth_token/tasks/main.yml:33
Thursday 13 January 2022 18:45:35 +0100 (0:00:00.071) 0:00:26.260 ******
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}
TASK [plex_auth_token : Auth Token | Set plex_no_token status] *****************
task path: /srv/git/saltbox/roles/plex_auth_token/tasks/main.yml:38
Thursday 13 January 2022 18:45:35 +0100 (0:00:00.080) 0:00:26.340 ******
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}
TASK [plex_auth_token : Auth Token | Check if Token is valid] ******************
task path: /srv/git/saltbox/roles/plex_auth_token/tasks/main.yml:42
Thursday 13 January 2022 18:45:35 +0100 (0:00:00.077) 0:00:26.417 ******
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}
TASK [plex_auth_token : Auth Token | Generate PIN] *****************************
task path: /srv/git/saltbox/roles/plex_auth_token/tasks/main.yml:64
Thursday 13 January 2022 18:45:35 +0100 (0:00:00.078) 0:00:26.496 ******
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}
TASK [plex_auth_token : Auth Token | Prompt user to login] *********************
task path: /srv/git/saltbox/roles/plex_auth_token/tasks/main.yml:80
Thursday 13 January 2022 18:45:35 +0100 (0:00:00.076) 0:00:26.573 ******
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}
TASK [plex_auth_token : Auth Token | Check PIN] ********************************
task path: /srv/git/saltbox/roles/plex_auth_token/tasks/main.yml:84
Thursday 13 January 2022 18:45:35 +0100 (0:00:00.144) 0:00:26.717 ******
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}
TASK [plex_auth_token : Auth Token | Add Client Identifier to '/opt/saltbox/plex.ini'] ***
task path: /srv/git/saltbox/roles/plex_auth_token/tasks/main.yml:97
Thursday 13 January 2022 18:45:35 +0100 (0:00:00.072) 0:00:26.789 ******
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}
TASK [plex_auth_token : Auth Token | Add Plex Token to '/opt/saltbox/plex.ini'] ***
task path: /srv/git/saltbox/roles/plex_auth_token/tasks/main.yml:104
Thursday 13 January 2022 18:45:35 +0100 (0:00:00.081) 0:00:26.871 ******
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}
TASK [plex_auth_token : Auth Token | Set plex_auth_token variable] *************
task path: /srv/git/saltbox/roles/plex_auth_token/tasks/main.yml:111
Thursday 13 January 2022 18:45:35 +0100 (0:00:00.079) 0:00:26.950 ******
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}
TASK [plex_auth_token : Auth Token | Get X-Plex-Token] *************************
task path: /srv/git/saltbox/roles/plex_auth_token/tasks/main.yml:120
Thursday 13 January 2022 18:45:35 +0100 (0:00:00.069) 0:00:27.020 ******
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}
TASK [plex_auth_token : Auth Token | Set plex_auth_token variable] *************
task path: /srv/git/saltbox/roles/plex_auth_token/tasks/main.yml:134
Thursday 13 January 2022 18:45:35 +0100 (0:00:00.075) 0:00:27.095 ******
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}
TASK [plex_auth_token : Auth Token | Display Plex Auth Token] ******************
task path: /srv/git/saltbox/roles/plex_auth_token/tasks/main.yml:140
Thursday 13 January 2022 18:45:35 +0100 (0:00:00.068) 0:00:27.164 ******
skipping: [localhost] => {}
TASK [plex_auth_token : Change permissions] ************************************
task path: /srv/git/saltbox/roles/plex_auth_token/tasks/main.yml:144
Thursday 13 January 2022 18:45:35 +0100 (0:00:00.072) 0:00:27.237 ******
skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}
META:
TASK [plex_dupefinder : Import default config] *********************************
task path: /srv/git/saltbox/roles/plex_dupefinder/tasks/main.yml:49
Thursday 13 January 2022 18:45:36 +0100 (0:00:00.107) 0:00:27.344 ******
ok: [localhost] => {"changed": false, "dest": "/opt/plex_dupefinder/config.json", "src": "/root/.ansible/tmp/ansible-local-45852e254vzzm/tmpb7i_18tr/config.json.j2"}
TASK [plex_dupefinder : Set plex_dupefinder.py as executable] ******************
task path: /srv/git/saltbox/roles/plex_dupefinder/tasks/main.yml:58
Thursday 13 January 2022 18:45:36 +0100 (0:00:00.465) 0:00:27.809 ******
ok: [localhost] => {"changed": false, "gid": 1000, "group": "skullknight", "mode": "0775", "owner": "skullknight", "path": "/opt/plex_dupefinder/plex_dupefinder.py", "size": 18161, "state": "file", "uid": 1000}
TASK [plex_dupefinder : Create /usr/local/bin symlink] *************************
task path: /srv/git/saltbox/roles/plex_dupefinder/tasks/main.yml:65
Thursday 13 January 2022 18:45:36 +0100 (0:00:00.286) 0:00:28.095 ******
ok: [localhost] => {"changed": false, "dest": "/usr/local/bin/plex_dupefinder", "gid": 0, "group": "root", "mode": "0777", "owner": "root", "size": 39, "src": "/opt/plex_dupefinder/plex_dupefinder.py", "state": "link", "uid": 0}
META: role_complete for localhost
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META:
META: ran handlers
META: ran handlers
PLAY RECAP *********************************************************************
localhost : ok=19 changed=4 unreachable=0 failed=0 skipped=24 rescued=0 ignored=0
Thursday 13 January 2022 18:45:37 +0100 (0:00:01.103) 0:00:29.199 ******
===============================================================================
Gathering Facts --------------------------------------------------------- 7.76s
/srv/git/saltbox/saltbox.yml:2 ------------------------------------------------
plex_dupefinder : Install pip requirements ------------------------------ 5.26s
/srv/git/saltbox/roles/plex_dupefinder/tasks/main.yml:31 ----------------------
sanity_check : Ansible Tags | Get all available Ansible tags ------------ 4.33s
/srv/git/saltbox/roles/sanity_check/tasks/subtasks/04_ansible_tags.yml:10 -----
pre_tasks : APT | Remove APT locks -------------------------------------- 3.20s
/srv/git/saltbox/roles/pre_tasks/tasks/subtasks/apt.yml:10 --------------------
plex_dupefinder : Create /usr/local/bin symlink ------------------------- 1.10s
/srv/git/saltbox/roles/plex_dupefinder/tasks/main.yml:65 ----------------------
plex_dupefinder : Clone plex_dupefinder --------------------------------- 1.02s
/srv/git/saltbox/roles/plex_dupefinder/tasks/main.yml:21 ----------------------
sanity_check : Find Ansible version ------------------------------------- 0.55s
/srv/git/saltbox/roles/sanity_check/tasks/subtasks/02_ansible_version.yml:10 --
sanity_check : Backup | Check if 'backup.lock' is present --------------- 0.51s
/srv/git/saltbox/roles/sanity_check/tasks/subtasks/05_backup.yml:10 -----------
sanity_check : Logs | Touch 'saltbox.log' ------------------------------- 0.47s
/srv/git/saltbox/roles/sanity_check/tasks/subtasks/06_logs.yml:15 -------------
plex_dupefinder : Import default config --------------------------------- 0.47s
/srv/git/saltbox/roles/plex_dupefinder/tasks/main.yml:49 ----------------------
plex_dupefinder : Create plex_dupefinder directories -------------------- 0.43s
/srv/git/saltbox/roles/plex_dupefinder/tasks/main.yml:10 ----------------------
sanity_check : Logs | Get 'saltbox.yml' info ---------------------------- 0.31s
/srv/git/saltbox/roles/sanity_check/tasks/subtasks/06_logs.yml:10 -------------
sanity_check : Tmp | Create Ansible Temp directories -------------------- 0.30s
/srv/git/saltbox/roles/sanity_check/tasks/subtasks/07_tmp.yml:10 --------------
plex_dupefinder : Check config exists ----------------------------------- 0.30s
/srv/git/saltbox/roles/plex_dupefinder/tasks/main.yml:39 ----------------------
plex_dupefinder : Set plex_dupefinder.py as executable ------------------ 0.29s
/srv/git/saltbox/roles/plex_dupefinder/tasks/main.yml:58 ----------------------
plex_auth_token : Auth Token | Prompt user to login --------------------- 0.14s
/srv/git/saltbox/roles/plex_auth_token/tasks/main.yml:80 ----------------------
plex_auth_token : Change permissions ------------------------------------ 0.11s
/srv/git/saltbox/roles/plex_auth_token/tasks/main.yml:144 ---------------------
sanity_check : Ansible Tags | Ensure valid Ansible tag(s) were provided --- 0.09s
/srv/git/saltbox/roles/sanity_check/tasks/subtasks/04_ansible_tags.yml:18 -----
sanity_check : Settings | Ensure TLS validation isn't used with ZeroSSL --- 0.09s
/srv/git/saltbox/roles/sanity_check/tasks/subtasks/08_settings.yml:10 ---------
plex_auth_token : Auth Token | Add Client Identifier to '/opt/saltbox/plex.ini' --- 0.08s
/srv/git/saltbox/roles/plex_auth_token/tasks/main.yml:97 ----------------------
Simple addition to the docker install where user is logged into docker hub if credentials are provided.
Describe the problem
Current backup implementation is slow and uploads redundant data since it is not incremental.
Describe any solutions you think might work
Duplicacy.
Add a settings.yml option that chooses which media client to install when running saltbox/mediabox tags. Instead of the whole skip tags ordeal.
Implement Authelia as an SSO option.
Hi, is there support for multiple sonarr and radarr instances? I have been using cloudbox on my server and was wondering if arrx or other community roles are possible, or can be installed from cloudbox community branch.
Needs some TLC.
Saltbox should handle Plex TFA cleanly.
Implementation ideas are discussed here:
https://forums.plex.tv/t/authenticating-with-plex/609370
This comes into play when running the initial tag when the server is claimed and in the plex_token.sh script. Seems like this interactive bit could be added up front in the install, though perhaps we can't tell if we'll actually need it until later.
In any case, wanted to get this into the backlog so it isn't forgotten. Personally, I'd like to turn on TFA and leave it on.
Describe the bug
Error when deploying readarr without sonarr.
sonarr_paths_location var used as destination when deploying readarr.
To Reproduce
Steps to reproduce the behavior:
sb install core
sb install readarr
Expected behavior
readarr install
in this file
Add Prometheus and node_exporter.
Deploy node_exporter on host.
node_exporter configuration: --collector.systemd --collector.processes --web.listen-address=172.19.0.1:9100
Deploy Prometheus in container behind basic auth. Access node_exporter through saltbox network bridge.
Currently we redirect to HTTPS on every HTTP request. There may be use cases (Plex) where it could be useful to allow HTTP traffic on a specific container.
Revert back to redirection middleware that is applied on a per container basis to solve this particular headache.
Relevant tasks needing work:
In adv_settings the "proxied" setting is nice, however, would it be worthwhile to have a "proxied-exclusion" setting so that a user can define a single or multiple containers that get excluded from proxy, even if the setting for "proxied" is "yes".
I looked to see if I could find a default ansible variable for this in the plex role but didn't notice one.
Describe the problem
Users will have to edit all relevant containers if they want custom volume mounts.
Describe any solutions you think might work
If roles inherit a global variable in their configuration the user can do wholesale changes in one place if needed or change it on a container basis instead.
For roles that do not require the container to be stopped for configuration we should explore if recreating the container is better since it is built-in in the Ansible docker module.
We should rework the current download path setup currently used as it interferes with roles that want a generic download folder not related to nzb or torrents.
Current suggestion is to change settings.yml option to:
downloads: /mnt/local/downloads
And build the remaining nzb/torrent sub-paths through the inventory system to allow for override capability should the user still need it.
Alternately we could do the following:
downloads:
generic: /mnt/local/downloads
nzbs: /mnt/local/downloads/nzbs
torrents: /mnt/local/downloads/torrents
Tweak settings.yml remote variable to either be a list or provide some other way of mounting multiple mounts. Either defaulting to a union or creating a dictionary so you select the mount profiles per remote.
Roles like calibre have two endpoints and we need to be able to deploy multiple routers per role more easily.
Add https://github.com/crazy-max/diun as a base option for image update notifications.
Try switching to https://github.com/romancin/rutorrent-docker since it includes pyrocore.
Describe the problem
If utilizing multiple *arr roles, you must run them as individual tags setting the variables at runtime. The ability to align all instances of an app for version updates would be a good thing.
Describe any solutions you think might work
Ability to set an inventory variable that takes an array of instance names which would be looped through when the particular tag is run. For example, every time the radarr tag is run, loop through radarr_name instances for radarr, radarr4k, radarrremux, etc.
Additional context
Having a "logging-level" setting for the built in Saltbox apprise alerts. This could include "debug, info, warn, error" for example. It's self explanatory but for example "error" logging would only send alerts when task fail, such as back ups, rather than reporting all the successful runs like it does with todays behavior.
After dictionary merging was marked as deprecated in Ansible the current format makes less sense. Look for solutions to simplify the config files, maybe even go away from separate files and move more settings to the inventory system.
Contemplate adding FreeIPA for Authelia user management instead of the config file.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.