From 23417a9a016bba435cad178a23fd97c8c03cd3e6 Mon Sep 17 00:00:00 2001 From: James Tombleson Date: Sun, 20 Oct 2019 14:51:10 -0700 Subject: [PATCH 1/5] adding docs to the project given I forgot how to use vault. removed sensu as its not getting used currently --- ansible.cfg | 2 +- docs/playbook.md | 2 ++ docs/readme.md | 21 +++++++++++++++ {templates => examples}/hosts.yml | 0 .../sensu_ssl_tool/client/cert.pem | 18 ------------- .../sensu_ssl_tool/client/key.pem | 27 ------------------- .../sensu_ssl_tool/sensu_ca/cacert.pem | 17 ------------ .../sensu_ssl_tool/server/cert.pem | 18 ------------- .../sensu_ssl_tool/server/key.pem | 27 ------------------- playbook/linux/sensu-test.yml | 19 ------------- 10 files changed, 24 insertions(+), 127 deletions(-) create mode 100644 docs/playbook.md create mode 100644 docs/readme.md rename {templates => examples}/hosts.yml (100%) delete mode 100644 playbook/linux/data/store/192.168.0.60/etc/sensu/ssl_generation/sensu_ssl_tool/client/cert.pem delete mode 100644 playbook/linux/data/store/192.168.0.60/etc/sensu/ssl_generation/sensu_ssl_tool/client/key.pem delete mode 100644 playbook/linux/data/store/192.168.0.60/etc/sensu/ssl_generation/sensu_ssl_tool/sensu_ca/cacert.pem delete mode 100644 playbook/linux/data/store/192.168.0.60/etc/sensu/ssl_generation/sensu_ssl_tool/server/cert.pem delete mode 100644 playbook/linux/data/store/192.168.0.60/etc/sensu/ssl_generation/sensu_ssl_tool/server/key.pem delete mode 100644 playbook/linux/sensu-test.yml diff --git a/ansible.cfg b/ansible.cfg index 68f6107..73f9df6 100644 --- a/ansible.cfg +++ b/ansible.cfg @@ -137,7 +137,7 @@ roles_path = ./roles/:/etc/ansible/roles # If set, configures the path to the Vault password file as an alternative to # specifying --vault-password-file on the command line. -#vault_password_file = ./.ansible_vault +vault_password_file = ./.ansible_vault # format of string {{ ansible_managed }} available within Jinja2 # templates indicates to users editing templates files will be replaced. diff --git a/docs/playbook.md b/docs/playbook.md new file mode 100644 index 0000000..aaacfb7 --- /dev/null +++ b/docs/playbook.md @@ -0,0 +1,2 @@ +# Playbooks + diff --git a/docs/readme.md b/docs/readme.md new file mode 100644 index 0000000..d5e3666 --- /dev/null +++ b/docs/readme.md @@ -0,0 +1,21 @@ +# Ansible Docs + +This is the location for my notes with ansible. Hopefully the things I work though will help someone else with learning how ansible functions. + +## Playbooks + +Playbooks should be viewed like the configuration file for you process. This where is where all of your variables and basic tests should be done. Do not treat roles like playbooks! More on that later. + +### Documentation + +YAML allows us to use `#` as a comment value, make use of it. You can write notes for your team about a task with comments. Use them, it wont hurt. + +When you are writing a playbook and you need a quick refresher on what the syntax that a module supports use `ansible-doc moduleName` command. Example: `ansible-doc pip` + +This will give you a quick way to see what flags are supported without having to go to the browser to find out. + +## Vault + +Vaults are a great way to store secrets in your source code. Never store insecure secrets in a file other then for quick testing. Even then, don't put unencrypted secrets in public locations. + + diff --git a/templates/hosts.yml b/examples/hosts.yml similarity index 100% rename from templates/hosts.yml rename to examples/hosts.yml diff --git a/playbook/linux/data/store/192.168.0.60/etc/sensu/ssl_generation/sensu_ssl_tool/client/cert.pem b/playbook/linux/data/store/192.168.0.60/etc/sensu/ssl_generation/sensu_ssl_tool/client/cert.pem deleted file mode 100644 index 0db1db3..0000000 --- a/playbook/linux/data/store/192.168.0.60/etc/sensu/ssl_generation/sensu_ssl_tool/client/cert.pem +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC3TCCAcWgAwIBAgIBAjANBgkqhkiG9w0BAQUFADASMRAwDgYDVQQDDAdTZW5z -dUNBMB4XDTE5MDQyODE3NTMwMloXDTI0MDQyNjE3NTMwMlowITEOMAwGA1UEAwwF -c2Vuc3UxDzANBgNVBAoMBmNsaWVudDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAMBFLZ/mgAOdKJ2YUkqzjZHKsRyvNxixX9I3LWXJCMfFnWuUOLau5UaE -rS6ZbtO1N4djsi6xSyBhPSu2hjPt9KgniTesaKZDwlLO2HLrOpUpmKPPpLxnBym9 -m/nXWaeuTLAnnNtP/wU4Jwvp1u9qMu5tIYdy+hTd5LJSQcfjgrt5ydHzLbwn9UyE -2pcMawEgOaoywY9i6Ofhfsr5hwLkR3/3VS5PfJ2sVsO0Ks2vBW091BaQSwQAarpR -ExMHmTrcHoHtWFI0RiFxZ+MoakL5380VSmzhAs8QPxYWYc3PLndhYt4pH6TLcCOF -LpY8qk6S/acHuWHgdl+GIgyk5jKqnkECAwEAAaMvMC0wCQYDVR0TBAIwADALBgNV -HQ8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQEFBQADggEB -AG/MiB8QHvJlGrF1Xa5UHs/ykFJj1n+JzeniC5p3nApnRmpgi9KNlDZqRXjotuww -uvaDlsRpFp+X4NukUUR8aUUZpwYbIm/wgXJ376Su0nUmpFmCU2TrGkk/cMeqbAen -OYe5WZxsmJnmmkwhHLybrvha/vsCTNV6GY2JcHNhI8R7Uvwna48ueg7/WBQ5oXqZ -zdYXMaFD2ioBFaYZqVifWv+5d1av2VBveX1V5p7ZZ3LHsvNS8/eVWufu5I4mwJI9 -GRPakzY0emL9ZBbtsZtsNA7IA6w4l4WeQtu1DHPc2iYO+JwfpeUNVX65ANSicqjC -ibyhYEZs3qI/rb3WPXy6l0I= ------END CERTIFICATE----- diff --git a/playbook/linux/data/store/192.168.0.60/etc/sensu/ssl_generation/sensu_ssl_tool/client/key.pem b/playbook/linux/data/store/192.168.0.60/etc/sensu/ssl_generation/sensu_ssl_tool/client/key.pem deleted file mode 100644 index 3ca2917..0000000 --- a/playbook/linux/data/store/192.168.0.60/etc/sensu/ssl_generation/sensu_ssl_tool/client/key.pem +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEogIBAAKCAQEAwEUtn+aAA50onZhSSrONkcqxHK83GLFf0jctZckIx8Wda5Q4 -tq7lRoStLplu07U3h2OyLrFLIGE9K7aGM+30qCeJN6xopkPCUs7Ycus6lSmYo8+k -vGcHKb2b+ddZp65MsCec20//BTgnC+nW72oy7m0hh3L6FN3kslJBx+OCu3nJ0fMt -vCf1TITalwxrASA5qjLBj2Lo5+F+yvmHAuRHf/dVLk98naxWw7Qqza8FbT3UFpBL -BABqulETEweZOtwege1YUjRGIXFn4yhqQvnfzRVKbOECzxA/FhZhzc8ud2Fi3ikf -pMtwI4UuljyqTpL9pwe5YeB2X4YiDKTmMqqeQQIDAQABAoIBAFxnovLLa9DQ0jlT -gJFIVAyydoaLqxYiASRdwmK9yIuCbRLL7KnXyncmwri3ouz6lhJqlrMcIDgSo7yD -f2Irxb6fKbJpGO53eEgmAx7P8JrJoANygwDNH0MvTmw31G3jNhYfI6K/gpf2kcWG -//aWep3eMxQO7SPkNMqC//xaWnVQ0FLigNQjyFlgQrIZ3L4x7qFxcrkvTUIODGio -R6hs7fECwXZkvLB28//tiwLEuOHnWGkG64fDebXUBDHsFhY/ObtA9vJITGY2GlUi -1KFt9ZJd1JdMoV7EH5IwnA5YUN1NOtb5bwRaCddCMFH2lWsjzV1hNTZ9MzNyFqIF -eolkKKUCgYEA6xR0LR3/stMPOWvgdaiXACHsH2hLx7Yh1vOf97eBbdUgiqjeL7DW -mUmXIBLOQwrKMWNX0+DAqeuY80ESBmQ5KhRR/Sws2FMXGcqgyNPdJYAruif8y4z9 -0fGdvES1Fe12lOzyfPJclJi6doglyTjoJS5KGXUz8womJH4eiWZd+98CgYEA0WFx -SPttK8Oi9zKxh/6YzpvOaABm6pCUslg79smhPGdhj4M0sO1sS4KzOBBolcplT9e6 -T1awh7ML44dowIFuQ0FgySnz5ogZt6xnqGv6bbfSVbMNpU4B9O4tJ2z16uFOXDeM -f0tS55fcbspJ1Dylc+ndyAurd5E/8z/2BnU6qd8CgYADs6bAryA/qKMsvE4kjCsU -jXQyamoHEw8lW2DBfdpD6H9Cr7YP+jDm6QnAL4uf8qOMc4wGghuGkXcvHW8zOpDL -4NYJrpBmN6i9dztg7jUlSgdmPwr0CZxVmgBp3osbdUnQvopy/T4H+P+2rh4qNQMy -0q/IBthyk05WdMX2U+5W8QKBgFSBwqpVKBvYyyaAZFziKiSBiA47003q6skMia8y -dAwgIaU9rH+YY/QaHWGMZdnHJZrTFBQ/heJPJoY/ucywsKMeeQTYFOO/nLmgMPou -EpZD8fW63dARKwMDOmBGPv78zpazqNYbvatRhJuGs8OgcprVEjlSVHNewXPZJeA3 -YmT7AoGAJuMaSA6oZqn0uKJD0FDwIl4j0RfVhPJHe9Um1G1K2FpZ3DV705kcwx1t -IUu9pHLFJubwpkQFiERX/6BRbjbp4oZhpPLcLRec5nXTT8LHoiCBMaQW2RtnDMeW -XKt2xyhGFp0Drw4vWV0Nr8fJbuBbAqviZTQnBtj7ZJ41KRV1mU4= ------END RSA PRIVATE KEY----- diff --git a/playbook/linux/data/store/192.168.0.60/etc/sensu/ssl_generation/sensu_ssl_tool/sensu_ca/cacert.pem b/playbook/linux/data/store/192.168.0.60/etc/sensu/ssl_generation/sensu_ssl_tool/sensu_ca/cacert.pem deleted file mode 100644 index 73b717b..0000000 --- a/playbook/linux/data/store/192.168.0.60/etc/sensu/ssl_generation/sensu_ssl_tool/sensu_ca/cacert.pem +++ /dev/null @@ -1,17 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICxDCCAaygAwIBAgIJAPX7448uFrdyMA0GCSqGSIb3DQEBBQUAMBIxEDAOBgNV -BAMMB1NlbnN1Q0EwHhcNMTkwNDI4MTc1MjU3WhcNMjQwNDI2MTc1MjU3WjASMRAw -DgYDVQQDDAdTZW5zdUNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -sI4ptnAIEJISxDYMVZIi6vF6GcnzXDyXl4Et9m86QF9+Zyfe4zomGDnfp7wfhddS -6asPHMxcgXi9itY6qr33lzdDL4SaMysS/VwWLBwhmdl2hEELPvUKHBF96iyfuq4A -lsQ3lAXr/3uqXdODNo38hGaxrK2n1ocKFEKZrGlmrFDvfYKJz1cYlDh5u0ghjJGQ -E/MCDeQzGNOjcbSbNUo5nMR8P6nzPcMDHjtA0OS4DXSijvjibHPhZ/NU9KgoTz9W -oL8FoePlL6Zq6cwiEKCOUsqivIPbM3nGGNkPBHmSE0dnYXn0le+LK3rkNX60ZdwE -fqisAIaHSVQWVlTw4J8xlQIDAQABox0wGzAMBgNVHRMEBTADAQH/MAsGA1UdDwQE -AwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAp1MPCS8tKdUGrT07yHosw7+Gxc++/ylM -cmS9GLiwAfU4VU4QEy97ipL4K8VLWbrGVvJSpgxAApLA0jX7R2UcYTYeTk9ikuto -BeQRxcj6QdR8BKD4N7Qtje6jBVMJ6Ssky3Kj1XXcEQu4iZx9uZCX2yeCeozXaLtS -+Tw3r9NjgIXGvhLCp64JTC+rL74S7cMwAIW5YBRy/K4uBdLKBcjYIi7VQnivsfGu -J2+28+kfNw7nNWBdVWtBf6MoJQNEDvpx+HGRBCJoSlgw+GTRgbgCqEPJrXBdbamU -SDJtCEdYonQqUCqqCI083ckx8c31YBg1COTZBQnWQiYVpcIfXG7j/A== ------END CERTIFICATE----- diff --git a/playbook/linux/data/store/192.168.0.60/etc/sensu/ssl_generation/sensu_ssl_tool/server/cert.pem b/playbook/linux/data/store/192.168.0.60/etc/sensu/ssl_generation/sensu_ssl_tool/server/cert.pem deleted file mode 100644 index de6105d..0000000 --- a/playbook/linux/data/store/192.168.0.60/etc/sensu/ssl_generation/sensu_ssl_tool/server/cert.pem +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC3TCCAcWgAwIBAgIBATANBgkqhkiG9w0BAQUFADASMRAwDgYDVQQDDAdTZW5z -dUNBMB4XDTE5MDQyODE3NTI1OVoXDTI0MDQyNjE3NTI1OVowITEOMAwGA1UEAwwF -c2Vuc3UxDzANBgNVBAoMBnNlcnZlcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALEltlZMg7u1rqFbnljmD+IeiVeRt0zzRiCEpjvQ4t+bBjT5onPAOxYI -Q1d3MdPJqA+lyCRP/sXcEKa1l14UDj50WEruK0VqXKL+e2ETeJi4kJb8k8ansCAI -Ask5Ok2d8bTSQLzJBCkjwvR5kfG49R5wfJFDSA3WLfTHq1myRibJIMgbFGB2UP3Q -yyljZWn04IO72yWhK413CxwnwXKsIFT5/z0hVGZMr5wDWpfhBhtBi6uxqeKG3Zyy -CV/f3yUcOL+A9yoxPu155TNYfvmz1rqarTeuOJJJU7TtAiHmue8OhkfRFanBBYj9 -hSOGPdLB9eKzoWsS8vLKLUTwaQwZ9IsCAwEAAaMvMC0wCQYDVR0TBAIwADALBgNV -HQ8EBAMCBSAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDQYJKoZIhvcNAQEFBQADggEB -ABPZUxDIGJ6C8hu1aOj5sY/r8yphotSnPVkghBTGVJbjmGHSci+IGbHX6yemVYvH -mQWKI8qBdroiIpCOpMVvmG6oUR4s+h/vdKuDoy/x3lRZjJDQiReAGKwwyeiG++wJ -x6eSCDGqcIWvk72Zgd+OGym3JGrDpU7ofat+ncqtIunAOh7rhQlyRJ42wYZpWDIi -Aass4yn16aYhF/PppUIsBYrWk1UUlKbXOF/Z7WOG4Hg6h5HwwtJZq/PGsSzJqd/O -s6XI8Am1pU9PwLwWm9Vad44OhTNWGxsidboUCxNa7Yc7p5CkAqT+Z2Lf7RfvgmcX -SUCwSN9REpYGV3k9l47eljY= ------END CERTIFICATE----- diff --git a/playbook/linux/data/store/192.168.0.60/etc/sensu/ssl_generation/sensu_ssl_tool/server/key.pem b/playbook/linux/data/store/192.168.0.60/etc/sensu/ssl_generation/sensu_ssl_tool/server/key.pem deleted file mode 100644 index 7603fc1..0000000 --- a/playbook/linux/data/store/192.168.0.60/etc/sensu/ssl_generation/sensu_ssl_tool/server/key.pem +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEAsSW2VkyDu7WuoVueWOYP4h6JV5G3TPNGIISmO9Di35sGNPmi -c8A7FghDV3cx08moD6XIJE/+xdwQprWXXhQOPnRYSu4rRWpcov57YRN4mLiQlvyT -xqewIAgCyTk6TZ3xtNJAvMkEKSPC9HmR8bj1HnB8kUNIDdYt9MerWbJGJskgyBsU -YHZQ/dDLKWNlafTgg7vbJaErjXcLHCfBcqwgVPn/PSFUZkyvnANal+EGG0GLq7Gp -4obdnLIJX9/fJRw4v4D3KjE+7XnlM1h++bPWupqtN644kklTtO0CIea57w6GR9EV -qcEFiP2FI4Y90sH14rOhaxLy8sotRPBpDBn0iwIDAQABAoIBAFtnsiXlZTO+E1V/ -CL2mOBvc1dExhvtVq6Gr0Hqc1fO68gDzrjc7wUElElpXToaRTv6D9DmIbVV6r7zV -hj0s7Aydy9EeA4XV0+bmmJMGkPt8gF7oBPhEHkTo3UcnGEZkcQt0UaMXteXkZfvv -nrazUQdb02rA5LT/Bsd/H5MwwbHQyipMXKQXpYyzALhoBUrXItc+aHfINHOELs0h -UPSoFnNSsQo1VGSd/TCZJYYw2cpmeTqWO4sM6z8vYXJnNQTCb2saW+vywfQoYTJ7 -V6mSmX7EgYh512jNpNdzhQx8qN1hmWF/r5G9DC4QSnzVoN23fi4H+szB9CEfVlPy -pGj6qUECgYEA1zwPaLjz9XgeZiHrLYDCFeNRYE4Noa9mFuuplYxmiIJGsBiUNHNJ -bbMn8VpuBBptEUnSTCGJhAF39AGKfUHx+49hTKTUISmnTDOSHLeE1mKvZJWB3x4r -3ezfsUVwV4BvidYQEv0FWuE+lniDmx2BVQk7vIiF5VjUxMmyqnB8cEUCgYEA0rLw -LtSYod0VzFLs8NlMH9nhfQk7oSfyxqLVwpiAQVAtrI3xfQUaYP04BrV/XOI+YBcF -Svg4Ou4tqcuGFFYtqNPAaGYfih7UzEY8Z6wH2rkyznCq7VQZexKKtTbPQCNSkJ5h -fpNxfh4sXZSpYg/aIEr6OC8REuhcjRjhJBWJJo8CgYAsPN316j3KMBwfZc1Olu5N -TWGGZ8SJfOGAyIMch7TzTcN1ojej6CYpc+87vhhqo3vTV9bvat020o5zCnYKdKll -yPx4olAvWL5X/SmE2XtmDPZ7t/bvguYFQRBhASKr+Wvzapn3LSYSncUdbDuwgAn7 -DmDGyVCr6OwiXkpomaIZ+QKBgCZIpSOdNW6TwVYy6yKIGTDgYfxaJR+PJqm5BKYr -F4LGksX7tJlGyBg/amKtr8qswTCsfiW1HGJ4zItBk8c2MW2vrBJMHAb4uymyyV78 -/yBa7kRcbHJbCZY3NEThBJ9ey63DWWuqVsDXsq/+RxiuUK/1b6mtw6hv2AE7OA1a -bGU5AoGBANL+ssYI1JH1TFRwI8iTc/no2Loy2jZ2NGyZbU/gc3NhhVERNgtK8nmM -dcYrgmewKKS20+AqqbM7zITYdJea6RTKU6ELJul2iKMDSwA65cEwueqAT6WY7x57 -z0fBzoaLRQp11SSuuPz9p0a096XGygQP1o2SabZCwY4b3+vtkbJM ------END RSA PRIVATE KEY----- diff --git a/playbook/linux/sensu-test.yml b/playbook/linux/sensu-test.yml deleted file mode 100644 index a1de237..0000000 --- a/playbook/linux/sensu-test.yml +++ /dev/null @@ -1,19 +0,0 @@ - -- name: testing sensu - hosts: linux - - tasks: - - name: install sensu server - become: true - import_role: - name: sensu.sensu - vars: - # Sever vars - sensu_deploy_redis_server: true - sensu_deploy_rabbitmq_server: true - sensu_master: true - #sensu_include_plugins: true - sensu_include_dashboard: true - # Client Vars - #sensu_client: true - From 2081ea949b86307e29baac45e39b80e47b25879d Mon Sep 17 00:00:00 2001 From: James Tombleson Date: Sun, 20 Oct 2019 15:46:43 -0700 Subject: [PATCH 2/5] Updated docs --- docs/readme.md | 21 ++++++++++++++++++++- examples/hosts.yml | 4 ++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/docs/readme.md b/docs/readme.md index d5e3666..49ea4f5 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -16,6 +16,25 @@ This will give you a quick way to see what flags are supported without having to ## Vault -Vaults are a great way to store secrets in your source code. Never store insecure secrets in a file other then for quick testing. Even then, don't put unencrypted secrets in public locations. +Vaults are a great way to store secrets in your source code. Never store insecure secrets in a file other then for quick testing. Even then, don't put un-encrypted secrets in public locations. +### Config changes + +Before you use ansible-value you will want to update your ansible.cfg file. Uncomment ```#vault_password_file``` and update it to where you will store your secret file. This is a file that should be added to ```.gitignore``` so that the password is stored safely. For reference I use .ansible_vault as my file and you can see my .gitignore file to see how I ignore it. + +### How to use Vault + +Make sure you adjusted your ansible.cfg before doing this. That password is how vault decrypts values. + +```bash +echo 'secret' > .ansible_vault +ansible-value encrypt_string 'sshPassword' +``` + +With the value that was exported you would add that to the playbook that needs to be able to decrypt the secret to use it. +Something to note. When the password that is stored in .ansible_vault that is defined in ansible.cfg changes, the vault might start to fail to decrypt strings. I have not made it that far yet with vault to confirm how much this is true. + +## Roles + +Roles are very important when it comes to Ansible. If you need to define how say pip handles actions you would build a role for it. With that role you can define how pip would work. Do not treat roles as your playbook. They are meant to be used as a guide and the playbook passes variables to the role to tell it how something should be configured. diff --git a/examples/hosts.yml b/examples/hosts.yml index f5d1bed..df9066d 100644 --- a/examples/hosts.yml +++ b/examples/hosts.yml @@ -7,7 +7,7 @@ all: hosts: 172.20.0.142: vars: - ansible_user: ansible + ansible_user: ansible_connection: ssh ansible_password: ansible_become_method: sudo @@ -17,7 +17,7 @@ all: hosts: dev01: vars: - ansible_user: ansible + ansible_user: ansible_password: ansible_connection: winrm ansible_port: 5985 From c95f1099a053d27d74331c450d0dd5e24a8cb7d3 Mon Sep 17 00:00:00 2001 From: James Tombleson Date: Wed, 23 Oct 2019 15:54:32 -0700 Subject: [PATCH 3/5] Added some Okta work. This lets Ansible become the source of truth soon. Need to work the api module to exact search rather then a fuzzy search. Started to get back into docker to maintain homelab. --- .vscode/settings.json | 8 + ansible.cfg | 9 +- dev.yml | 46 -- inventory/home.yaml | 32 ++ modules/okta_groups.py | 317 ++++++++++++ modules/okta_users.py | 455 ++++++++++++++++++ playbook/{linux => }/docker/InstallDocker.yml | 0 playbook/docker/mediaserver/hydra.yml | 47 ++ playbook/docker/mediaserver/vars.yml | 12 + playbook/linux/docker/deployOwnCloud.yml | 12 - playbook/localhost/okta/debug.yml | 41 ++ playbook/localhost/okta/debugGroupResult.yml | 18 + playbook/localhost/okta/debugUserResult.yml | 32 ++ playbook/localhost/okta/grouptest.yml | 13 + playbook/localhost/okta/okta_role.yml | 39 ++ playbook/localhost/okta/okta_vars.yml | 25 + playbook/localhost/readme.md | 7 + playbook/macos/installDevTools.yml | 1 + roles/luther38.okta/defaults/main.yml | 12 + roles/luther38.okta/tasks/main.yml | 90 ++++ 20 files changed, 1155 insertions(+), 61 deletions(-) create mode 100644 .vscode/settings.json delete mode 100644 dev.yml create mode 100644 inventory/home.yaml create mode 100644 modules/okta_groups.py create mode 100644 modules/okta_users.py rename playbook/{linux => }/docker/InstallDocker.yml (100%) create mode 100644 playbook/docker/mediaserver/hydra.yml create mode 100644 playbook/docker/mediaserver/vars.yml delete mode 100644 playbook/linux/docker/deployOwnCloud.yml create mode 100644 playbook/localhost/okta/debug.yml create mode 100644 playbook/localhost/okta/debugGroupResult.yml create mode 100644 playbook/localhost/okta/debugUserResult.yml create mode 100644 playbook/localhost/okta/grouptest.yml create mode 100644 playbook/localhost/okta/okta_role.yml create mode 100644 playbook/localhost/okta/okta_vars.yml create mode 100644 playbook/localhost/readme.md create mode 100644 roles/luther38.okta/defaults/main.yml create mode 100644 roles/luther38.okta/tasks/main.yml diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..ad63129 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "cSpell.ignoreWords": [ + "ansible", + "okta", + "specialcounsel", + "vault" + ] +} \ No newline at end of file diff --git a/ansible.cfg b/ansible.cfg index 73f9df6..e65f6b8 100644 --- a/ansible.cfg +++ b/ansible.cfg @@ -11,8 +11,11 @@ # some basic default values... -inventory = ./hosts -library = /usr/share/my_modules/ +inventory = ./inventory/ +#library = /usr/share/my_modules/:./modules/ + +# Looks like modules can only be pointed to a single directory +library = ./modules/ module_utils = /usr/share/my_module_utils/ remote_tmp = ~/.ansible/tmp local_tmp = ~/.ansible/tmp @@ -255,7 +258,7 @@ vault_password_file = ./.ansible_vault # You can enable this feature by setting retry_files_enabled to True # and you can change the location of the files by setting retry_files_save_path -#retry_files_enabled = False +retry_files_enabled = False #retry_files_save_path = ~/.ansible-retry # squash actions diff --git a/dev.yml b/dev.yml deleted file mode 100644 index 7296023..0000000 --- a/dev.yml +++ /dev/null @@ -1,46 +0,0 @@ ---- -all: - hosts: - dmi-dev01: - children: - linux: - hosts: - 172.20.0.142: - vars: - ansible_user: ansible - ansible_connection: ssh - ansible_password: !vault | - $ANSIBLE_VAULT;1.1;AES256 - 33353561613531336536313335356236643530346538373638653330306636386435633965336136 - 3464366635373661383466333464663238663565343839310a376666386237313566386235633739 - 66323434636365303335326133396137393031396531313533326263363066636237313139353538 - 6134616232336365610a363033343639616563316330363966326330646162613034633532366230 - 3439 - ansible_become_method: sudo - ansible_become_pass: !vault | - $ANSIBLE_VAULT;1.1;AES256 - 33353561613531336536313335356236643530346538373638653330306636386435633965336136 - 3464366635373661383466333464663238663565343839310a376666386237313566386235633739 - 66323434636365303335326133396137393031396531313533326263363066636237313139353538 - 6134616232336365610a363033343639616563316330363966326330646162613034633532366230 - 3439 - ansible_python_interpreter: /usr/bin/python3 - windows: - hosts: - dmi-dev01: - vars: - ansible_user: svcansible - ansible_password: !vault | - $ANSIBLE_VAULT;1.1;AES256 - 33353561613531336536313335356236643530346538373638653330306636386435633965336136 - 3464366635373661383466333464663238663565343839310a376666386237313566386235633739 - 66323434636365303335326133396137393031396531313533326263363066636237313139353538 - 6134616232336365610a363033343639616563316330363966326330646162613034633532366230 - 3439 - ansible_connection: winrm - ansible_port: 5985 - ansible_winrm_scheme: http - ansible_winrm_transport: ntlm - ansible_winrm_server_cert_validation: ignore - - diff --git a/inventory/home.yaml b/inventory/home.yaml new file mode 100644 index 0000000..39a6d0a --- /dev/null +++ b/inventory/home.yaml @@ -0,0 +1,32 @@ +--- +all: + hosts: + + children: + linux: + 192.160.0.60 + vars: + ansible_user: !vault | + $ANSIBLE_VAULT;1.1;AES256 + 33393963653363383638373235363531386238626138366632336531663437373634333766656437 + 3462613266323931343431616465623439626534646238640a616461633434626631376266383234 + 61386535373738386632626331353665643137373234323566326633386234666534616330306639 + 3739633437353337380a373437643563663163653834653637363861663639363635333866613435 + 6636 + ansible_password: !vault | + $ANSIBLE_VAULT;1.1;AES256 + 62386164373234666130346666653866663136623261386364636632303430616135343132303631 + 3632316465666237613232313761353135316433376562360a633931646238326139336532373633 + 32666636326332346536366165373030346265626633646335303033636337333336323164636338 + 3036393466633634640a313262373661623731623639343565653061663830303537666136346165 + 3834 + ansible_connection: ssh + ansible_become_method: sudo + ansible_become_pass: !vault | + $ANSIBLE_VAULT;1.1;AES256 + 62386164373234666130346666653866663136623261386364636632303430616135343132303631 + 3632316465666237613232313761353135316433376562360a633931646238326139336532373633 + 32666636326332346536366165373030346265626633646335303033636337333336323164636338 + 3036393466633634640a313262373661623731623639343565653061663830303537666136346165 + 3834 + ansible_python_interpreter: /usr/bin/python3 diff --git a/modules/okta_groups.py b/modules/okta_groups.py new file mode 100644 index 0000000..7d5991f --- /dev/null +++ b/modules/okta_groups.py @@ -0,0 +1,317 @@ +#!/usr/bin/python +# (c) 2019, Whitney Champion +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +ANSIBLE_METADATA = {'metadata_version': '1.0', + 'status': ['preview'], + 'supported_by': 'community'} + +DOCUMENTATION = """ +module: okta_groups +short_description: Communicate with the Okta API to manage groups +description: + - The Okta groups module manages Okta groups +version_added: "1.0" +author: "Whitney Champion (@shortstack)" +options: + organization: + description: + - Okta subdomain for your organization. (i.e. + mycompany.okta.com). + required: false + default: None + api_key: + description: + - Okta API key. + required: false + default: None + action: + description: + - Action to take against groups API. + required: false + default: list + choices: [ create, update, delete, list, add_user, remove_user ] + id: + description: + - ID of the group. + required: false + default: None + name: + description: + - Group name. + required: false + default: None + description: + description: + - Group description. + required: false + default: yes + limit: + description: + - List limit. + required: false + default: 200 + user_id: + description: + - ID of user to add to group. + required: false + default: None +""" + +EXAMPLES = ''' +# List groups +- okta_groups: + organization: "unicorns" + api_key: "TmHvH4LY9HH9MDRDiLChLGwhRjHsarTCBzpwbua3ntnQ" + limit: 200 + +# Create group +- okta_groups: + action: create + organization: "unicorns" + api_key: "TmHvH4LY9HH9MDRDiLChLGwhRjHsarTCBzpwbua3ntnQ" + name: "Imaginary Creatures" + description: "They are so majestic" + +# Update group +- okta_groups: + action: update + organization: "unicorns" + api_key: "TmHvH4LY9HH9MDRDiLChLGwhRjHsarTCBzpwbua3ntnQ" + id: "01c5pEucucMPWXjFM457" + name: "Imaginary Creatures" + description: "They are so majestic and beautiful" + +# Add user to group +- okta_groups: + action: add_user + organization: "unicorns" + api_key: "TmHvH4LY9HH9MDRDiLChLGwhRjHsarTCBzpwbua3ntnQ" + id: "01c5pEucucMPWXjFM457" + user_id: "01c5pEucucMPWXjFM456" + +# Remove user from group +- okta_groups: + action: remove_user + organization: "unicorns" + api_key: "TmHvH4LY9HH9MDRDiLChLGwhRjHsarTCBzpwbua3ntnQ" + id: "01c5pEucucMPWXjFM457" + user_id: "01c5pEucucMPWXjFM456" + +# Delete group +- okta_groups: + action: delete + organization: "unicorns" + api_key: "TmHvH4LY9HH9MDRDiLChLGwhRjHsarTCBzpwbua3ntnQ" + id: "01c5pEucucMPWXjFM457" +''' + +RETURN = r''' +json: + description: The JSON response from the Okta API + returned: always + type: complex +msg: + description: The HTTP message from the request + returned: always + type: str + sample: OK (unknown bytes) +status: + description: The HTTP status code from the request + returned: always + type: int + sample: 200 +url: + description: The actual URL used for the request + returned: always + type: str + sample: https://www.ansible.com/ +''' + +def create(module,base_url,api_key,name,description): + + headers = '{ "Content-Type": "application/json", "Authorization": "SSWS %s", "Accept": "application/json" }' % (api_key) + + payload = {} + profile = {} + + if name is not None: + profile['name'] = name + if description is not None: + profile['description'] = description + + payload['profile'] = profile + + url = base_url + + response, info = fetch_url(module=module, url=url, headers=json.loads(headers), method='POST', data=module.jsonify(payload)) + + if info['status'] != 200: + module.fail_json(msg="Fail: %s" % ( "Status: "+str(info['msg']) + ", Message: " + str(info['body']))) + + try: + content = response.read() + except AttributeError: + content = info.pop('body', '') + + return info['status'], info['msg'], content, url + +def update(module,base_url,api_key,id,name,description): + + headers = '{ "Content-Type": "application/json", "Authorization": "SSWS %s", "Accept": "application/json" }' % (api_key) + + payload = {} + profile = {} + + if name is not None: + profile['name'] = name + if description is not None: + profile['description'] = description + + payload['profile'] = profile + + url = base_url+"/%s" % (id) + + response, info = fetch_url(module=module, url=url, headers=json.loads(headers), method='PUT', data=module.jsonify(payload)) + + if info['status'] != 200: + module.fail_json(msg="Fail: %s" % ( "Status: "+str(info['msg']) + ", Message: " + str(info['body']))) + + try: + content = response.read() + except AttributeError: + content = info.pop('body', '') + + return info['status'], info['msg'], content, url + +def delete(module,base_url,api_key,id): + + headers = '{ "Content-Type": "application/json", "Authorization": "SSWS %s", "Accept": "application/json" }' % (api_key) + + url = base_url+"/%s" % (id) + + response, info = fetch_url(module=module, url=url, headers=json.loads(headers), method='DELETE') # delete + + if info['status'] != 204: + module.fail_json(msg="Fail: %s" % ( "Status: "+str(info['msg']) + ", Message: " + str(info['body']))) + + try: + content = response.read() + except AttributeError: + content = info.pop('body', '') + + return info['status'], info['msg'], content, url + +def list(module,base_url,api_key,limit): + + headers = '{ "Content-Type": "application/json", "Authorization": "SSWS %s", "Accept": "application/json" }' % (api_key) + + url = base_url+"/?limit=%s" % (limit) + + response, info = fetch_url(module=module, url=url, headers=json.loads(headers), method='GET') + + if info['status'] != 200: + module.fail_json(msg="Fail: %s" % ( "Status: "+str(info['msg']) + ", Message: " + str(info['body']))) + + try: + content = response.read() + except AttributeError: + content = info.pop('body', '') + + return info['status'], info['msg'], content, url + +def add_user(module,base_url,api_key,id,user_id): + + headers = '{ "Content-Type": "application/json", "Authorization": "SSWS %s", "Accept": "application/json" }' % (api_key) + + url = base_url+"/%s/users/%s" % (id,user_id) + + response, info = fetch_url(module=module, url=url, headers=json.loads(headers), method='PUT') + + if info['status'] != 204: + module.fail_json(msg="Fail: %s" % ( "Status: "+str(info['msg']) + ", Message: " + str(info['body']))) + + try: + content = response.read() + except AttributeError: + content = info.pop('body', '') + + return info['status'], info['msg'], content, url + +def remove_user(module,base_url,api_key,id,user_id): + + headers = '{ "Content-Type": "application/json", "Authorization": "SSWS %s", "Accept": "application/json" }' % (api_key) + + url = base_url+"/%s/users/%s" % (id,user_id) + + response, info = fetch_url(module=module, url=url, headers=json.loads(headers), method='DELETE') + + if info['status'] != 204: + module.fail_json(msg="Fail: %s" % ( "Status: "+str(info['msg']) + ", Message: " + str(info['body']))) + try: + content = response.read() + except AttributeError: + content = info.pop('body', '') + + return info['status'], info['msg'], content, url + +def main(): + module = AnsibleModule( + argument_spec = dict( + organization = dict(type='str', default=None), + api_key = dict(type='str', no_log=True), + action = dict(type='str', default='list', choices=['create', 'update', 'delete', 'list', 'add_user', 'remove_user']), + id = dict(type='str', default=None), + user_id = dict(type='str', default=None), + name = dict(type='str', default=None), + description = dict(type='str', default=None), + limit = dict(type='int', default=200) + ) + ) + + organization = module.params['organization'] + api_key = module.params['api_key'] + action = module.params['action'] + id = module.params['id'] + user_id = module.params['user_id'] + name = module.params['name'] + description = module.params['description'] + limit = module.params['limit'] + + base_url = "https://%s-admin.okta.com/api/v1/groups" % (organization) + + if action == "create": + status, message, content, url = create(module,base_url,api_key,name,description) + elif action == "update": + status, message, content, url = update(module,base_url,api_key,id,name,description) + elif action == "delete": + status, message, content, url = delete(module,base_url,api_key,id) + elif action == "list": + status, message, content, url = list(module,base_url,api_key,limit) + elif action == "add_user": + status, message, content, url = add_user(module,base_url,api_key,id,user_id) + elif action == "remove_user": + status, message, content, url = remove_user(module,base_url,api_key,id,user_id) + + uresp = {} + content = to_text(content, encoding='UTF-8') + + try: + js = json.loads(content) + except ValueError, e: + js = "" + + uresp['json'] = js + uresp['status'] = status + uresp['msg'] = message + uresp['url'] = url + + module.exit_json(**uresp) + +# import module snippets +import json +from ansible.module_utils.basic import * +from ansible.module_utils.urls import * + +if __name__ == '__main__': + main() diff --git a/modules/okta_users.py b/modules/okta_users.py new file mode 100644 index 0000000..7e4eb48 --- /dev/null +++ b/modules/okta_users.py @@ -0,0 +1,455 @@ +#!/usr/bin/python +# (c) 2019, Whitney Champion +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +ANSIBLE_METADATA = {'metadata_version': '1.0', + 'status': ['preview'], + 'supported_by': 'community'} + +DOCUMENTATION = """ +module: okta_users +short_description: Communicate with the Okta API to manage users +description: + - The Okta user module manages Okta users +version_added: "1.0" +author: "Whitney Champion (@shortstack)" +options: + organization: + description: + - Okta subdomain for your organization. (i.e. + mycompany.okta.com). + required: false + default: None + api_key: + description: + - Okta API key. + required: false + default: None + action: + description: + - Action to take against user API. + required: false + default: list + choices: [ create, update, delete, list, activate, deactivate ] + id: + description: + - ID of the user. + required: false + default: None + login: + description: + - Username. + required: false + default: None + activate: + description: + - Whether or not the new user is activate. + required: false + default: yes + password: + description: + - Password. + required: false + default: None + first_name: + description: + - First name. + required: false + default: None + last_name: + description: + - Last name. + required: false + default: None + email: + description: + - Email. + required: false + default: None + group_ids: + description: + - List of Group IDs to add the user to. + required: false + default: None + limit: + description: + - List limit. + required: false + default: 25 +""" + +EXAMPLES = ''' +# List users +- okta_users: + organization: "unicorns" + api_key: "TmHvH4LY9HH9MDRDiLChLGwhRjHsarTCBzpwbua3ntnQ" + limit: 25 + +# Create user +- okta_users: + action: create + organization: "unicorns" + api_key: "TmHvH4LY9HH9MDRDiLChLGwhRjHsarTCBzpwbua3ntnQ" + login: "whitney@unicorns.lol" + first_name: "Whitney" + last_name: "Champion" + email: "whitney@unicorns.lol" + password: "cookiesaredelicious" + activate: yes + +# Create user in group(s) +- okta_users: + action: create + organization: "unicorns" + api_key: "TmHvH4LY9HH9MDRDiLChLGwhRjHsarTCBzpwbua3ntnQ" + login: "whitney@unicorns.lol" + first_name: "Whitney" + last_name: "Champion" + email: "whitney@unicorns.lol" + password: "cookiesaredelicious" + group_ids: + - "00f5b3gqiLpE114tV2M7" + activate: yes + +# Create multiple users in group +- okta_users: + action: create + organization: "crypto" + api_key: "TmHvH4LY9HH9MDRDiLChLGwhRjHsarTCBzpwbua3ntnQ" + login: "{{ item.login }}" + first_name: "{{ item.first_name }}" + last_name: "{{ item.last_name }}" + email: "{{ item.email }}" + password: "{{ item.password }}" + group_ids: + - "00f5b3gqiLpE324tV2M7" + activate: "{{ item.activate }}" + with_items: + - { login: "alice@aol.com", first_name: "Alice", last_name: "A", email: "alice@aolcom", password: "ilovebob111", activate: yes } + - { login: "bob@aol.com", first_name: "Bob", last_name: "B", email: "bob@aolcom", password: "ilovealice111", activate: yes } + +# Update user's email address +- okta_users: + action: update + organization: "unicorns" + api_key: "TmHvH4LY9HH9MDRDiLChLGwhRjHsarTCBzpwbua3ntnQ" + id: "01c5pEucucMPWXjFM456" + email: "whitney@ihateunicorns.lol" + +# Activate user +- okta_users: + action: activate + organization: "unicorns" + api_key: "TmHvH4LY9HH9MDRDiLChLGwhRjHsarTCBzpwbua3ntnQ" + id: "01c5pEucucMPWXjFM456" + +# Deactivate user +- okta_users: + action: deactivate + organization: "unicorns" + api_key: "TmHvH4LY9HH9MDRDiLChLGwhRjHsarTCBzpwbua3ntnQ" + id: "01c5pEucucMPWXjFM456" + +# Delete user +- okta_users: + action: delete + organization: "unicorns" + api_key: "TmHvH4LY9HH9MDRDiLChLGwhRjHsarTCBzpwbua3ntnQ" + id: "01c5pEucucMPWXjFM456" + +# Get a list of groups a user is in +- okta_users: + action: usergroups + organization: "unicorns" + api_key: "TmHvH4LY9HH9MDRDiLChLGwhRjHsarTCBzpwbua3ntnQ" + id: "01c5pEucucMPWXjFM456" + + +''' + +RETURN = r''' +json: + description: The JSON response from the Okta API + returned: always + type: complex +msg: + description: The HTTP message from the request + returned: always + type: str + sample: OK (unknown bytes) +status: + description: The HTTP status code from the request + returned: always + type: int + sample: 200 +url: + description: The actual URL used for the request + returned: always + type: str + sample: https://www.ansible.com/ +''' + +def create(module,base_url,api_key,login,password_input,email,first_name,last_name,group_ids,activate): + + headers = '{ "Content-Type": "application/json", "Authorization": "SSWS %s", "Accept": "application/json" }' % (api_key) + + payload = {} + profile = {} + credentials = {} + password = {} + groupIds= [] + + if first_name is not None: + profile['firstName'] = first_name + if last_name is not None: + profile['lastName'] = last_name + if email is not None: + profile['email'] = email + if login is not None: + profile['login'] = login + if password_input is not None: + password['value'] = password_input + if group_ids is not None: + groupIds = group_ids + + credentials['password'] = password + payload['credentials'] = credentials + payload['groupIds'] = groupIds + payload['profile'] = profile + + url = base_url+"?activate=%s" % (activate) + + response, info = fetch_url(module=module, url=url, headers=json.loads(headers), method='POST', data=module.jsonify(payload)) + + if info['status'] != 200: + module.fail_json(msg="Fail: %s" % ( "Status: "+str(info['msg']) + ", Message: " + str(info['body']))) + + try: + content = response.read() + except AttributeError: + content = info.pop('body', '') + + return info['status'], info['msg'], content, url + +def update(module,base_url,api_key,id,login,email,first_name,last_name): + + headers = '{ "Content-Type": "application/json", "Authorization": "SSWS %s", "Accept": "application/json" }' % (api_key) + + url = base_url+"/%s" % (id) + + payload = {} + profile = {} + + if first_name is not None: + profile['firstName'] = first_name + if last_name is not None: + profile['lastName'] = last_name + if email is not None: + profile['email'] = email + if login is not None: + profile['login'] = login + + payload['profile'] = profile + + response, info = fetch_url(module=module, url=url, headers=json.loads(headers), method='POST', data=module.jsonify(payload)) + + if info['status'] != 200: + module.fail_json(msg="Fail: %s" % ( "Status: "+str(info['msg']) + ", Message: " + str(info['body']))) + + try: + content = response.read() + except AttributeError: + content = info.pop('body', '') + + return info['status'], info['msg'], content, url + +def delete(module,base_url,api_key,id): + + headers = '{ "Content-Type": "application/json", "Authorization": "SSWS %s", "Accept": "application/json" }' % (api_key) + + url = base_url+"/%s" % (id) + + response, info = fetch_url(module=module, url=url, headers=json.loads(headers), method='DELETE') + + if info['status'] != 204: + module.fail_json(msg="Fail: %s" % ( "Status: "+str(info['msg']) + ", Message: " + str(info['body']))) + + try: + content = response.read() + except AttributeError: + content = info.pop('body', '') + + return info['status'], info['msg'], content, url + +def activate(module,base_url,api_key,id): + + headers = '{ "Content-Type": "application/json", "Authorization": "SSWS %s", "Accept": "application/json" }' % (api_key) + + url = base_url+"/%s/lifecycle/activate" % (id) + + response, info = fetch_url(module=module, url=url, headers=json.loads(headers), method='POST') + + if info['status'] != 200: + module.fail_json(msg="Fail: %s" % ( "Status: "+str(info['msg']) + ", Message: " + str(info['body']))) + + try: + content = response.read() + except AttributeError: + content = info.pop('body', '') + + return info['status'], info['msg'], content, url + +def deactivate(module,base_url,api_key,id): + + headers = '{ "Content-Type": "application/json", "Authorization": "SSWS %s", "Accept": "application/json" }' % (api_key) + + url = base_url+"/%s/lifecycle/deactivate" % (id) + + response, info = fetch_url(module=module, url=url, headers=json.loads(headers), method='POST') + + if info['status'] != 200: + module.fail_json(msg="Fail: %s" % ( "Status: "+str(info['msg']) + ", Message: " + str(info['body']))) + + try: + content = response.read() + except AttributeError: + content = info.pop('body', '') + + return info['status'], info['msg'], content, url + +def list(module,base_url,api_key,limit): + + headers = '{ "Content-Type": "application/json", "Authorization": "SSWS %s", "Accept": "application/json" }' % (api_key) + + url = base_url+"/?limit=%s" % (limit) + + response, info = fetch_url(module=module, url=url, headers=json.loads(headers), method='GET') + + if info['status'] != 200: + module.fail_json(msg="Fail: %s" % ( "Status: "+str(info['msg']) + ", Message: " + str(info['body']))) + + try: + content = response.read() + except AttributeError: + content = info.pop('body', '') + + return info['status'], info['msg'], content, url + +def findByLogin(module, base_url, api_key, login): + headers = '{ "Content-Type": "application/json", "Authorization": "SSWS %s", "Accept": "application/json" }' % (api_key) + #url = base_url+"?q=%s&limit=1" % (login) + url = base_url+"?filter=profile.login+eq+\"%s\"" % (login) + response, info = fetch_url(module=module, url=url, headers=json.loads(headers), method='GET') + if info['status'] != 200: + module.fail_json(msg="Fail: %s" % ( "Status: "+str(info['msg']) + ", Message: " + str(info['body']))) + try: + content = response.read() + except AttributeError: + content = info.pop('body', '') + return info['status'], info['msg'], content, url + +def findByName(module, base_url, api_key, Name): + headers = '{ "Content-Type": "application/json", "Authorization": "SSWS %s", "Accept": "application/json" }' % (api_key) + url = base_url+"?q=%s&limit=1" % (Name) + response, info = fetch_url(module=module, url=url, headers=json.loads(headers), method='GET') + if info['status'] != 200: + module.fail_json(msg="Fail: %s" % ( "Status: "+str(info['msg']) + ", Message: " + str(info['body']))) + try: + content = response.read() + except AttributeError: + content = info.pop('body', '') + return info['status'], info['msg'], content, url + +def getusergroups(module, base_url, api_key, id): + headers = '{ "Content-Type": "application/json", "Authorization": "SSWS %s", "Accept": "application/json" }' % (api_key) + url = base_url+"/%s/groups" % (id) + response, info = fetch_url(module=module, url=url, headers=json.loads(headers), method='GET') + + if info['status'] != 200: + module.fail_json(msg="Fail: %s" % ( "Status: "+str(info['msg']) + ", Message: " + str(info['body']))) + + try: + content = response.read() + except AttributeError: + content = info.pop('body', '') + + return info['status'], info['msg'], content, url + +def main(): + module = AnsibleModule( + argument_spec = dict( + organization = dict(type='str', default=None), + api_key = dict(type='str', no_log=True), + action = dict(type='str', default='list', choices=['create', 'update', 'delete', 'list', 'activate', 'deactivate', 'usergroups']), + id = dict(type='str', default=None), + login = dict(type='str', default=None), + password = dict(type='str', default=None, no_log=True), + first_name = dict(type='str', default=None), + last_name = dict(type='str', default=None), + email = dict(type='str', default=None), + group_ids = dict(type='list', default=None), + limit = dict(type='int', default=25), + activate = dict(type='bool', default='yes') + ) + ) + + organization = module.params['organization'] + api_key = module.params['api_key'] + action = module.params['action'] + id = module.params['id'] + login = module.params['login'] + password = module.params['password'] + first_name = module.params['first_name'] + last_name = module.params['last_name'] + email = module.params['email'] + group_ids = module.params['group_ids'] + limit = module.params['limit'] + activate = module.params['activate'] + + base_url = "https://%s-admin.okta.com/api/v1/users" % (organization) + + if action == "create": + status, message, content, url = create(module,base_url,api_key,login,password,email,first_name,last_name,group_ids,activate) + elif action == "update": + status, message, content, url = update(module,base_url,api_key,id,login,email,first_name,last_name) + elif action == "delete": + status, message, content, url = deactivate(module,base_url,api_key,id) + status, message, content, url = delete(module,base_url,api_key,id) + elif action == "activate": + status, message, content, url = activate(module,base_url,api_key,id) + elif action == "deactivate": + status, message, content, url = deactivate(module,base_url,api_key,id) + elif action == "list": + if login is not None: + status, message, content, url = findByLogin(module,base_url,api_key,login) + elif first_name is not None: + status, message, content, url = findByName(module,base_url,api_key, first_name) + elif last_name is not None: + status, message, content, url = findByName(module,base_url,api_key,last_name) + else: + status, message, content, url = list(module,base_url,api_key,limit) + elif action == "usergroups": + status, message, content, url = getusergroups(module, base_url, api_key, id) + + uresp = {} + content = to_text(content, encoding='UTF-8') + + try: + js = json.loads(content) + except ValueError, e: + js = "" + + uresp['json'] = js + uresp['status'] = status + uresp['msg'] = message + uresp['url'] = url + + module.exit_json(**uresp) + +# import module snippets +import json +from ansible.module_utils.basic import * +from ansible.module_utils.urls import * + +if __name__ == '__main__': + main() diff --git a/playbook/linux/docker/InstallDocker.yml b/playbook/docker/InstallDocker.yml similarity index 100% rename from playbook/linux/docker/InstallDocker.yml rename to playbook/docker/InstallDocker.yml diff --git a/playbook/docker/mediaserver/hydra.yml b/playbook/docker/mediaserver/hydra.yml new file mode 100644 index 0000000..1380c94 --- /dev/null +++ b/playbook/docker/mediaserver/hydra.yml @@ -0,0 +1,47 @@ +--- +# https://github.com/linuxserver/docker-hydra2 +- name: Media Server + hosts: localhost + vars_files: + - vars.yml + + tasks: + - name: pip docker + pip: + name: docker + + - name: Hydra Config + docker_volume: + name: "{{ hydra_config }}" + state: present + + - name: Volume Shared Downloads + docker_volume: + name: "{{ shared_downloads }}" + state: present + + - name: Hydra Network + docker_network: + name: "{{ network }}" + + - name: stop hydra + docker_container: + name: hydra + state: stopped + + - name: Make Hydra + docker_container: + name: hydra + image: linuxserver/hydra2 + state: started + env: + PUID=1000 + PGID=1000 + TZ=Europe/London + ports: + - 5076:5076 + volumes: + - "{{ hydra_config }}:/config" + - "{{ shared_downloads }}:/downloads" + networks: + - name: "{{ network }}" \ No newline at end of file diff --git a/playbook/docker/mediaserver/vars.yml b/playbook/docker/mediaserver/vars.yml new file mode 100644 index 0000000..f9b6e10 --- /dev/null +++ b/playbook/docker/mediaserver/vars.yml @@ -0,0 +1,12 @@ +--- +# Volumes +sonarr_data: sonarr_data +sonarr_config: sonarr_config + +osx_sonarr_data: ~/doc + +hydra_config: hydra_config +shared_downloads: media_downloads + +# Networks +network: net_hydra \ No newline at end of file diff --git a/playbook/linux/docker/deployOwnCloud.yml b/playbook/linux/docker/deployOwnCloud.yml deleted file mode 100644 index 30093c0..0000000 --- a/playbook/linux/docker/deployOwnCloud.yml +++ /dev/null @@ -1,12 +0,0 @@ - -- name: Deploy OwnCloud - hosts: linux - become_method: sudo - - tasks: - - name: Check if docker is installed. - apt: - name: docker - state: present - - \ No newline at end of file diff --git a/playbook/localhost/okta/debug.yml b/playbook/localhost/okta/debug.yml new file mode 100644 index 0000000..067a3c2 --- /dev/null +++ b/playbook/localhost/okta/debug.yml @@ -0,0 +1,41 @@ +--- +- name: maintain okta users + hosts: localhost + vars_files: + - okta_vars.yml + + vars: + first_name: API + last_name: Test + email: "{{ email_deleteme }}" + login: "{{ email_deleteme }}" + isActive: True + + tasks: + - name: Check for {{ login }} + okta_users: + organization: "{{ org }}" + api_key: "{{ api }}" + action: list + login: "{{ login }}" + register: oktalist + + - name: debug + debug: + msg: "{{ oktalist }}" + + + + # if the account is not found, make it + #- name: Create {{ login }} + # okta_users: + ## organization: "{{ organization }}" + # api_key: "{{ api_key }}" +# action: create +# login: "{{ login }}" +# email: "{{ email }}" +# first_name: "{{ first_name }}" +# last_name: "{{ last_name }}" +# when: +# - oktalist['json'] is not defined +# - isActive|bool == True \ No newline at end of file diff --git a/playbook/localhost/okta/debugGroupResult.yml b/playbook/localhost/okta/debugGroupResult.yml new file mode 100644 index 0000000..cbca8d7 --- /dev/null +++ b/playbook/localhost/okta/debugGroupResult.yml @@ -0,0 +1,18 @@ +--- +- name: Debug Okta Groups + hosts: localhost + vars_files: okta_vars.yml + + tasks: + - name: Get Okta Group + okta_groups: + organization: "{{ org }}" + api_key: "{{ api }}" + action: list + limit: 200 + register: res + + - name: show res + debug: + msg: "{{ item.profile.name }} {{ item.id }}" + loop: "{{ res.json }}" diff --git a/playbook/localhost/okta/debugUserResult.yml b/playbook/localhost/okta/debugUserResult.yml new file mode 100644 index 0000000..744d76b --- /dev/null +++ b/playbook/localhost/okta/debugUserResult.yml @@ -0,0 +1,32 @@ + +- name: Show okta_users result + hosts: localhost + vars_files: okta_vars.yml + + #include_vars: okta_vars.yml + + tasks: + - name: list 1 + okta_users: + organization: "{{ org }}" + api_key: "{{ api }}" + action: list + email: "{{ email_deleteme }}" + #limit: 1 + register: res + + - name: display result + debug: + msg: "{{ res.json }}" + + - name: user groups + okta_users: + organization: "{{ org }}" + api_key: "{{ api }}" + action: usergroups + id: "{{ res.json.0.id }}" + register: grps + + - name: display groups + debug: + msg: "{{ grps }}" diff --git a/playbook/localhost/okta/grouptest.yml b/playbook/localhost/okta/grouptest.yml new file mode 100644 index 0000000..9ef98e9 --- /dev/null +++ b/playbook/localhost/okta/grouptest.yml @@ -0,0 +1,13 @@ +--- +- name: Group Test + hosts: localhost + vars_files: okta_vars.yml + + tasks: + - name: add group + okta_groups: + organization: "{{ org }}" + api_key: "{{ api }}" + action: add_user + id: "00g1jfcegwGw1Lsuh357" + user_id: 00u1kekdg8ewrmdmt357 \ No newline at end of file diff --git a/playbook/localhost/okta/okta_role.yml b/playbook/localhost/okta/okta_role.yml new file mode 100644 index 0000000..08b90ed --- /dev/null +++ b/playbook/localhost/okta/okta_role.yml @@ -0,0 +1,39 @@ + +- name: maintain okta users + hosts: localhost + vars_files: + - okta_vars.yml + + tasks: + - name: manage delete.me + include_role: + name: luther38.okta + vars: + organization: "{{ org }}" + api_key: "{{ api }}" + first_name: API + last_name: Test + email: "{{ email_deleteme }}" + login: "{{ email_deleteme }}" + isActive: True + add_groups: + #- 00g1jfcegwGw1Lsuh357 + remove_groups: + - 00g1jfcegwGw1Lsuh357 + + - name: delete me2 + include_role: + name: luther38.okta + vars: + organization: "{{ org }}" + api_key: "{{ api }}" + first_name: API + last_name: Test2 + email: "{{ email_deleteme2 }}" + login: "{{ email_deleteme2 }}" + isActive: True + add_groups: + #- 00g1jfcegwGw1Lsuh357 + remove_groups: + - 00g1jfcegwGw1Lsuh357 + diff --git a/playbook/localhost/okta/okta_vars.yml b/playbook/localhost/okta/okta_vars.yml new file mode 100644 index 0000000..dd6adb5 --- /dev/null +++ b/playbook/localhost/okta/okta_vars.yml @@ -0,0 +1,25 @@ +org: specialcounsel +api: !vault | + $ANSIBLE_VAULT;1.1;AES256 + 38653364346561346262373864383039383062363465656531393561313162313764363230616461 + 3861383930646331366132626132346430313238366439320a363636363938363431646631316362 + 30663937343631353430326161616331373539343064613663393862653364643838623335303639 + 6561326532373939630a633134323530303632653733663039323238363961373832386638666535 + 61646234656263643439613135303934323264303235313737656238366462633365333762646162 + 6461376235383531643464396638323162373364373433353934 + +email_deleteme: !vault | + $ANSIBLE_VAULT;1.1;AES256 + 61326435326361386537303861313332643434316433643737356434333836346435626361396539 + 6536373565343363366433343931643363653465636264320a363466646337633138663134666263 + 64613133383336653132366663393734343135633932323731326164653137323936366432613765 + 3737653131353635370a656339366330373761326135653739313731613230383561306431646165 + 36656339616330393539336563343663303638626337336564306234376161383634 + +email_demeteme2: !vault | + $ANSIBLE_VAULT;1.1;AES256 + 39646663353734646332613430656433356265623235383931636334653463393030653733653963 + 6638326232613733613462363133663833323532653939620a646239303535626462636331616562 + 36353836393333333664386131376139323662336538373435653939626565363837356234306531 + 6539386434623366320a303438643832353732393833353434363662326635666430613333636431 + 61366265643632363939666534613138623262626230613739373833363538383030 \ No newline at end of file diff --git a/playbook/localhost/readme.md b/playbook/localhost/readme.md new file mode 100644 index 0000000..ef871b5 --- /dev/null +++ b/playbook/localhost/readme.md @@ -0,0 +1,7 @@ +# localhost + +The playbooks found here are not working against another host to maintain the configuration. They only need the ansible host that contains the playbook and some modules. + +## Okta + +These playbooks work with Okta's REST API so you do not need to jump into another server. diff --git a/playbook/macos/installDevTools.yml b/playbook/macos/installDevTools.yml index 7030dff..5237409 100644 --- a/playbook/macos/installDevTools.yml +++ b/playbook/macos/installDevTools.yml @@ -48,6 +48,7 @@ #TODO The job seems to stop here for some reason - name: remove cask - dotnet-sdk + become: true homebrew_cask: name: dotnet-sdk state: absent diff --git a/roles/luther38.okta/defaults/main.yml b/roles/luther38.okta/defaults/main.yml new file mode 100644 index 0000000..9c9238b --- /dev/null +++ b/roles/luther38.okta/defaults/main.yml @@ -0,0 +1,12 @@ +--- +organization: '' +api_key: '' + +first_name: '' +last_name: '' +email: '' +login: '' +status: '' + +add_groups: +remove_groups: \ No newline at end of file diff --git a/roles/luther38.okta/tasks/main.yml b/roles/luther38.okta/tasks/main.yml new file mode 100644 index 0000000..9403fae --- /dev/null +++ b/roles/luther38.okta/tasks/main.yml @@ -0,0 +1,90 @@ +--- +- name: Check for {{ login }} + okta_users: + organization: "{{ organization }}" + api_key: "{{ api_key }}" + action: list + login: "{{ login }}" + register: oktalist + +# if the account is not found, make it +- name: Create {{ login }} + okta_users: + organization: "{{ organization }}" + api_key: "{{ api_key }}" + action: create + login: "{{ login }}" + email: "{{ email }}" + first_name: "{{ first_name }}" + last_name: "{{ last_name }}" + when: + - oktalist['json'] is not defined + - isActive|bool == True + +- name: Update {{ login }} first_name + okta_users: + organization: "{{ organization }}" + api_key: "{{ api_key }}" + action: update + id: "{{ oktalist.json.0.id }}" + first_name: "{{ first_name }}" + when: + - oktalist.json.0.profile.firstName != first_name + - isActive|bool == True + +- name: Update {{ login }} last_name + okta_users: + organization: "{{ organization }}" + api_key: "{{ api_key }}" + action: update + id: "{{ oktalist.json.0.id }}" + last_name: "{{ last_name }}" + when: + - oktalist.json.0.profile.lastName != last_name + - isActive|bool == True + +- name: Update {{ login }} email + okta_users: + organization: "{{ organization }}" + api_key: "{{ api_key }}" + action: update + id: "{{ oktalist.json.0.id }}" + email: "{{ email }}" + when: + - oktalist.json.0.profile.email != email + - isActive|bool == True + +- name: Disable {{ login }} + okta_users: + organization: "{{ organization }}" + api_key: "{{ api_key }}" + action: deactivate + id: "{{ oktalist.json.0.id }}" + when: + - oktalist.json is defined + - isActive|bool == False + +- name: debug + debug: + msg: "{{ item }}" + with_items: "{{ add_groups }}" + +- name: add groups + okta_groups: + action: add_user + organization: "{{ organization }}" + api_key: "{{ api_key }}" + user_id: "{{ oktalist.json.0.id }}" + id: "{{ item }}" + with_items: "{{ add_groups }}" + ignore_errors: yes + +- name: remove groups + okta_groups: + action: remove_user + organization: "{{ organization }}" + api_key: "{{ api_key }}" + user_id: "{{ oktalist.json.0.id }}" + id: "{{ item }}" + with_items: "{{ remove_groups }}" + ignore_errors: yes \ No newline at end of file From 2aa633d884c53cf95842a94f1ea80272f56d1030 Mon Sep 17 00:00:00 2001 From: James Tombleson Date: Sun, 3 Nov 2019 21:46:19 -0800 Subject: [PATCH 4/5] migration for mediaserver to docker in testing. mounting the drive looks like its working now --- ansible-vars.all | 4230 ----------------- ansible.cfg | 2 +- inventory/home.yaml | 111 +- playbook/docker/mediaserver/hydra.yml | 27 +- playbook/docker/mediaserver/mediaserver.yml | 42 + playbook/docker/mediaserver/mount.yml | 18 + playbook/docker/mediaserver/nzbget.yml | 35 + playbook/docker/mediaserver/sonarr.yml | 37 + playbook/docker/mediaserver/vars.yml | 17 + playbook/linux/auto-securityupdates.yml | 17 - playbook/linux/common.yml | 34 + playbook/linux/elastic/elastic-7.x.list | 1 - playbook/linux/elastic/install-client.yml | 40 - playbook/linux/elastic/install-repo.yml | 29 - .../linux/elastic/install-role-filebeat.yml | 14 - .../linux/elastic/install-role-metricbeat.yml | 16 - .../linux/elastic/install-role-winlogbeat.yml | 16 - playbook/linux/elastic/install-server.yml | 62 - playbook/linux/elastic/install-win-client.yml | 27 - playbook/linux/elastic/role-test.yml | 35 - playbook/linux/install-awx.yml | 4 +- playbook/linux/install-powershell.yml | 34 - 22 files changed, 283 insertions(+), 4565 deletions(-) delete mode 100644 ansible-vars.all create mode 100644 playbook/docker/mediaserver/mediaserver.yml create mode 100644 playbook/docker/mediaserver/mount.yml create mode 100644 playbook/docker/mediaserver/nzbget.yml create mode 100644 playbook/docker/mediaserver/sonarr.yml delete mode 100644 playbook/linux/auto-securityupdates.yml create mode 100644 playbook/linux/common.yml delete mode 100644 playbook/linux/elastic/elastic-7.x.list delete mode 100644 playbook/linux/elastic/install-client.yml delete mode 100644 playbook/linux/elastic/install-repo.yml delete mode 100644 playbook/linux/elastic/install-role-filebeat.yml delete mode 100644 playbook/linux/elastic/install-role-metricbeat.yml delete mode 100644 playbook/linux/elastic/install-role-winlogbeat.yml delete mode 100644 playbook/linux/elastic/install-server.yml delete mode 100644 playbook/linux/elastic/install-win-client.yml delete mode 100644 playbook/linux/elastic/role-test.yml delete mode 100644 playbook/linux/install-powershell.yml diff --git a/ansible-vars.all b/ansible-vars.all deleted file mode 100644 index d0834c0..0000000 --- a/ansible-vars.all +++ /dev/null @@ -1,4230 +0,0 @@ -Module Variables ("vars"): --------------------------------- -{ - "ansible_XHC20": { - "device": "XHC20", - "flags": [], - "ipv4": [], - "ipv6": [], - "macaddress": "unknown", - "mtu": "0", - "type": "unknown" - }, - "ansible_all_ipv4_addresses": [ - "192.168.0.34" - ], - "ansible_all_ipv6_addresses": [ - "fe80::421:ab7:8eea:ae1b%en0", - "fe80::2828:d6ff:fe5e:de8%awdl0", - "fe80::2828:d6ff:fe5e:de8%llw0", - "fe80::4a0c:f6b5:f6fa:d72e%utun0", - "fe80::ede1:8366:c98:a7b1%utun1", - "fe80::583d:52ab:afc:8a7f%utun2", - "fe80::4adc:23a1:e517:35f1%utun3", - "fe80::32f7:6f62:3d81:5cba%utun4", - "fe80::ed73:d6b:d97a:cf4f%utun5", - "fe80::3636:3bff:fecf:f2b2%ipsec0", - "2607:fb90:cc1:58dc:6b1:7b3a:6b5d:fad7" - ], - "ansible_apparmor": { - "status": "disabled" - }, - "ansible_architecture": "x86_64", - "ansible_awdl0": { - "device": "awdl0", - "flags": [ - "UP", - "BROADCAST", - "RUNNING", - "PROMISC", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::2828:d6ff:fe5e:de8%awdl0", - "prefix": "64", - "scope": "0x7" - } - ], - "macaddress": "2a:28:d6:5e:0d:e8", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1484", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "ansible_bridge0": { - "device": "bridge0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "82:0f:22:2a:5f:00", - "media": "Unknown", - "media_select": "Unknown", - "media_type": "unknown type", - "mtu": "1500", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "inactive", - "type": "ether" - }, - "ansible_check_mode": false, - "ansible_date_time": { - "date": "2019-10-18", - "day": "18", - "epoch": "1571450977", - "hour": "19", - "iso8601": "2019-10-19T02:09:37Z", - "iso8601_basic": "20191018T190937748074", - "iso8601_basic_short": "20191018T190937", - "iso8601_micro": "2019-10-19T02:09:37.748159Z", - "minute": "09", - "month": "10", - "second": "37", - "time": "19:09:37", - "tz": "PDT", - "tz_offset": "-0700", - "weekday": "Friday", - "weekday_number": "5", - "weeknumber": "41", - "year": "2019" - }, - "ansible_default_ipv4": { - "address": "192.168.0.34", - "broadcast": "192.168.0.255", - "device": "en0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "gateway": "192.168.0.1", - "interface": "en0", - "macaddress": "34:36:3b:cf:f2:b2", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1500", - "netmask": "255.255.255.0", - "network": "192.168.0.0", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "ansible_default_ipv6": {}, - "ansible_diff_mode": false, - "ansible_distribution": "MacOSX", - "ansible_distribution_major_version": "10", - "ansible_distribution_release": "19.0.0", - "ansible_distribution_version": "10.15", - "ansible_dns": { - "domain": "domain", - "nameservers": [ - "192.168.0.1", - "192.168.0.1" - ] - }, - "ansible_domain": "domain", - "ansible_effective_group_id": 20, - "ansible_effective_user_id": 501, - "ansible_en0": { - "device": "en0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [ - { - "address": "192.168.0.34", - "broadcast": "192.168.0.255", - "netmask": "255.255.255.0", - "network": "192.168.0.0" - } - ], - "ipv6": [ - { - "address": "fe80::421:ab7:8eea:ae1b%en0", - "prefix": "64" - } - ], - "macaddress": "34:36:3b:cf:f2:b2", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1500", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "ansible_en1": { - "device": "en1", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "PROMISC", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "82:0f:22:2a:5f:00", - "media": "Unknown", - "media_select": "autoselect", - "media_type": "full-duplex", - "mtu": "1500", - "options": [ - "TSO4", - "TSO6", - "CHANNEL_IO" - ], - "status": "inactive", - "type": "ether" - }, - "ansible_en2": { - "device": "en2", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "PROMISC", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "82:0f:22:2a:5f:01", - "media": "Unknown", - "media_select": "autoselect", - "media_type": "full-duplex", - "mtu": "1500", - "options": [ - "TSO4", - "TSO6", - "CHANNEL_IO" - ], - "status": "inactive", - "type": "ether" - }, - "ansible_env": { - "HOME": "/Users/jamestombleson", - "LOGNAME": "jamestombleson", - "MAIL": "/var/mail/jamestombleson", - "PATH": "/usr/bin:/bin:/usr/sbin:/sbin", - "PWD": "/Users/jamestombleson", - "SHELL": "/bin/zsh", - "SHLVL": "1", - "SSH_CLIENT": "127.0.0.1 63351 22", - "SSH_CONNECTION": "127.0.0.1 63351 127.0.0.1 22", - "SSH_TTY": "/dev/ttys005", - "TERM": "xterm-256color", - "TMPDIR": "/var/folders/r3/7kdlrnn518x4653b3rk0z8000000gn/T/", - "USER": "jamestombleson", - "VERSIONER_PYTHON_VERSION": "2.7", - "_": "/usr/bin/python", - "__CF_USER_TEXT_ENCODING": "0x1F5:0x0:0x0" - }, - "ansible_facts": { - "XHC20": { - "device": "XHC20", - "flags": [], - "ipv4": [], - "ipv6": [], - "macaddress": "unknown", - "mtu": "0", - "type": "unknown" - }, - "all_ipv4_addresses": [ - "192.168.0.34" - ], - "all_ipv6_addresses": [ - "fe80::421:ab7:8eea:ae1b%en0", - "fe80::2828:d6ff:fe5e:de8%awdl0", - "fe80::2828:d6ff:fe5e:de8%llw0", - "fe80::4a0c:f6b5:f6fa:d72e%utun0", - "fe80::ede1:8366:c98:a7b1%utun1", - "fe80::583d:52ab:afc:8a7f%utun2", - "fe80::4adc:23a1:e517:35f1%utun3", - "fe80::32f7:6f62:3d81:5cba%utun4", - "fe80::ed73:d6b:d97a:cf4f%utun5", - "fe80::3636:3bff:fecf:f2b2%ipsec0", - "2607:fb90:cc1:58dc:6b1:7b3a:6b5d:fad7" - ], - "ansible_local": {}, - "apparmor": { - "status": "disabled" - }, - "architecture": "x86_64", - "awdl0": { - "device": "awdl0", - "flags": [ - "UP", - "BROADCAST", - "RUNNING", - "PROMISC", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::2828:d6ff:fe5e:de8%awdl0", - "prefix": "64", - "scope": "0x7" - } - ], - "macaddress": "2a:28:d6:5e:0d:e8", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1484", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "bridge0": { - "device": "bridge0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "82:0f:22:2a:5f:00", - "media": "Unknown", - "media_select": "Unknown", - "media_type": "unknown type", - "mtu": "1500", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "inactive", - "type": "ether" - }, - "date_time": { - "date": "2019-10-18", - "day": "18", - "epoch": "1571450977", - "hour": "19", - "iso8601": "2019-10-19T02:09:37Z", - "iso8601_basic": "20191018T190937748074", - "iso8601_basic_short": "20191018T190937", - "iso8601_micro": "2019-10-19T02:09:37.748159Z", - "minute": "09", - "month": "10", - "second": "37", - "time": "19:09:37", - "tz": "PDT", - "tz_offset": "-0700", - "weekday": "Friday", - "weekday_number": "5", - "weeknumber": "41", - "year": "2019" - }, - "default_ipv4": { - "address": "192.168.0.34", - "broadcast": "192.168.0.255", - "device": "en0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "gateway": "192.168.0.1", - "interface": "en0", - "macaddress": "34:36:3b:cf:f2:b2", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1500", - "netmask": "255.255.255.0", - "network": "192.168.0.0", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "default_ipv6": {}, - "distribution": "MacOSX", - "distribution_major_version": "10", - "distribution_release": "19.0.0", - "distribution_version": "10.15", - "dns": { - "domain": "domain", - "nameservers": [ - "192.168.0.1", - "192.168.0.1" - ] - }, - "domain": "domain", - "effective_group_id": 20, - "effective_user_id": 501, - "en0": { - "device": "en0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [ - { - "address": "192.168.0.34", - "broadcast": "192.168.0.255", - "netmask": "255.255.255.0", - "network": "192.168.0.0" - } - ], - "ipv6": [ - { - "address": "fe80::421:ab7:8eea:ae1b%en0", - "prefix": "64" - } - ], - "macaddress": "34:36:3b:cf:f2:b2", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1500", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "en1": { - "device": "en1", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "PROMISC", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "82:0f:22:2a:5f:00", - "media": "Unknown", - "media_select": "autoselect", - "media_type": "full-duplex", - "mtu": "1500", - "options": [ - "TSO4", - "TSO6", - "CHANNEL_IO" - ], - "status": "inactive", - "type": "ether" - }, - "en2": { - "device": "en2", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "PROMISC", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "82:0f:22:2a:5f:01", - "media": "Unknown", - "media_select": "autoselect", - "media_type": "full-duplex", - "mtu": "1500", - "options": [ - "TSO4", - "TSO6", - "CHANNEL_IO" - ], - "status": "inactive", - "type": "ether" - }, - "env": { - "HOME": "/Users/jamestombleson", - "LOGNAME": "jamestombleson", - "MAIL": "/var/mail/jamestombleson", - "PATH": "/usr/bin:/bin:/usr/sbin:/sbin", - "PWD": "/Users/jamestombleson", - "SHELL": "/bin/zsh", - "SHLVL": "1", - "SSH_CLIENT": "127.0.0.1 63351 22", - "SSH_CONNECTION": "127.0.0.1 63351 127.0.0.1 22", - "SSH_TTY": "/dev/ttys005", - "TERM": "xterm-256color", - "TMPDIR": "/var/folders/r3/7kdlrnn518x4653b3rk0z8000000gn/T/", - "USER": "jamestombleson", - "VERSIONER_PYTHON_VERSION": "2.7", - "_": "/usr/bin/python", - "__CF_USER_TEXT_ENCODING": "0x1F5:0x0:0x0" - }, - "fips": false, - "fqdn": "macbook-pro-4.domain", - "gather_subset": [ - "all" - ], - "gif0": { - "device": "gif0", - "flags": [ - "POINTOPOINT", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "unknown", - "mtu": "1280", - "type": "unknown" - }, - "hostname": "MacBook-Pro-4", - "interfaces": [ - "XHC20", - "awdl0", - "bridge0", - "en0", - "en1", - "en2", - "gif0", - "ipsec0", - "llw0", - "lo0", - "p2p0", - "stf0", - "utun0", - "utun1", - "utun2", - "utun3", - "utun4", - "utun5" - ], - "ipsec0": { - "device": "ipsec0", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::3636:3bff:fecf:f2b2%ipsec0", - "prefix": "64", - "scope": "0x12" - }, - { - "address": "2607:fb90:cc1:58dc:6b1:7b3a:6b5d:fad7", - "prefix": "64" - } - ], - "macaddress": "unknown", - "mtu": "50000", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "is_chroot": false, - "iscsi_iqn": "", - "kernel": "19.0.0", - "llw0": { - "device": "llw0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::2828:d6ff:fe5e:de8%llw0", - "prefix": "64", - "scope": "0x8" - } - ], - "macaddress": "2a:28:d6:5e:0d:e8", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1500", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "lo0": { - "device": "lo0", - "flags": [ - "UP", - "LOOPBACK", - "RUNNING", - "MULTICAST" - ], - "ipv4": [ - { - "address": "127.0.0.1", - "broadcast": "127.255.255.255", - "netmask": "255.0.0.0", - "network": "127.0.0.0" - } - ], - "ipv6": [ - { - "address": "::1", - "prefix": "128" - }, - { - "address": "fe80::1%lo0", - "prefix": "64", - "scope": "0x1" - } - ], - "macaddress": "unknown", - "mtu": "16384", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "loopback" - }, - "lsb": {}, - "machine": "x86_64", - "memfree_mb": 94, - "memtotal_mb": 16384, - "model": "MacBookPro11,2", - "module_setup": true, - "nodename": "MacBook-Pro-4.domain", - "os_family": "Darwin", - "osrevision": "199506", - "osversion": "19A583", - "p2p0": { - "device": "p2p0", - "flags": [ - "UP", - "BROADCAST", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "06:36:3b:cf:f2:b2", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "2304", - "options": [ - "CHANNEL_IO" - ], - "status": "inactive", - "type": "ether" - }, - "pkg_mgr": "homebrew", - "processor": "Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz", - "processor_cores": "4", - "processor_vcpus": "8", - "python": { - "executable": "/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python", - "has_sslcontext": true, - "type": "CPython", - "version": { - "major": 2, - "micro": 16, - "minor": 7, - "releaselevel": "final", - "serial": 0 - }, - "version_info": [ - 2, - 7, - 16, - "final", - 0 - ] - }, - "python_version": "2.7.16", - "real_group_id": 20, - "real_user_id": 501, - "selinux": { - "status": "Missing selinux Python library" - }, - "selinux_python_present": false, - "service_mgr": "launchd", - "ssh_host_key_dsa_public": "AAAAB3NzaC1kc3MAAACBANaOKYJdhj0tZBxpolab3EOj5QIOPtKRCcuSopZyEHnqROCHsPSfITy9XsDCAuFpdnkWmyPWE6Phix4BHFq3X+ArP0hHZWxl8zF5nRss25WgtJg/ntJJ3kK8F7ldkqd89HISMnwkCJTp99842x0pFfPn5/hDJfStGXnTcABj/GPnAAAAFQCXBgShNVEh9ddQR32k1I4nxojRZQAAAIBhf04evMhdXIjhD8swgtp8DJkaZ0Nd7eXcJIiuSOdHwtffaBH1llL2L0vELrvLtvJSTEpnh000mqlRoX8C0wSC20SoWV5ul4kxvdmliXvO2BhG0XXfUOvqPxt9+W1KDv+9xvbembAfJvWJ1VDUJb/tXRpw+/Hz4pviuKLQ9CPR/wAAAIBIy04P3TZ7h7UN+mYhld+YKR2ei6HAGooF4uaGxPh1xzZtLUyidFg3+iPU0AMAZfHzB01ZLMqsJSXutZnJ5twmmyMef55c+YZpw9aBMCWZzhbrPoowoly86c6Aq6zwEiyiCeMrdnXcTouh12MpmfzgfT7j7LiyZsLtvQQVCp6Y8w==", - "ssh_host_key_ecdsa_public": "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLkhDLo+ofDRAYNdnntLko5AFFw5yfeW15JOtfFsq04LvBDT6ZvEx8rRLiCSnaXMdDjlvj/gU6LYJTWM+5MPeKc=", - "ssh_host_key_ed25519_public": "AAAAC3NzaC1lZDI1NTE5AAAAIAs4JsI/X77ORabsqAt2Kv/LKXtlvXvYi6L11wF6sLSG", - "ssh_host_key_rsa_public": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDFMVMTbD4rv09xtTpJPIGjitvK0Ell5m+BGUjP3q8c+CloxwVmHhx3MDLz4CnAp+FpqfZRO2nxbPgbw+FAkhlPy08IWKbO9Ttm31tRDQT87P4dcF59lfWJ0lt9z0ZW81GeztH0pQEB/ug9LYgJjUSBlqKPfwNDbmeWZzqMnCfXpRzyFgNiNo/uFfpe/flnpjP2pS+V3qPD4hO5SAAi7oPSLW8pTeQKU/luPQldiEKNcu43nqWiFFJaxIQ5jhj1DmCY2C73aXeeAW95gDay1T/C6XqsOaAAxlFi6rp217MdCZqz3ut+MHnYYARrp3cqL4RSg4B4Sa4Fj1FFevxYZv7f", - "stf0": { - "device": "stf0", - "flags": [], - "ipv4": [], - "ipv6": [], - "macaddress": "unknown", - "mtu": "1280", - "type": "unknown" - }, - "system": "Darwin", - "user_dir": "/Users/jamestombleson", - "user_gecos": "James Tombleson", - "user_gid": 20, - "user_id": "jamestombleson", - "user_shell": "/bin/zsh", - "user_uid": 501, - "userspace_architecture": "x86_64", - "userspace_bits": "64", - "utun0": { - "device": "utun0", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::4a0c:f6b5:f6fa:d72e%utun0", - "prefix": "64", - "scope": "0xc" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "utun1": { - "device": "utun1", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::ede1:8366:c98:a7b1%utun1", - "prefix": "64", - "scope": "0xd" - } - ], - "macaddress": "unknown", - "mtu": "2000", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "utun2": { - "device": "utun2", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::583d:52ab:afc:8a7f%utun2", - "prefix": "64", - "scope": "0xe" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "utun3": { - "device": "utun3", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::4adc:23a1:e517:35f1%utun3", - "prefix": "64", - "scope": "0xf" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "utun4": { - "device": "utun4", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::32f7:6f62:3d81:5cba%utun4", - "prefix": "64", - "scope": "0x10" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "utun5": { - "device": "utun5", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::ed73:d6b:d97a:cf4f%utun5", - "prefix": "64", - "scope": "0x11" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "virtualization_role": "", - "virtualization_type": "" - }, - "ansible_fips": false, - "ansible_forks": 5, - "ansible_fqdn": "macbook-pro-4.domain", - "ansible_gif0": { - "device": "gif0", - "flags": [ - "POINTOPOINT", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "unknown", - "mtu": "1280", - "type": "unknown" - }, - "ansible_hostname": "MacBook-Pro-4", - "ansible_interfaces": [ - "XHC20", - "awdl0", - "bridge0", - "en0", - "en1", - "en2", - "gif0", - "ipsec0", - "llw0", - "lo0", - "p2p0", - "stf0", - "utun0", - "utun1", - "utun2", - "utun3", - "utun4", - "utun5" - ], - "ansible_inventory_sources": [ - "/Users/jamestombleson/Documents/GitHub/Ansible/hosts" - ], - "ansible_ipsec0": { - "device": "ipsec0", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::3636:3bff:fecf:f2b2%ipsec0", - "prefix": "64", - "scope": "0x12" - }, - { - "address": "2607:fb90:cc1:58dc:6b1:7b3a:6b5d:fad7", - "prefix": "64" - } - ], - "macaddress": "unknown", - "mtu": "50000", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "ansible_is_chroot": false, - "ansible_iscsi_iqn": "", - "ansible_kernel": "19.0.0", - "ansible_llw0": { - "device": "llw0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::2828:d6ff:fe5e:de8%llw0", - "prefix": "64", - "scope": "0x8" - } - ], - "macaddress": "2a:28:d6:5e:0d:e8", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1500", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "ansible_lo0": { - "device": "lo0", - "flags": [ - "UP", - "LOOPBACK", - "RUNNING", - "MULTICAST" - ], - "ipv4": [ - { - "address": "127.0.0.1", - "broadcast": "127.255.255.255", - "netmask": "255.0.0.0", - "network": "127.0.0.0" - } - ], - "ipv6": [ - { - "address": "::1", - "prefix": "128" - }, - { - "address": "fe80::1%lo0", - "prefix": "64", - "scope": "0x1" - } - ], - "macaddress": "unknown", - "mtu": "16384", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "loopback" - }, - "ansible_local": {}, - "ansible_lsb": {}, - "ansible_machine": "x86_64", - "ansible_memfree_mb": 94, - "ansible_memtotal_mb": 16384, - "ansible_model": "MacBookPro11,2", - "ansible_nodename": "MacBook-Pro-4.domain", - "ansible_os_family": "Darwin", - "ansible_osrevision": "199506", - "ansible_osversion": "19A583", - "ansible_p2p0": { - "device": "p2p0", - "flags": [ - "UP", - "BROADCAST", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "06:36:3b:cf:f2:b2", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "2304", - "options": [ - "CHANNEL_IO" - ], - "status": "inactive", - "type": "ether" - }, - "ansible_password": "Pm98cdLm38iq", - "ansible_pkg_mgr": "homebrew", - "ansible_play_batch": [ - "127.0.0.1" - ], - "ansible_play_hosts": [ - "127.0.0.1" - ], - "ansible_play_hosts_all": [ - "127.0.0.1" - ], - "ansible_playbook_python": "/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python", - "ansible_processor": "Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz", - "ansible_processor_cores": "4", - "ansible_processor_vcpus": "8", - "ansible_python": { - "executable": "/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python", - "has_sslcontext": true, - "type": "CPython", - "version": { - "major": 2, - "micro": 16, - "minor": 7, - "releaselevel": "final", - "serial": 0 - }, - "version_info": [ - 2, - 7, - 16, - "final", - 0 - ] - }, - "ansible_python_version": "2.7.16", - "ansible_real_group_id": 20, - "ansible_real_user_id": 501, - "ansible_run_tags": [ - "all" - ], - "ansible_selinux": { - "status": "Missing selinux Python library" - }, - "ansible_selinux_python_present": false, - "ansible_service_mgr": "launchd", - "ansible_skip_tags": [], - "ansible_ssh_host_key_dsa_public": "AAAAB3NzaC1kc3MAAACBANaOKYJdhj0tZBxpolab3EOj5QIOPtKRCcuSopZyEHnqROCHsPSfITy9XsDCAuFpdnkWmyPWE6Phix4BHFq3X+ArP0hHZWxl8zF5nRss25WgtJg/ntJJ3kK8F7ldkqd89HISMnwkCJTp99842x0pFfPn5/hDJfStGXnTcABj/GPnAAAAFQCXBgShNVEh9ddQR32k1I4nxojRZQAAAIBhf04evMhdXIjhD8swgtp8DJkaZ0Nd7eXcJIiuSOdHwtffaBH1llL2L0vELrvLtvJSTEpnh000mqlRoX8C0wSC20SoWV5ul4kxvdmliXvO2BhG0XXfUOvqPxt9+W1KDv+9xvbembAfJvWJ1VDUJb/tXRpw+/Hz4pviuKLQ9CPR/wAAAIBIy04P3TZ7h7UN+mYhld+YKR2ei6HAGooF4uaGxPh1xzZtLUyidFg3+iPU0AMAZfHzB01ZLMqsJSXutZnJ5twmmyMef55c+YZpw9aBMCWZzhbrPoowoly86c6Aq6zwEiyiCeMrdnXcTouh12MpmfzgfT7j7LiyZsLtvQQVCp6Y8w==", - "ansible_ssh_host_key_ecdsa_public": "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLkhDLo+ofDRAYNdnntLko5AFFw5yfeW15JOtfFsq04LvBDT6ZvEx8rRLiCSnaXMdDjlvj/gU6LYJTWM+5MPeKc=", - "ansible_ssh_host_key_ed25519_public": "AAAAC3NzaC1lZDI1NTE5AAAAIAs4JsI/X77ORabsqAt2Kv/LKXtlvXvYi6L11wF6sLSG", - "ansible_ssh_host_key_rsa_public": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDFMVMTbD4rv09xtTpJPIGjitvK0Ell5m+BGUjP3q8c+CloxwVmHhx3MDLz4CnAp+FpqfZRO2nxbPgbw+FAkhlPy08IWKbO9Ttm31tRDQT87P4dcF59lfWJ0lt9z0ZW81GeztH0pQEB/ug9LYgJjUSBlqKPfwNDbmeWZzqMnCfXpRzyFgNiNo/uFfpe/flnpjP2pS+V3qPD4hO5SAAi7oPSLW8pTeQKU/luPQldiEKNcu43nqWiFFJaxIQ5jhj1DmCY2C73aXeeAW95gDay1T/C6XqsOaAAxlFi6rp217MdCZqz3ut+MHnYYARrp3cqL4RSg4B4Sa4Fj1FFevxYZv7f", - "ansible_stf0": { - "device": "stf0", - "flags": [], - "ipv4": [], - "ipv6": [], - "macaddress": "unknown", - "mtu": "1280", - "type": "unknown" - }, - "ansible_system": "Darwin", - "ansible_user": "jamestombleson", - "ansible_user_dir": "/Users/jamestombleson", - "ansible_user_gecos": "James Tombleson", - "ansible_user_gid": 20, - "ansible_user_id": "jamestombleson", - "ansible_user_shell": "/bin/zsh", - "ansible_user_uid": 501, - "ansible_userspace_architecture": "x86_64", - "ansible_userspace_bits": "64", - "ansible_utun0": { - "device": "utun0", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::4a0c:f6b5:f6fa:d72e%utun0", - "prefix": "64", - "scope": "0xc" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "ansible_utun1": { - "device": "utun1", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::ede1:8366:c98:a7b1%utun1", - "prefix": "64", - "scope": "0xd" - } - ], - "macaddress": "unknown", - "mtu": "2000", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "ansible_utun2": { - "device": "utun2", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::583d:52ab:afc:8a7f%utun2", - "prefix": "64", - "scope": "0xe" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "ansible_utun3": { - "device": "utun3", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::4adc:23a1:e517:35f1%utun3", - "prefix": "64", - "scope": "0xf" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "ansible_utun4": { - "device": "utun4", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::32f7:6f62:3d81:5cba%utun4", - "prefix": "64", - "scope": "0x10" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "ansible_utun5": { - "device": "utun5", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::ed73:d6b:d97a:cf4f%utun5", - "prefix": "64", - "scope": "0x11" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "ansible_verbosity": 0, - "ansible_version": { - "full": "2.7.9", - "major": 2, - "minor": 7, - "revision": 9, - "string": "2.7.9" - }, - "ansible_virtualization_role": "", - "ansible_virtualization_type": "", - "environment": [], - "gather_subset": [ - "all" - ], - "group_names": [ - "osx" - ], - "groups": { - "all": [ - "192.168.0.60", - "192.168.0.2", - "127.0.0.1" - ], - "elastic": [ - "192.168.0.60" - ], - "jenkins": [ - "192.168.0.60" - ], - "linux": [ - "192.168.0.60" - ], - "osx": [ - "127.0.0.1" - ], - "sensu_masters": [ - "192.168.0.60" - ], - "sensu_rabbitmq_servers": [ - "192.168.0.60" - ], - "sensu_redis_servers": [ - "192.168.0.60" - ], - "ungrouped": [], - "windows": [ - "192.168.0.2" - ] - }, - "hostvars": { - "127.0.0.1": { - "ansible_XHC20": { - "device": "XHC20", - "flags": [], - "ipv4": [], - "ipv6": [], - "macaddress": "unknown", - "mtu": "0", - "type": "unknown" - }, - "ansible_all_ipv4_addresses": [ - "192.168.0.34" - ], - "ansible_all_ipv6_addresses": [ - "fe80::421:ab7:8eea:ae1b%en0", - "fe80::2828:d6ff:fe5e:de8%awdl0", - "fe80::2828:d6ff:fe5e:de8%llw0", - "fe80::4a0c:f6b5:f6fa:d72e%utun0", - "fe80::ede1:8366:c98:a7b1%utun1", - "fe80::583d:52ab:afc:8a7f%utun2", - "fe80::4adc:23a1:e517:35f1%utun3", - "fe80::32f7:6f62:3d81:5cba%utun4", - "fe80::ed73:d6b:d97a:cf4f%utun5", - "fe80::3636:3bff:fecf:f2b2%ipsec0", - "2607:fb90:cc1:58dc:6b1:7b3a:6b5d:fad7" - ], - "ansible_apparmor": { - "status": "disabled" - }, - "ansible_architecture": "x86_64", - "ansible_awdl0": { - "device": "awdl0", - "flags": [ - "UP", - "BROADCAST", - "RUNNING", - "PROMISC", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::2828:d6ff:fe5e:de8%awdl0", - "prefix": "64", - "scope": "0x7" - } - ], - "macaddress": "2a:28:d6:5e:0d:e8", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1484", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "ansible_bridge0": { - "device": "bridge0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "82:0f:22:2a:5f:00", - "media": "Unknown", - "media_select": "Unknown", - "media_type": "unknown type", - "mtu": "1500", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "inactive", - "type": "ether" - }, - "ansible_check_mode": false, - "ansible_date_time": { - "date": "2019-10-18", - "day": "18", - "epoch": "1571450977", - "hour": "19", - "iso8601": "2019-10-19T02:09:37Z", - "iso8601_basic": "20191018T190937748074", - "iso8601_basic_short": "20191018T190937", - "iso8601_micro": "2019-10-19T02:09:37.748159Z", - "minute": "09", - "month": "10", - "second": "37", - "time": "19:09:37", - "tz": "PDT", - "tz_offset": "-0700", - "weekday": "Friday", - "weekday_number": "5", - "weeknumber": "41", - "year": "2019" - }, - "ansible_default_ipv4": { - "address": "192.168.0.34", - "broadcast": "192.168.0.255", - "device": "en0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "gateway": "192.168.0.1", - "interface": "en0", - "macaddress": "34:36:3b:cf:f2:b2", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1500", - "netmask": "255.255.255.0", - "network": "192.168.0.0", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "ansible_default_ipv6": {}, - "ansible_diff_mode": false, - "ansible_distribution": "MacOSX", - "ansible_distribution_major_version": "10", - "ansible_distribution_release": "19.0.0", - "ansible_distribution_version": "10.15", - "ansible_dns": { - "domain": "domain", - "nameservers": [ - "192.168.0.1", - "192.168.0.1" - ] - }, - "ansible_domain": "domain", - "ansible_effective_group_id": 20, - "ansible_effective_user_id": 501, - "ansible_en0": { - "device": "en0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [ - { - "address": "192.168.0.34", - "broadcast": "192.168.0.255", - "netmask": "255.255.255.0", - "network": "192.168.0.0" - } - ], - "ipv6": [ - { - "address": "fe80::421:ab7:8eea:ae1b%en0", - "prefix": "64" - } - ], - "macaddress": "34:36:3b:cf:f2:b2", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1500", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "ansible_en1": { - "device": "en1", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "PROMISC", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "82:0f:22:2a:5f:00", - "media": "Unknown", - "media_select": "autoselect", - "media_type": "full-duplex", - "mtu": "1500", - "options": [ - "TSO4", - "TSO6", - "CHANNEL_IO" - ], - "status": "inactive", - "type": "ether" - }, - "ansible_en2": { - "device": "en2", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "PROMISC", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "82:0f:22:2a:5f:01", - "media": "Unknown", - "media_select": "autoselect", - "media_type": "full-duplex", - "mtu": "1500", - "options": [ - "TSO4", - "TSO6", - "CHANNEL_IO" - ], - "status": "inactive", - "type": "ether" - }, - "ansible_env": { - "HOME": "/Users/jamestombleson", - "LOGNAME": "jamestombleson", - "MAIL": "/var/mail/jamestombleson", - "PATH": "/usr/bin:/bin:/usr/sbin:/sbin", - "PWD": "/Users/jamestombleson", - "SHELL": "/bin/zsh", - "SHLVL": "1", - "SSH_CLIENT": "127.0.0.1 63351 22", - "SSH_CONNECTION": "127.0.0.1 63351 127.0.0.1 22", - "SSH_TTY": "/dev/ttys005", - "TERM": "xterm-256color", - "TMPDIR": "/var/folders/r3/7kdlrnn518x4653b3rk0z8000000gn/T/", - "USER": "jamestombleson", - "VERSIONER_PYTHON_VERSION": "2.7", - "_": "/usr/bin/python", - "__CF_USER_TEXT_ENCODING": "0x1F5:0x0:0x0" - }, - "ansible_facts": { - "XHC20": { - "device": "XHC20", - "flags": [], - "ipv4": [], - "ipv6": [], - "macaddress": "unknown", - "mtu": "0", - "type": "unknown" - }, - "all_ipv4_addresses": [ - "192.168.0.34" - ], - "all_ipv6_addresses": [ - "fe80::421:ab7:8eea:ae1b%en0", - "fe80::2828:d6ff:fe5e:de8%awdl0", - "fe80::2828:d6ff:fe5e:de8%llw0", - "fe80::4a0c:f6b5:f6fa:d72e%utun0", - "fe80::ede1:8366:c98:a7b1%utun1", - "fe80::583d:52ab:afc:8a7f%utun2", - "fe80::4adc:23a1:e517:35f1%utun3", - "fe80::32f7:6f62:3d81:5cba%utun4", - "fe80::ed73:d6b:d97a:cf4f%utun5", - "fe80::3636:3bff:fecf:f2b2%ipsec0", - "2607:fb90:cc1:58dc:6b1:7b3a:6b5d:fad7" - ], - "ansible_local": {}, - "apparmor": { - "status": "disabled" - }, - "architecture": "x86_64", - "awdl0": { - "device": "awdl0", - "flags": [ - "UP", - "BROADCAST", - "RUNNING", - "PROMISC", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::2828:d6ff:fe5e:de8%awdl0", - "prefix": "64", - "scope": "0x7" - } - ], - "macaddress": "2a:28:d6:5e:0d:e8", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1484", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "bridge0": { - "device": "bridge0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "82:0f:22:2a:5f:00", - "media": "Unknown", - "media_select": "Unknown", - "media_type": "unknown type", - "mtu": "1500", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "inactive", - "type": "ether" - }, - "date_time": { - "date": "2019-10-18", - "day": "18", - "epoch": "1571450977", - "hour": "19", - "iso8601": "2019-10-19T02:09:37Z", - "iso8601_basic": "20191018T190937748074", - "iso8601_basic_short": "20191018T190937", - "iso8601_micro": "2019-10-19T02:09:37.748159Z", - "minute": "09", - "month": "10", - "second": "37", - "time": "19:09:37", - "tz": "PDT", - "tz_offset": "-0700", - "weekday": "Friday", - "weekday_number": "5", - "weeknumber": "41", - "year": "2019" - }, - "default_ipv4": { - "address": "192.168.0.34", - "broadcast": "192.168.0.255", - "device": "en0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "gateway": "192.168.0.1", - "interface": "en0", - "macaddress": "34:36:3b:cf:f2:b2", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1500", - "netmask": "255.255.255.0", - "network": "192.168.0.0", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "default_ipv6": {}, - "distribution": "MacOSX", - "distribution_major_version": "10", - "distribution_release": "19.0.0", - "distribution_version": "10.15", - "dns": { - "domain": "domain", - "nameservers": [ - "192.168.0.1", - "192.168.0.1" - ] - }, - "domain": "domain", - "effective_group_id": 20, - "effective_user_id": 501, - "en0": { - "device": "en0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [ - { - "address": "192.168.0.34", - "broadcast": "192.168.0.255", - "netmask": "255.255.255.0", - "network": "192.168.0.0" - } - ], - "ipv6": [ - { - "address": "fe80::421:ab7:8eea:ae1b%en0", - "prefix": "64" - } - ], - "macaddress": "34:36:3b:cf:f2:b2", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1500", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "en1": { - "device": "en1", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "PROMISC", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "82:0f:22:2a:5f:00", - "media": "Unknown", - "media_select": "autoselect", - "media_type": "full-duplex", - "mtu": "1500", - "options": [ - "TSO4", - "TSO6", - "CHANNEL_IO" - ], - "status": "inactive", - "type": "ether" - }, - "en2": { - "device": "en2", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "PROMISC", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "82:0f:22:2a:5f:01", - "media": "Unknown", - "media_select": "autoselect", - "media_type": "full-duplex", - "mtu": "1500", - "options": [ - "TSO4", - "TSO6", - "CHANNEL_IO" - ], - "status": "inactive", - "type": "ether" - }, - "env": { - "HOME": "/Users/jamestombleson", - "LOGNAME": "jamestombleson", - "MAIL": "/var/mail/jamestombleson", - "PATH": "/usr/bin:/bin:/usr/sbin:/sbin", - "PWD": "/Users/jamestombleson", - "SHELL": "/bin/zsh", - "SHLVL": "1", - "SSH_CLIENT": "127.0.0.1 63351 22", - "SSH_CONNECTION": "127.0.0.1 63351 127.0.0.1 22", - "SSH_TTY": "/dev/ttys005", - "TERM": "xterm-256color", - "TMPDIR": "/var/folders/r3/7kdlrnn518x4653b3rk0z8000000gn/T/", - "USER": "jamestombleson", - "VERSIONER_PYTHON_VERSION": "2.7", - "_": "/usr/bin/python", - "__CF_USER_TEXT_ENCODING": "0x1F5:0x0:0x0" - }, - "fips": false, - "fqdn": "macbook-pro-4.domain", - "gather_subset": [ - "all" - ], - "gif0": { - "device": "gif0", - "flags": [ - "POINTOPOINT", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "unknown", - "mtu": "1280", - "type": "unknown" - }, - "hostname": "MacBook-Pro-4", - "interfaces": [ - "XHC20", - "awdl0", - "bridge0", - "en0", - "en1", - "en2", - "gif0", - "ipsec0", - "llw0", - "lo0", - "p2p0", - "stf0", - "utun0", - "utun1", - "utun2", - "utun3", - "utun4", - "utun5" - ], - "ipsec0": { - "device": "ipsec0", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::3636:3bff:fecf:f2b2%ipsec0", - "prefix": "64", - "scope": "0x12" - }, - { - "address": "2607:fb90:cc1:58dc:6b1:7b3a:6b5d:fad7", - "prefix": "64" - } - ], - "macaddress": "unknown", - "mtu": "50000", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "is_chroot": false, - "iscsi_iqn": "", - "kernel": "19.0.0", - "llw0": { - "device": "llw0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::2828:d6ff:fe5e:de8%llw0", - "prefix": "64", - "scope": "0x8" - } - ], - "macaddress": "2a:28:d6:5e:0d:e8", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1500", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "lo0": { - "device": "lo0", - "flags": [ - "UP", - "LOOPBACK", - "RUNNING", - "MULTICAST" - ], - "ipv4": [ - { - "address": "127.0.0.1", - "broadcast": "127.255.255.255", - "netmask": "255.0.0.0", - "network": "127.0.0.0" - } - ], - "ipv6": [ - { - "address": "::1", - "prefix": "128" - }, - { - "address": "fe80::1%lo0", - "prefix": "64", - "scope": "0x1" - } - ], - "macaddress": "unknown", - "mtu": "16384", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "loopback" - }, - "lsb": {}, - "machine": "x86_64", - "memfree_mb": 94, - "memtotal_mb": 16384, - "model": "MacBookPro11,2", - "module_setup": true, - "nodename": "MacBook-Pro-4.domain", - "os_family": "Darwin", - "osrevision": "199506", - "osversion": "19A583", - "p2p0": { - "device": "p2p0", - "flags": [ - "UP", - "BROADCAST", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "06:36:3b:cf:f2:b2", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "2304", - "options": [ - "CHANNEL_IO" - ], - "status": "inactive", - "type": "ether" - }, - "pkg_mgr": "homebrew", - "processor": "Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz", - "processor_cores": "4", - "processor_vcpus": "8", - "python": { - "executable": "/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python", - "has_sslcontext": true, - "type": "CPython", - "version": { - "major": 2, - "micro": 16, - "minor": 7, - "releaselevel": "final", - "serial": 0 - }, - "version_info": [ - 2, - 7, - 16, - "final", - 0 - ] - }, - "python_version": "2.7.16", - "real_group_id": 20, - "real_user_id": 501, - "selinux": { - "status": "Missing selinux Python library" - }, - "selinux_python_present": false, - "service_mgr": "launchd", - "ssh_host_key_dsa_public": "AAAAB3NzaC1kc3MAAACBANaOKYJdhj0tZBxpolab3EOj5QIOPtKRCcuSopZyEHnqROCHsPSfITy9XsDCAuFpdnkWmyPWE6Phix4BHFq3X+ArP0hHZWxl8zF5nRss25WgtJg/ntJJ3kK8F7ldkqd89HISMnwkCJTp99842x0pFfPn5/hDJfStGXnTcABj/GPnAAAAFQCXBgShNVEh9ddQR32k1I4nxojRZQAAAIBhf04evMhdXIjhD8swgtp8DJkaZ0Nd7eXcJIiuSOdHwtffaBH1llL2L0vELrvLtvJSTEpnh000mqlRoX8C0wSC20SoWV5ul4kxvdmliXvO2BhG0XXfUOvqPxt9+W1KDv+9xvbembAfJvWJ1VDUJb/tXRpw+/Hz4pviuKLQ9CPR/wAAAIBIy04P3TZ7h7UN+mYhld+YKR2ei6HAGooF4uaGxPh1xzZtLUyidFg3+iPU0AMAZfHzB01ZLMqsJSXutZnJ5twmmyMef55c+YZpw9aBMCWZzhbrPoowoly86c6Aq6zwEiyiCeMrdnXcTouh12MpmfzgfT7j7LiyZsLtvQQVCp6Y8w==", - "ssh_host_key_ecdsa_public": "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLkhDLo+ofDRAYNdnntLko5AFFw5yfeW15JOtfFsq04LvBDT6ZvEx8rRLiCSnaXMdDjlvj/gU6LYJTWM+5MPeKc=", - "ssh_host_key_ed25519_public": "AAAAC3NzaC1lZDI1NTE5AAAAIAs4JsI/X77ORabsqAt2Kv/LKXtlvXvYi6L11wF6sLSG", - "ssh_host_key_rsa_public": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDFMVMTbD4rv09xtTpJPIGjitvK0Ell5m+BGUjP3q8c+CloxwVmHhx3MDLz4CnAp+FpqfZRO2nxbPgbw+FAkhlPy08IWKbO9Ttm31tRDQT87P4dcF59lfWJ0lt9z0ZW81GeztH0pQEB/ug9LYgJjUSBlqKPfwNDbmeWZzqMnCfXpRzyFgNiNo/uFfpe/flnpjP2pS+V3qPD4hO5SAAi7oPSLW8pTeQKU/luPQldiEKNcu43nqWiFFJaxIQ5jhj1DmCY2C73aXeeAW95gDay1T/C6XqsOaAAxlFi6rp217MdCZqz3ut+MHnYYARrp3cqL4RSg4B4Sa4Fj1FFevxYZv7f", - "stf0": { - "device": "stf0", - "flags": [], - "ipv4": [], - "ipv6": [], - "macaddress": "unknown", - "mtu": "1280", - "type": "unknown" - }, - "system": "Darwin", - "user_dir": "/Users/jamestombleson", - "user_gecos": "James Tombleson", - "user_gid": 20, - "user_id": "jamestombleson", - "user_shell": "/bin/zsh", - "user_uid": 501, - "userspace_architecture": "x86_64", - "userspace_bits": "64", - "utun0": { - "device": "utun0", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::4a0c:f6b5:f6fa:d72e%utun0", - "prefix": "64", - "scope": "0xc" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "utun1": { - "device": "utun1", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::ede1:8366:c98:a7b1%utun1", - "prefix": "64", - "scope": "0xd" - } - ], - "macaddress": "unknown", - "mtu": "2000", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "utun2": { - "device": "utun2", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::583d:52ab:afc:8a7f%utun2", - "prefix": "64", - "scope": "0xe" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "utun3": { - "device": "utun3", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::4adc:23a1:e517:35f1%utun3", - "prefix": "64", - "scope": "0xf" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "utun4": { - "device": "utun4", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::32f7:6f62:3d81:5cba%utun4", - "prefix": "64", - "scope": "0x10" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "utun5": { - "device": "utun5", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::ed73:d6b:d97a:cf4f%utun5", - "prefix": "64", - "scope": "0x11" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "virtualization_role": "", - "virtualization_type": "" - }, - "ansible_fips": false, - "ansible_forks": 5, - "ansible_fqdn": "macbook-pro-4.domain", - "ansible_gif0": { - "device": "gif0", - "flags": [ - "POINTOPOINT", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "unknown", - "mtu": "1280", - "type": "unknown" - }, - "ansible_hostname": "MacBook-Pro-4", - "ansible_interfaces": [ - "XHC20", - "awdl0", - "bridge0", - "en0", - "en1", - "en2", - "gif0", - "ipsec0", - "llw0", - "lo0", - "p2p0", - "stf0", - "utun0", - "utun1", - "utun2", - "utun3", - "utun4", - "utun5" - ], - "ansible_inventory_sources": [ - "/Users/jamestombleson/Documents/GitHub/Ansible/hosts" - ], - "ansible_ipsec0": { - "device": "ipsec0", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::3636:3bff:fecf:f2b2%ipsec0", - "prefix": "64", - "scope": "0x12" - }, - { - "address": "2607:fb90:cc1:58dc:6b1:7b3a:6b5d:fad7", - "prefix": "64" - } - ], - "macaddress": "unknown", - "mtu": "50000", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "ansible_is_chroot": false, - "ansible_iscsi_iqn": "", - "ansible_kernel": "19.0.0", - "ansible_llw0": { - "device": "llw0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::2828:d6ff:fe5e:de8%llw0", - "prefix": "64", - "scope": "0x8" - } - ], - "macaddress": "2a:28:d6:5e:0d:e8", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1500", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "ansible_lo0": { - "device": "lo0", - "flags": [ - "UP", - "LOOPBACK", - "RUNNING", - "MULTICAST" - ], - "ipv4": [ - { - "address": "127.0.0.1", - "broadcast": "127.255.255.255", - "netmask": "255.0.0.0", - "network": "127.0.0.0" - } - ], - "ipv6": [ - { - "address": "::1", - "prefix": "128" - }, - { - "address": "fe80::1%lo0", - "prefix": "64", - "scope": "0x1" - } - ], - "macaddress": "unknown", - "mtu": "16384", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "loopback" - }, - "ansible_local": {}, - "ansible_lsb": {}, - "ansible_machine": "x86_64", - "ansible_memfree_mb": 94, - "ansible_memtotal_mb": 16384, - "ansible_model": "MacBookPro11,2", - "ansible_nodename": "MacBook-Pro-4.domain", - "ansible_os_family": "Darwin", - "ansible_osrevision": "199506", - "ansible_osversion": "19A583", - "ansible_p2p0": { - "device": "p2p0", - "flags": [ - "UP", - "BROADCAST", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "06:36:3b:cf:f2:b2", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "2304", - "options": [ - "CHANNEL_IO" - ], - "status": "inactive", - "type": "ether" - }, - "ansible_password": "Pm98cdLm38iq", - "ansible_pkg_mgr": "homebrew", - "ansible_playbook_python": "/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python", - "ansible_processor": "Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz", - "ansible_processor_cores": "4", - "ansible_processor_vcpus": "8", - "ansible_python": { - "executable": "/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python", - "has_sslcontext": true, - "type": "CPython", - "version": { - "major": 2, - "micro": 16, - "minor": 7, - "releaselevel": "final", - "serial": 0 - }, - "version_info": [ - 2, - 7, - 16, - "final", - 0 - ] - }, - "ansible_python_version": "2.7.16", - "ansible_real_group_id": 20, - "ansible_real_user_id": 501, - "ansible_run_tags": [ - "all" - ], - "ansible_selinux": { - "status": "Missing selinux Python library" - }, - "ansible_selinux_python_present": false, - "ansible_service_mgr": "launchd", - "ansible_skip_tags": [], - "ansible_ssh_host_key_dsa_public": "AAAAB3NzaC1kc3MAAACBANaOKYJdhj0tZBxpolab3EOj5QIOPtKRCcuSopZyEHnqROCHsPSfITy9XsDCAuFpdnkWmyPWE6Phix4BHFq3X+ArP0hHZWxl8zF5nRss25WgtJg/ntJJ3kK8F7ldkqd89HISMnwkCJTp99842x0pFfPn5/hDJfStGXnTcABj/GPnAAAAFQCXBgShNVEh9ddQR32k1I4nxojRZQAAAIBhf04evMhdXIjhD8swgtp8DJkaZ0Nd7eXcJIiuSOdHwtffaBH1llL2L0vELrvLtvJSTEpnh000mqlRoX8C0wSC20SoWV5ul4kxvdmliXvO2BhG0XXfUOvqPxt9+W1KDv+9xvbembAfJvWJ1VDUJb/tXRpw+/Hz4pviuKLQ9CPR/wAAAIBIy04P3TZ7h7UN+mYhld+YKR2ei6HAGooF4uaGxPh1xzZtLUyidFg3+iPU0AMAZfHzB01ZLMqsJSXutZnJ5twmmyMef55c+YZpw9aBMCWZzhbrPoowoly86c6Aq6zwEiyiCeMrdnXcTouh12MpmfzgfT7j7LiyZsLtvQQVCp6Y8w==", - "ansible_ssh_host_key_ecdsa_public": "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLkhDLo+ofDRAYNdnntLko5AFFw5yfeW15JOtfFsq04LvBDT6ZvEx8rRLiCSnaXMdDjlvj/gU6LYJTWM+5MPeKc=", - "ansible_ssh_host_key_ed25519_public": "AAAAC3NzaC1lZDI1NTE5AAAAIAs4JsI/X77ORabsqAt2Kv/LKXtlvXvYi6L11wF6sLSG", - "ansible_ssh_host_key_rsa_public": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDFMVMTbD4rv09xtTpJPIGjitvK0Ell5m+BGUjP3q8c+CloxwVmHhx3MDLz4CnAp+FpqfZRO2nxbPgbw+FAkhlPy08IWKbO9Ttm31tRDQT87P4dcF59lfWJ0lt9z0ZW81GeztH0pQEB/ug9LYgJjUSBlqKPfwNDbmeWZzqMnCfXpRzyFgNiNo/uFfpe/flnpjP2pS+V3qPD4hO5SAAi7oPSLW8pTeQKU/luPQldiEKNcu43nqWiFFJaxIQ5jhj1DmCY2C73aXeeAW95gDay1T/C6XqsOaAAxlFi6rp217MdCZqz3ut+MHnYYARrp3cqL4RSg4B4Sa4Fj1FFevxYZv7f", - "ansible_stf0": { - "device": "stf0", - "flags": [], - "ipv4": [], - "ipv6": [], - "macaddress": "unknown", - "mtu": "1280", - "type": "unknown" - }, - "ansible_system": "Darwin", - "ansible_user": "jamestombleson", - "ansible_user_dir": "/Users/jamestombleson", - "ansible_user_gecos": "James Tombleson", - "ansible_user_gid": 20, - "ansible_user_id": "jamestombleson", - "ansible_user_shell": "/bin/zsh", - "ansible_user_uid": 501, - "ansible_userspace_architecture": "x86_64", - "ansible_userspace_bits": "64", - "ansible_utun0": { - "device": "utun0", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::4a0c:f6b5:f6fa:d72e%utun0", - "prefix": "64", - "scope": "0xc" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "ansible_utun1": { - "device": "utun1", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::ede1:8366:c98:a7b1%utun1", - "prefix": "64", - "scope": "0xd" - } - ], - "macaddress": "unknown", - "mtu": "2000", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "ansible_utun2": { - "device": "utun2", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::583d:52ab:afc:8a7f%utun2", - "prefix": "64", - "scope": "0xe" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "ansible_utun3": { - "device": "utun3", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::4adc:23a1:e517:35f1%utun3", - "prefix": "64", - "scope": "0xf" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "ansible_utun4": { - "device": "utun4", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::32f7:6f62:3d81:5cba%utun4", - "prefix": "64", - "scope": "0x10" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "ansible_utun5": { - "device": "utun5", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::ed73:d6b:d97a:cf4f%utun5", - "prefix": "64", - "scope": "0x11" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "ansible_verbosity": 0, - "ansible_version": { - "full": "2.7.9", - "major": 2, - "minor": 7, - "revision": 9, - "string": "2.7.9" - }, - "ansible_virtualization_role": "", - "ansible_virtualization_type": "", - "gather_subset": [ - "all" - ], - "group_names": [ - "osx" - ], - "groups": { - "all": [ - "192.168.0.60", - "192.168.0.2", - "127.0.0.1" - ], - "elastic": [ - "192.168.0.60" - ], - "jenkins": [ - "192.168.0.60" - ], - "linux": [ - "192.168.0.60" - ], - "osx": [ - "127.0.0.1" - ], - "sensu_masters": [ - "192.168.0.60" - ], - "sensu_rabbitmq_servers": [ - "192.168.0.60" - ], - "sensu_redis_servers": [ - "192.168.0.60" - ], - "ungrouped": [], - "windows": [ - "192.168.0.2" - ] - }, - "inventory_dir": "/Users/jamestombleson/Documents/GitHub/Ansible", - "inventory_file": "/Users/jamestombleson/Documents/GitHub/Ansible/hosts", - "inventory_hostname": "127.0.0.1", - "inventory_hostname_short": "127", - "module_setup": true, - "omit": "__omit_place_holder__be3b83228b8f7956e31f1e458503db2cc38e63fc", - "playbook_dir": "/Users/jamestombleson/Documents/GitHub/Ansible/playbook" - }, - "192.168.0.2": { - "ansible_check_mode": false, - "ansible_connection": "winrm", - "ansible_diff_mode": false, - "ansible_facts": {}, - "ansible_forks": 5, - "ansible_inventory_sources": [ - "/Users/jamestombleson/Documents/GitHub/Ansible/hosts" - ], - "ansible_password": "", - "ansible_playbook_python": "/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python", - "ansible_port": 5986, - "ansible_run_tags": [ - "all" - ], - "ansible_skip_tags": [], - "ansible_user": "ansible", - "ansible_verbosity": 0, - "ansible_version": { - "full": "2.7.9", - "major": 2, - "minor": 7, - "revision": 9, - "string": "2.7.9" - }, - "ansible_winrm_scheme": "https", - "ansible_winrm_server_cert_validation": "ignore", - "group_names": [ - "windows" - ], - "groups": { - "all": [ - "192.168.0.60", - "192.168.0.2", - "127.0.0.1" - ], - "elastic": [ - "192.168.0.60" - ], - "jenkins": [ - "192.168.0.60" - ], - "linux": [ - "192.168.0.60" - ], - "osx": [ - "127.0.0.1" - ], - "sensu_masters": [ - "192.168.0.60" - ], - "sensu_rabbitmq_servers": [ - "192.168.0.60" - ], - "sensu_redis_servers": [ - "192.168.0.60" - ], - "ungrouped": [], - "windows": [ - "192.168.0.2" - ] - }, - "inventory_dir": "/Users/jamestombleson/Documents/GitHub/Ansible", - "inventory_file": "/Users/jamestombleson/Documents/GitHub/Ansible/hosts", - "inventory_hostname": "192.168.0.2", - "inventory_hostname_short": "192", - "omit": "__omit_place_holder__be3b83228b8f7956e31f1e458503db2cc38e63fc", - "playbook_dir": "/Users/jamestombleson/Documents/GitHub/Ansible/playbook" - }, - "192.168.0.60": { - "ansible_become_method": "sudo", - "ansible_become_pass": "Lm38iq", - "ansible_check_mode": false, - "ansible_connection": "ssh", - "ansible_diff_mode": false, - "ansible_facts": {}, - "ansible_forks": 5, - "ansible_inventory_sources": [ - "/Users/jamestombleson/Documents/GitHub/Ansible/hosts" - ], - "ansible_password": "Lm38iq", - "ansible_playbook_python": "/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python", - "ansible_python_interpreter": "/usr/bin/python3", - "ansible_run_tags": [ - "all" - ], - "ansible_skip_tags": [], - "ansible_user": "ansible", - "ansible_verbosity": 0, - "ansible_version": { - "full": "2.7.9", - "major": 2, - "minor": 7, - "revision": 9, - "string": "2.7.9" - }, - "group_names": [ - "elastic", - "jenkins", - "linux", - "sensu_masters", - "sensu_rabbitmq_servers", - "sensu_redis_servers" - ], - "groups": { - "all": [ - "192.168.0.60", - "192.168.0.2", - "127.0.0.1" - ], - "elastic": [ - "192.168.0.60" - ], - "jenkins": [ - "192.168.0.60" - ], - "linux": [ - "192.168.0.60" - ], - "osx": [ - "127.0.0.1" - ], - "sensu_masters": [ - "192.168.0.60" - ], - "sensu_rabbitmq_servers": [ - "192.168.0.60" - ], - "sensu_redis_servers": [ - "192.168.0.60" - ], - "ungrouped": [], - "windows": [ - "192.168.0.2" - ] - }, - "inventory_dir": "/Users/jamestombleson/Documents/GitHub/Ansible", - "inventory_file": "/Users/jamestombleson/Documents/GitHub/Ansible/hosts", - "inventory_hostname": "192.168.0.60", - "inventory_hostname_short": "192", - "omit": "__omit_place_holder__be3b83228b8f7956e31f1e458503db2cc38e63fc", - "playbook_dir": "/Users/jamestombleson/Documents/GitHub/Ansible/playbook" - } - }, - "inventory_dir": "/Users/jamestombleson/Documents/GitHub/Ansible", - "inventory_file": "/Users/jamestombleson/Documents/GitHub/Ansible/hosts", - "inventory_hostname": "127.0.0.1", - "inventory_hostname_short": "127", - "module_setup": true, - "omit": "__omit_place_holder__be3b83228b8f7956e31f1e458503db2cc38e63fc", - "play_hosts": [ - "127.0.0.1" - ], - "playbook_dir": "/Users/jamestombleson/Documents/GitHub/Ansible/playbook", - "role_names": [] -} - -Environment Variables ("environment"): --------------------------------- -[] - -GROUP NAMES Variables ("group_names"): --------------------------------- -[ - "osx" -] - -GROUPS Variables ("groups"): --------------------------------- -{ - "all": [ - "192.168.0.60", - "192.168.0.2", - "127.0.0.1" - ], - "elastic": [ - "192.168.0.60" - ], - "jenkins": [ - "192.168.0.60" - ], - "linux": [ - "192.168.0.60" - ], - "osx": [ - "127.0.0.1" - ], - "sensu_masters": [ - "192.168.0.60" - ], - "sensu_rabbitmq_servers": [ - "192.168.0.60" - ], - "sensu_redis_servers": [ - "192.168.0.60" - ], - "ungrouped": [], - "windows": [ - "192.168.0.2" - ] -} - -HOST Variables ("hostvars"): --------------------------------- -{ - "127.0.0.1": { - "ansible_XHC20": { - "device": "XHC20", - "flags": [], - "ipv4": [], - "ipv6": [], - "macaddress": "unknown", - "mtu": "0", - "type": "unknown" - }, - "ansible_all_ipv4_addresses": [ - "192.168.0.34" - ], - "ansible_all_ipv6_addresses": [ - "fe80::421:ab7:8eea:ae1b%en0", - "fe80::2828:d6ff:fe5e:de8%awdl0", - "fe80::2828:d6ff:fe5e:de8%llw0", - "fe80::4a0c:f6b5:f6fa:d72e%utun0", - "fe80::ede1:8366:c98:a7b1%utun1", - "fe80::583d:52ab:afc:8a7f%utun2", - "fe80::4adc:23a1:e517:35f1%utun3", - "fe80::32f7:6f62:3d81:5cba%utun4", - "fe80::ed73:d6b:d97a:cf4f%utun5", - "fe80::3636:3bff:fecf:f2b2%ipsec0", - "2607:fb90:cc1:58dc:6b1:7b3a:6b5d:fad7" - ], - "ansible_apparmor": { - "status": "disabled" - }, - "ansible_architecture": "x86_64", - "ansible_awdl0": { - "device": "awdl0", - "flags": [ - "UP", - "BROADCAST", - "RUNNING", - "PROMISC", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::2828:d6ff:fe5e:de8%awdl0", - "prefix": "64", - "scope": "0x7" - } - ], - "macaddress": "2a:28:d6:5e:0d:e8", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1484", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "ansible_bridge0": { - "device": "bridge0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "82:0f:22:2a:5f:00", - "media": "Unknown", - "media_select": "Unknown", - "media_type": "unknown type", - "mtu": "1500", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "inactive", - "type": "ether" - }, - "ansible_check_mode": false, - "ansible_date_time": { - "date": "2019-10-18", - "day": "18", - "epoch": "1571450977", - "hour": "19", - "iso8601": "2019-10-19T02:09:37Z", - "iso8601_basic": "20191018T190937748074", - "iso8601_basic_short": "20191018T190937", - "iso8601_micro": "2019-10-19T02:09:37.748159Z", - "minute": "09", - "month": "10", - "second": "37", - "time": "19:09:37", - "tz": "PDT", - "tz_offset": "-0700", - "weekday": "Friday", - "weekday_number": "5", - "weeknumber": "41", - "year": "2019" - }, - "ansible_default_ipv4": { - "address": "192.168.0.34", - "broadcast": "192.168.0.255", - "device": "en0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "gateway": "192.168.0.1", - "interface": "en0", - "macaddress": "34:36:3b:cf:f2:b2", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1500", - "netmask": "255.255.255.0", - "network": "192.168.0.0", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "ansible_default_ipv6": {}, - "ansible_diff_mode": false, - "ansible_distribution": "MacOSX", - "ansible_distribution_major_version": "10", - "ansible_distribution_release": "19.0.0", - "ansible_distribution_version": "10.15", - "ansible_dns": { - "domain": "domain", - "nameservers": [ - "192.168.0.1", - "192.168.0.1" - ] - }, - "ansible_domain": "domain", - "ansible_effective_group_id": 20, - "ansible_effective_user_id": 501, - "ansible_en0": { - "device": "en0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [ - { - "address": "192.168.0.34", - "broadcast": "192.168.0.255", - "netmask": "255.255.255.0", - "network": "192.168.0.0" - } - ], - "ipv6": [ - { - "address": "fe80::421:ab7:8eea:ae1b%en0", - "prefix": "64" - } - ], - "macaddress": "34:36:3b:cf:f2:b2", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1500", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "ansible_en1": { - "device": "en1", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "PROMISC", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "82:0f:22:2a:5f:00", - "media": "Unknown", - "media_select": "autoselect", - "media_type": "full-duplex", - "mtu": "1500", - "options": [ - "TSO4", - "TSO6", - "CHANNEL_IO" - ], - "status": "inactive", - "type": "ether" - }, - "ansible_en2": { - "device": "en2", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "PROMISC", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "82:0f:22:2a:5f:01", - "media": "Unknown", - "media_select": "autoselect", - "media_type": "full-duplex", - "mtu": "1500", - "options": [ - "TSO4", - "TSO6", - "CHANNEL_IO" - ], - "status": "inactive", - "type": "ether" - }, - "ansible_env": { - "HOME": "/Users/jamestombleson", - "LOGNAME": "jamestombleson", - "MAIL": "/var/mail/jamestombleson", - "PATH": "/usr/bin:/bin:/usr/sbin:/sbin", - "PWD": "/Users/jamestombleson", - "SHELL": "/bin/zsh", - "SHLVL": "1", - "SSH_CLIENT": "127.0.0.1 63351 22", - "SSH_CONNECTION": "127.0.0.1 63351 127.0.0.1 22", - "SSH_TTY": "/dev/ttys005", - "TERM": "xterm-256color", - "TMPDIR": "/var/folders/r3/7kdlrnn518x4653b3rk0z8000000gn/T/", - "USER": "jamestombleson", - "VERSIONER_PYTHON_VERSION": "2.7", - "_": "/usr/bin/python", - "__CF_USER_TEXT_ENCODING": "0x1F5:0x0:0x0" - }, - "ansible_facts": { - "XHC20": { - "device": "XHC20", - "flags": [], - "ipv4": [], - "ipv6": [], - "macaddress": "unknown", - "mtu": "0", - "type": "unknown" - }, - "all_ipv4_addresses": [ - "192.168.0.34" - ], - "all_ipv6_addresses": [ - "fe80::421:ab7:8eea:ae1b%en0", - "fe80::2828:d6ff:fe5e:de8%awdl0", - "fe80::2828:d6ff:fe5e:de8%llw0", - "fe80::4a0c:f6b5:f6fa:d72e%utun0", - "fe80::ede1:8366:c98:a7b1%utun1", - "fe80::583d:52ab:afc:8a7f%utun2", - "fe80::4adc:23a1:e517:35f1%utun3", - "fe80::32f7:6f62:3d81:5cba%utun4", - "fe80::ed73:d6b:d97a:cf4f%utun5", - "fe80::3636:3bff:fecf:f2b2%ipsec0", - "2607:fb90:cc1:58dc:6b1:7b3a:6b5d:fad7" - ], - "ansible_local": {}, - "apparmor": { - "status": "disabled" - }, - "architecture": "x86_64", - "awdl0": { - "device": "awdl0", - "flags": [ - "UP", - "BROADCAST", - "RUNNING", - "PROMISC", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::2828:d6ff:fe5e:de8%awdl0", - "prefix": "64", - "scope": "0x7" - } - ], - "macaddress": "2a:28:d6:5e:0d:e8", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1484", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "bridge0": { - "device": "bridge0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "82:0f:22:2a:5f:00", - "media": "Unknown", - "media_select": "Unknown", - "media_type": "unknown type", - "mtu": "1500", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "inactive", - "type": "ether" - }, - "date_time": { - "date": "2019-10-18", - "day": "18", - "epoch": "1571450977", - "hour": "19", - "iso8601": "2019-10-19T02:09:37Z", - "iso8601_basic": "20191018T190937748074", - "iso8601_basic_short": "20191018T190937", - "iso8601_micro": "2019-10-19T02:09:37.748159Z", - "minute": "09", - "month": "10", - "second": "37", - "time": "19:09:37", - "tz": "PDT", - "tz_offset": "-0700", - "weekday": "Friday", - "weekday_number": "5", - "weeknumber": "41", - "year": "2019" - }, - "default_ipv4": { - "address": "192.168.0.34", - "broadcast": "192.168.0.255", - "device": "en0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "gateway": "192.168.0.1", - "interface": "en0", - "macaddress": "34:36:3b:cf:f2:b2", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1500", - "netmask": "255.255.255.0", - "network": "192.168.0.0", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "default_ipv6": {}, - "distribution": "MacOSX", - "distribution_major_version": "10", - "distribution_release": "19.0.0", - "distribution_version": "10.15", - "dns": { - "domain": "domain", - "nameservers": [ - "192.168.0.1", - "192.168.0.1" - ] - }, - "domain": "domain", - "effective_group_id": 20, - "effective_user_id": 501, - "en0": { - "device": "en0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [ - { - "address": "192.168.0.34", - "broadcast": "192.168.0.255", - "netmask": "255.255.255.0", - "network": "192.168.0.0" - } - ], - "ipv6": [ - { - "address": "fe80::421:ab7:8eea:ae1b%en0", - "prefix": "64" - } - ], - "macaddress": "34:36:3b:cf:f2:b2", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1500", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "en1": { - "device": "en1", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "PROMISC", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "82:0f:22:2a:5f:00", - "media": "Unknown", - "media_select": "autoselect", - "media_type": "full-duplex", - "mtu": "1500", - "options": [ - "TSO4", - "TSO6", - "CHANNEL_IO" - ], - "status": "inactive", - "type": "ether" - }, - "en2": { - "device": "en2", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "PROMISC", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "82:0f:22:2a:5f:01", - "media": "Unknown", - "media_select": "autoselect", - "media_type": "full-duplex", - "mtu": "1500", - "options": [ - "TSO4", - "TSO6", - "CHANNEL_IO" - ], - "status": "inactive", - "type": "ether" - }, - "env": { - "HOME": "/Users/jamestombleson", - "LOGNAME": "jamestombleson", - "MAIL": "/var/mail/jamestombleson", - "PATH": "/usr/bin:/bin:/usr/sbin:/sbin", - "PWD": "/Users/jamestombleson", - "SHELL": "/bin/zsh", - "SHLVL": "1", - "SSH_CLIENT": "127.0.0.1 63351 22", - "SSH_CONNECTION": "127.0.0.1 63351 127.0.0.1 22", - "SSH_TTY": "/dev/ttys005", - "TERM": "xterm-256color", - "TMPDIR": "/var/folders/r3/7kdlrnn518x4653b3rk0z8000000gn/T/", - "USER": "jamestombleson", - "VERSIONER_PYTHON_VERSION": "2.7", - "_": "/usr/bin/python", - "__CF_USER_TEXT_ENCODING": "0x1F5:0x0:0x0" - }, - "fips": false, - "fqdn": "macbook-pro-4.domain", - "gather_subset": [ - "all" - ], - "gif0": { - "device": "gif0", - "flags": [ - "POINTOPOINT", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "unknown", - "mtu": "1280", - "type": "unknown" - }, - "hostname": "MacBook-Pro-4", - "interfaces": [ - "XHC20", - "awdl0", - "bridge0", - "en0", - "en1", - "en2", - "gif0", - "ipsec0", - "llw0", - "lo0", - "p2p0", - "stf0", - "utun0", - "utun1", - "utun2", - "utun3", - "utun4", - "utun5" - ], - "ipsec0": { - "device": "ipsec0", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::3636:3bff:fecf:f2b2%ipsec0", - "prefix": "64", - "scope": "0x12" - }, - { - "address": "2607:fb90:cc1:58dc:6b1:7b3a:6b5d:fad7", - "prefix": "64" - } - ], - "macaddress": "unknown", - "mtu": "50000", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "is_chroot": false, - "iscsi_iqn": "", - "kernel": "19.0.0", - "llw0": { - "device": "llw0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::2828:d6ff:fe5e:de8%llw0", - "prefix": "64", - "scope": "0x8" - } - ], - "macaddress": "2a:28:d6:5e:0d:e8", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1500", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "lo0": { - "device": "lo0", - "flags": [ - "UP", - "LOOPBACK", - "RUNNING", - "MULTICAST" - ], - "ipv4": [ - { - "address": "127.0.0.1", - "broadcast": "127.255.255.255", - "netmask": "255.0.0.0", - "network": "127.0.0.0" - } - ], - "ipv6": [ - { - "address": "::1", - "prefix": "128" - }, - { - "address": "fe80::1%lo0", - "prefix": "64", - "scope": "0x1" - } - ], - "macaddress": "unknown", - "mtu": "16384", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "loopback" - }, - "lsb": {}, - "machine": "x86_64", - "memfree_mb": 94, - "memtotal_mb": 16384, - "model": "MacBookPro11,2", - "module_setup": true, - "nodename": "MacBook-Pro-4.domain", - "os_family": "Darwin", - "osrevision": "199506", - "osversion": "19A583", - "p2p0": { - "device": "p2p0", - "flags": [ - "UP", - "BROADCAST", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "06:36:3b:cf:f2:b2", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "2304", - "options": [ - "CHANNEL_IO" - ], - "status": "inactive", - "type": "ether" - }, - "pkg_mgr": "homebrew", - "processor": "Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz", - "processor_cores": "4", - "processor_vcpus": "8", - "python": { - "executable": "/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python", - "has_sslcontext": true, - "type": "CPython", - "version": { - "major": 2, - "micro": 16, - "minor": 7, - "releaselevel": "final", - "serial": 0 - }, - "version_info": [ - 2, - 7, - 16, - "final", - 0 - ] - }, - "python_version": "2.7.16", - "real_group_id": 20, - "real_user_id": 501, - "selinux": { - "status": "Missing selinux Python library" - }, - "selinux_python_present": false, - "service_mgr": "launchd", - "ssh_host_key_dsa_public": "AAAAB3NzaC1kc3MAAACBANaOKYJdhj0tZBxpolab3EOj5QIOPtKRCcuSopZyEHnqROCHsPSfITy9XsDCAuFpdnkWmyPWE6Phix4BHFq3X+ArP0hHZWxl8zF5nRss25WgtJg/ntJJ3kK8F7ldkqd89HISMnwkCJTp99842x0pFfPn5/hDJfStGXnTcABj/GPnAAAAFQCXBgShNVEh9ddQR32k1I4nxojRZQAAAIBhf04evMhdXIjhD8swgtp8DJkaZ0Nd7eXcJIiuSOdHwtffaBH1llL2L0vELrvLtvJSTEpnh000mqlRoX8C0wSC20SoWV5ul4kxvdmliXvO2BhG0XXfUOvqPxt9+W1KDv+9xvbembAfJvWJ1VDUJb/tXRpw+/Hz4pviuKLQ9CPR/wAAAIBIy04P3TZ7h7UN+mYhld+YKR2ei6HAGooF4uaGxPh1xzZtLUyidFg3+iPU0AMAZfHzB01ZLMqsJSXutZnJ5twmmyMef55c+YZpw9aBMCWZzhbrPoowoly86c6Aq6zwEiyiCeMrdnXcTouh12MpmfzgfT7j7LiyZsLtvQQVCp6Y8w==", - "ssh_host_key_ecdsa_public": "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLkhDLo+ofDRAYNdnntLko5AFFw5yfeW15JOtfFsq04LvBDT6ZvEx8rRLiCSnaXMdDjlvj/gU6LYJTWM+5MPeKc=", - "ssh_host_key_ed25519_public": "AAAAC3NzaC1lZDI1NTE5AAAAIAs4JsI/X77ORabsqAt2Kv/LKXtlvXvYi6L11wF6sLSG", - "ssh_host_key_rsa_public": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDFMVMTbD4rv09xtTpJPIGjitvK0Ell5m+BGUjP3q8c+CloxwVmHhx3MDLz4CnAp+FpqfZRO2nxbPgbw+FAkhlPy08IWKbO9Ttm31tRDQT87P4dcF59lfWJ0lt9z0ZW81GeztH0pQEB/ug9LYgJjUSBlqKPfwNDbmeWZzqMnCfXpRzyFgNiNo/uFfpe/flnpjP2pS+V3qPD4hO5SAAi7oPSLW8pTeQKU/luPQldiEKNcu43nqWiFFJaxIQ5jhj1DmCY2C73aXeeAW95gDay1T/C6XqsOaAAxlFi6rp217MdCZqz3ut+MHnYYARrp3cqL4RSg4B4Sa4Fj1FFevxYZv7f", - "stf0": { - "device": "stf0", - "flags": [], - "ipv4": [], - "ipv6": [], - "macaddress": "unknown", - "mtu": "1280", - "type": "unknown" - }, - "system": "Darwin", - "user_dir": "/Users/jamestombleson", - "user_gecos": "James Tombleson", - "user_gid": 20, - "user_id": "jamestombleson", - "user_shell": "/bin/zsh", - "user_uid": 501, - "userspace_architecture": "x86_64", - "userspace_bits": "64", - "utun0": { - "device": "utun0", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::4a0c:f6b5:f6fa:d72e%utun0", - "prefix": "64", - "scope": "0xc" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "utun1": { - "device": "utun1", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::ede1:8366:c98:a7b1%utun1", - "prefix": "64", - "scope": "0xd" - } - ], - "macaddress": "unknown", - "mtu": "2000", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "utun2": { - "device": "utun2", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::583d:52ab:afc:8a7f%utun2", - "prefix": "64", - "scope": "0xe" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "utun3": { - "device": "utun3", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::4adc:23a1:e517:35f1%utun3", - "prefix": "64", - "scope": "0xf" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "utun4": { - "device": "utun4", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::32f7:6f62:3d81:5cba%utun4", - "prefix": "64", - "scope": "0x10" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "utun5": { - "device": "utun5", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::ed73:d6b:d97a:cf4f%utun5", - "prefix": "64", - "scope": "0x11" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "virtualization_role": "", - "virtualization_type": "" - }, - "ansible_fips": false, - "ansible_forks": 5, - "ansible_fqdn": "macbook-pro-4.domain", - "ansible_gif0": { - "device": "gif0", - "flags": [ - "POINTOPOINT", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "unknown", - "mtu": "1280", - "type": "unknown" - }, - "ansible_hostname": "MacBook-Pro-4", - "ansible_interfaces": [ - "XHC20", - "awdl0", - "bridge0", - "en0", - "en1", - "en2", - "gif0", - "ipsec0", - "llw0", - "lo0", - "p2p0", - "stf0", - "utun0", - "utun1", - "utun2", - "utun3", - "utun4", - "utun5" - ], - "ansible_inventory_sources": [ - "/Users/jamestombleson/Documents/GitHub/Ansible/hosts" - ], - "ansible_ipsec0": { - "device": "ipsec0", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::3636:3bff:fecf:f2b2%ipsec0", - "prefix": "64", - "scope": "0x12" - }, - { - "address": "2607:fb90:cc1:58dc:6b1:7b3a:6b5d:fad7", - "prefix": "64" - } - ], - "macaddress": "unknown", - "mtu": "50000", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "ansible_is_chroot": false, - "ansible_iscsi_iqn": "", - "ansible_kernel": "19.0.0", - "ansible_llw0": { - "device": "llw0", - "flags": [ - "UP", - "BROADCAST", - "SMART", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::2828:d6ff:fe5e:de8%llw0", - "prefix": "64", - "scope": "0x8" - } - ], - "macaddress": "2a:28:d6:5e:0d:e8", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "1500", - "options": [ - "PERFORMNUD", - "DAD" - ], - "status": "active", - "type": "ether" - }, - "ansible_lo0": { - "device": "lo0", - "flags": [ - "UP", - "LOOPBACK", - "RUNNING", - "MULTICAST" - ], - "ipv4": [ - { - "address": "127.0.0.1", - "broadcast": "127.255.255.255", - "netmask": "255.0.0.0", - "network": "127.0.0.0" - } - ], - "ipv6": [ - { - "address": "::1", - "prefix": "128" - }, - { - "address": "fe80::1%lo0", - "prefix": "64", - "scope": "0x1" - } - ], - "macaddress": "unknown", - "mtu": "16384", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "loopback" - }, - "ansible_local": {}, - "ansible_lsb": {}, - "ansible_machine": "x86_64", - "ansible_memfree_mb": 94, - "ansible_memtotal_mb": 16384, - "ansible_model": "MacBookPro11,2", - "ansible_nodename": "MacBook-Pro-4.domain", - "ansible_os_family": "Darwin", - "ansible_osrevision": "199506", - "ansible_osversion": "19A583", - "ansible_p2p0": { - "device": "p2p0", - "flags": [ - "UP", - "BROADCAST", - "RUNNING", - "SIMPLEX", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [], - "macaddress": "06:36:3b:cf:f2:b2", - "media": "Unknown", - "media_select": "autoselect", - "mtu": "2304", - "options": [ - "CHANNEL_IO" - ], - "status": "inactive", - "type": "ether" - }, - "ansible_password": "Pm98cdLm38iq", - "ansible_pkg_mgr": "homebrew", - "ansible_playbook_python": "/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python", - "ansible_processor": "Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz", - "ansible_processor_cores": "4", - "ansible_processor_vcpus": "8", - "ansible_python": { - "executable": "/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python", - "has_sslcontext": true, - "type": "CPython", - "version": { - "major": 2, - "micro": 16, - "minor": 7, - "releaselevel": "final", - "serial": 0 - }, - "version_info": [ - 2, - 7, - 16, - "final", - 0 - ] - }, - "ansible_python_version": "2.7.16", - "ansible_real_group_id": 20, - "ansible_real_user_id": 501, - "ansible_run_tags": [ - "all" - ], - "ansible_selinux": { - "status": "Missing selinux Python library" - }, - "ansible_selinux_python_present": false, - "ansible_service_mgr": "launchd", - "ansible_skip_tags": [], - "ansible_ssh_host_key_dsa_public": "AAAAB3NzaC1kc3MAAACBANaOKYJdhj0tZBxpolab3EOj5QIOPtKRCcuSopZyEHnqROCHsPSfITy9XsDCAuFpdnkWmyPWE6Phix4BHFq3X+ArP0hHZWxl8zF5nRss25WgtJg/ntJJ3kK8F7ldkqd89HISMnwkCJTp99842x0pFfPn5/hDJfStGXnTcABj/GPnAAAAFQCXBgShNVEh9ddQR32k1I4nxojRZQAAAIBhf04evMhdXIjhD8swgtp8DJkaZ0Nd7eXcJIiuSOdHwtffaBH1llL2L0vELrvLtvJSTEpnh000mqlRoX8C0wSC20SoWV5ul4kxvdmliXvO2BhG0XXfUOvqPxt9+W1KDv+9xvbembAfJvWJ1VDUJb/tXRpw+/Hz4pviuKLQ9CPR/wAAAIBIy04P3TZ7h7UN+mYhld+YKR2ei6HAGooF4uaGxPh1xzZtLUyidFg3+iPU0AMAZfHzB01ZLMqsJSXutZnJ5twmmyMef55c+YZpw9aBMCWZzhbrPoowoly86c6Aq6zwEiyiCeMrdnXcTouh12MpmfzgfT7j7LiyZsLtvQQVCp6Y8w==", - "ansible_ssh_host_key_ecdsa_public": "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLkhDLo+ofDRAYNdnntLko5AFFw5yfeW15JOtfFsq04LvBDT6ZvEx8rRLiCSnaXMdDjlvj/gU6LYJTWM+5MPeKc=", - "ansible_ssh_host_key_ed25519_public": "AAAAC3NzaC1lZDI1NTE5AAAAIAs4JsI/X77ORabsqAt2Kv/LKXtlvXvYi6L11wF6sLSG", - "ansible_ssh_host_key_rsa_public": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDFMVMTbD4rv09xtTpJPIGjitvK0Ell5m+BGUjP3q8c+CloxwVmHhx3MDLz4CnAp+FpqfZRO2nxbPgbw+FAkhlPy08IWKbO9Ttm31tRDQT87P4dcF59lfWJ0lt9z0ZW81GeztH0pQEB/ug9LYgJjUSBlqKPfwNDbmeWZzqMnCfXpRzyFgNiNo/uFfpe/flnpjP2pS+V3qPD4hO5SAAi7oPSLW8pTeQKU/luPQldiEKNcu43nqWiFFJaxIQ5jhj1DmCY2C73aXeeAW95gDay1T/C6XqsOaAAxlFi6rp217MdCZqz3ut+MHnYYARrp3cqL4RSg4B4Sa4Fj1FFevxYZv7f", - "ansible_stf0": { - "device": "stf0", - "flags": [], - "ipv4": [], - "ipv6": [], - "macaddress": "unknown", - "mtu": "1280", - "type": "unknown" - }, - "ansible_system": "Darwin", - "ansible_user": "jamestombleson", - "ansible_user_dir": "/Users/jamestombleson", - "ansible_user_gecos": "James Tombleson", - "ansible_user_gid": 20, - "ansible_user_id": "jamestombleson", - "ansible_user_shell": "/bin/zsh", - "ansible_user_uid": 501, - "ansible_userspace_architecture": "x86_64", - "ansible_userspace_bits": "64", - "ansible_utun0": { - "device": "utun0", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::4a0c:f6b5:f6fa:d72e%utun0", - "prefix": "64", - "scope": "0xc" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "ansible_utun1": { - "device": "utun1", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::ede1:8366:c98:a7b1%utun1", - "prefix": "64", - "scope": "0xd" - } - ], - "macaddress": "unknown", - "mtu": "2000", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "ansible_utun2": { - "device": "utun2", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::583d:52ab:afc:8a7f%utun2", - "prefix": "64", - "scope": "0xe" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "ansible_utun3": { - "device": "utun3", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::4adc:23a1:e517:35f1%utun3", - "prefix": "64", - "scope": "0xf" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "ansible_utun4": { - "device": "utun4", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::32f7:6f62:3d81:5cba%utun4", - "prefix": "64", - "scope": "0x10" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "ansible_utun5": { - "device": "utun5", - "flags": [ - "UP", - "POINTOPOINT", - "RUNNING", - "MULTICAST" - ], - "ipv4": [], - "ipv6": [ - { - "address": "fe80::ed73:d6b:d97a:cf4f%utun5", - "prefix": "64", - "scope": "0x11" - } - ], - "macaddress": "unknown", - "mtu": "1380", - "options": [ - "PERFORMNUD", - "DAD" - ], - "type": "unknown" - }, - "ansible_verbosity": 0, - "ansible_version": { - "full": "2.7.9", - "major": 2, - "minor": 7, - "revision": 9, - "string": "2.7.9" - }, - "ansible_virtualization_role": "", - "ansible_virtualization_type": "", - "gather_subset": [ - "all" - ], - "group_names": [ - "osx" - ], - "groups": { - "all": [ - "192.168.0.60", - "192.168.0.2", - "127.0.0.1" - ], - "elastic": [ - "192.168.0.60" - ], - "jenkins": [ - "192.168.0.60" - ], - "linux": [ - "192.168.0.60" - ], - "osx": [ - "127.0.0.1" - ], - "sensu_masters": [ - "192.168.0.60" - ], - "sensu_rabbitmq_servers": [ - "192.168.0.60" - ], - "sensu_redis_servers": [ - "192.168.0.60" - ], - "ungrouped": [], - "windows": [ - "192.168.0.2" - ] - }, - "inventory_dir": "/Users/jamestombleson/Documents/GitHub/Ansible", - "inventory_file": "/Users/jamestombleson/Documents/GitHub/Ansible/hosts", - "inventory_hostname": "127.0.0.1", - "inventory_hostname_short": "127", - "module_setup": true, - "omit": "__omit_place_holder__be3b83228b8f7956e31f1e458503db2cc38e63fc", - "playbook_dir": "/Users/jamestombleson/Documents/GitHub/Ansible/playbook" - }, - "192.168.0.2": { - "ansible_check_mode": false, - "ansible_connection": "winrm", - "ansible_diff_mode": false, - "ansible_facts": {}, - "ansible_forks": 5, - "ansible_inventory_sources": [ - "/Users/jamestombleson/Documents/GitHub/Ansible/hosts" - ], - "ansible_password": "", - "ansible_playbook_python": "/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python", - "ansible_port": 5986, - "ansible_run_tags": [ - "all" - ], - "ansible_skip_tags": [], - "ansible_user": "ansible", - "ansible_verbosity": 0, - "ansible_version": { - "full": "2.7.9", - "major": 2, - "minor": 7, - "revision": 9, - "string": "2.7.9" - }, - "ansible_winrm_scheme": "https", - "ansible_winrm_server_cert_validation": "ignore", - "group_names": [ - "windows" - ], - "groups": { - "all": [ - "192.168.0.60", - "192.168.0.2", - "127.0.0.1" - ], - "elastic": [ - "192.168.0.60" - ], - "jenkins": [ - "192.168.0.60" - ], - "linux": [ - "192.168.0.60" - ], - "osx": [ - "127.0.0.1" - ], - "sensu_masters": [ - "192.168.0.60" - ], - "sensu_rabbitmq_servers": [ - "192.168.0.60" - ], - "sensu_redis_servers": [ - "192.168.0.60" - ], - "ungrouped": [], - "windows": [ - "192.168.0.2" - ] - }, - "inventory_dir": "/Users/jamestombleson/Documents/GitHub/Ansible", - "inventory_file": "/Users/jamestombleson/Documents/GitHub/Ansible/hosts", - "inventory_hostname": "192.168.0.2", - "inventory_hostname_short": "192", - "omit": "__omit_place_holder__be3b83228b8f7956e31f1e458503db2cc38e63fc", - "playbook_dir": "/Users/jamestombleson/Documents/GitHub/Ansible/playbook" - }, - "192.168.0.60": { - "ansible_become_method": "sudo", - "ansible_become_pass": "Lm38iq", - "ansible_check_mode": false, - "ansible_connection": "ssh", - "ansible_diff_mode": false, - "ansible_facts": {}, - "ansible_forks": 5, - "ansible_inventory_sources": [ - "/Users/jamestombleson/Documents/GitHub/Ansible/hosts" - ], - "ansible_password": "Lm38iq", - "ansible_playbook_python": "/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python", - "ansible_python_interpreter": "/usr/bin/python3", - "ansible_run_tags": [ - "all" - ], - "ansible_skip_tags": [], - "ansible_user": "ansible", - "ansible_verbosity": 0, - "ansible_version": { - "full": "2.7.9", - "major": 2, - "minor": 7, - "revision": 9, - "string": "2.7.9" - }, - "group_names": [ - "elastic", - "jenkins", - "linux", - "sensu_masters", - "sensu_rabbitmq_servers", - "sensu_redis_servers" - ], - "groups": { - "all": [ - "192.168.0.60", - "192.168.0.2", - "127.0.0.1" - ], - "elastic": [ - "192.168.0.60" - ], - "jenkins": [ - "192.168.0.60" - ], - "linux": [ - "192.168.0.60" - ], - "osx": [ - "127.0.0.1" - ], - "sensu_masters": [ - "192.168.0.60" - ], - "sensu_rabbitmq_servers": [ - "192.168.0.60" - ], - "sensu_redis_servers": [ - "192.168.0.60" - ], - "ungrouped": [], - "windows": [ - "192.168.0.2" - ] - }, - "inventory_dir": "/Users/jamestombleson/Documents/GitHub/Ansible", - "inventory_file": "/Users/jamestombleson/Documents/GitHub/Ansible/hosts", - "inventory_hostname": "192.168.0.60", - "inventory_hostname_short": "192", - "omit": "__omit_place_holder__be3b83228b8f7956e31f1e458503db2cc38e63fc", - "playbook_dir": "/Users/jamestombleson/Documents/GitHub/Ansible/playbook" - } -} \ No newline at end of file diff --git a/ansible.cfg b/ansible.cfg index e65f6b8..3b10962 100644 --- a/ansible.cfg +++ b/ansible.cfg @@ -11,7 +11,7 @@ # some basic default values... -inventory = ./inventory/ +inventory = ./inventory/home.yaml #library = /usr/share/my_modules/:./modules/ # Looks like modules can only be pointed to a single directory diff --git a/inventory/home.yaml b/inventory/home.yaml index 39a6d0a..8d413da 100644 --- a/inventory/home.yaml +++ b/inventory/home.yaml @@ -1,32 +1,89 @@ ---- -all: - hosts: +all: children: - linux: - 192.160.0.60 - vars: - ansible_user: !vault | + linux-all: + hosts: + 192.168.0.60: + 192.168.0.76: + vars: + ansible_user: !vault | $ANSIBLE_VAULT;1.1;AES256 - 33393963653363383638373235363531386238626138366632336531663437373634333766656437 - 3462613266323931343431616465623439626534646238640a616461633434626631376266383234 - 61386535373738386632626331353665643137373234323566326633386234666534616330306639 - 3739633437353337380a373437643563663163653834653637363861663639363635333866613435 - 6636 - ansible_password: !vault | + 32323438633437386234366165646365303038656639396632313933396431376136343837393738 + 6131653037623836383032613766653233656338303566330a653938333062363432643365316133 + 61626164383063636362343362663133653964646139386635626365373564306238306566633930 + 3139363666373864620a656336653633376539616337303361333936313462623963643861646166 + 3364 + ansible_password: !vault | $ANSIBLE_VAULT;1.1;AES256 - 62386164373234666130346666653866663136623261386364636632303430616135343132303631 - 3632316465666237613232313761353135316433376562360a633931646238326139336532373633 - 32666636326332346536366165373030346265626633646335303033636337333336323164636338 - 3036393466633634640a313262373661623731623639343565653061663830303537666136346165 - 3834 - ansible_connection: ssh - ansible_become_method: sudo - ansible_become_pass: !vault | + 63363131623134643365366432393962613032383931613663353233356334316536326334333739 + 3130663431363561373437353262313430623131363864350a393064636161613232633036303139 + 65643166363565343562663937343866623035356639333635636432333363653463666433303035 + 6134646432353330630a343839643163323733623265356261306661396332326465656561633734 + 6231 + ansible_connection: ssh + ansible_become_method: sudo + ansible_become_pass: !vault | $ANSIBLE_VAULT;1.1;AES256 - 62386164373234666130346666653866663136623261386364636632303430616135343132303631 - 3632316465666237613232313761353135316433376562360a633931646238326139336532373633 - 32666636326332346536366165373030346265626633646335303033636337333336323164636338 - 3036393466633634640a313262373661623731623639343565653061663830303537666136346165 - 3834 - ansible_python_interpreter: /usr/bin/python3 + 63363131623134643365366432393962613032383931613663353233356334316536326334333739 + 3130663431363561373437353262313430623131363864350a393064636161613232633036303139 + 65643166363565343562663937343866623035356639333635636432333363653463666433303035 + 6134646432353330630a343839643163323733623265356261306661396332326465656561633734 + 6231 + ansible_python_interpreter: /usr/bin/python3 + docker: + hosts: + 192.168.0.76: + vars: + ansible_user: !vault | + $ANSIBLE_VAULT;1.1;AES256 + 32323438633437386234366165646365303038656639396632313933396431376136343837393738 + 6131653037623836383032613766653233656338303566330a653938333062363432643365316133 + 61626164383063636362343362663133653964646139386635626365373564306238306566633930 + 3139363666373864620a656336653633376539616337303361333936313462623963643861646166 + 3364 + ansible_password: !vault | + $ANSIBLE_VAULT;1.1;AES256 + 63363131623134643365366432393962613032383931613663353233356334316536326334333739 + 3130663431363561373437353262313430623131363864350a393064636161613232633036303139 + 65643166363565343562663937343866623035356639333635636432333363653463666433303035 + 6134646432353330630a343839643163323733623265356261306661396332326465656561633734 + 6231 + ansible_connection: ssh + ansible_become_method: sudo + ansible_become_pass: !vault | + $ANSIBLE_VAULT;1.1;AES256 + 63363131623134643365366432393962613032383931613663353233356334316536326334333739 + 3130663431363561373437353262313430623131363864350a393064636161613232633036303139 + 65643166363565343562663937343866623035356639333635636432333363653463666433303035 + 6134646432353330630a343839643163323733623265356261306661396332326465656561633734 + 6231 + ansible_python_interpreter: /usr/bin/python3 + mediaserver: + hosts: + 192.168.0.76: + vars: + ansible_user: !vault | + $ANSIBLE_VAULT;1.1;AES256 + 32323438633437386234366165646365303038656639396632313933396431376136343837393738 + 6131653037623836383032613766653233656338303566330a653938333062363432643365316133 + 61626164383063636362343362663133653964646139386635626365373564306238306566633930 + 3139363666373864620a656336653633376539616337303361333936313462623963643861646166 + 3364 + ansible_password: !vault | + $ANSIBLE_VAULT;1.1;AES256 + 63363131623134643365366432393962613032383931613663353233356334316536326334333739 + 3130663431363561373437353262313430623131363864350a393064636161613232633036303139 + 65643166363565343562663937343866623035356639333635636432333363653463666433303035 + 6134646432353330630a343839643163323733623265356261306661396332326465656561633734 + 6231 + ansible_connection: ssh + ansible_become_method: sudo + ansible_become_pass: !vault | + $ANSIBLE_VAULT;1.1;AES256 + 63363131623134643365366432393962613032383931613663353233356334316536326334333739 + 3130663431363561373437353262313430623131363864350a393064636161613232633036303139 + 65643166363565343562663937343866623035356639333635636432333363653463666433303035 + 6134646432353330630a343839643163323733623265356261306661396332326465656561633734 + 6231 + ansible_python_interpreter: /usr/bin/python3 + \ No newline at end of file diff --git a/playbook/docker/mediaserver/hydra.yml b/playbook/docker/mediaserver/hydra.yml index 1380c94..44ad307 100644 --- a/playbook/docker/mediaserver/hydra.yml +++ b/playbook/docker/mediaserver/hydra.yml @@ -1,24 +1,23 @@ --- # https://github.com/linuxserver/docker-hydra2 - name: Media Server - hosts: localhost + become: yes + hosts: linux vars_files: - vars.yml tasks: - - name: pip docker + - name: pip docker-py - absent + pip: + name: docker-py + state: absent + executable: pip3 + + - name: pip docker - present pip: name: docker - - - name: Hydra Config - docker_volume: - name: "{{ hydra_config }}" - state: present - - - name: Volume Shared Downloads - docker_volume: - name: "{{ shared_downloads }}" state: present + executable: pip3 - name: Hydra Network docker_network: @@ -28,11 +27,12 @@ docker_container: name: hydra state: stopped + ignore_errors: yes - name: Make Hydra docker_container: name: hydra - image: linuxserver/hydra2 + image: 'linuxserver/hydra2:latest' state: started env: PUID=1000 @@ -41,7 +41,8 @@ ports: - 5076:5076 volumes: - - "{{ hydra_config }}:/config" + #- "{{ hydra_config }}:/config" + - "/docker/hydra:/config" - "{{ shared_downloads }}:/downloads" networks: - name: "{{ network }}" \ No newline at end of file diff --git a/playbook/docker/mediaserver/mediaserver.yml b/playbook/docker/mediaserver/mediaserver.yml new file mode 100644 index 0000000..2fcbaff --- /dev/null +++ b/playbook/docker/mediaserver/mediaserver.yml @@ -0,0 +1,42 @@ + +- name: Configure Media Server + hosts: mediaserver + + tasks: + - name: install docker + import_role: + name: geerlingguy.docker + become: yes + + - name: make docker folder location + file: + path: /docker + state: directory + become: yes + + - name: make docker config path + file: + path: /docker/config + state: directory + become: yes + + - name: mount nfs to /docker/config + mount: + src: "192.168.0.16:/docker/" + path: /docker/config + fstype: nfs + boot: yes + state: mounted + become: yes + + - name: install docker pip package + pip: + name: docker + state: present + executable: pip3 + + - name: make docker network + docker_network: + - name: mediaserver + + \ No newline at end of file diff --git a/playbook/docker/mediaserver/mount.yml b/playbook/docker/mediaserver/mount.yml new file mode 100644 index 0000000..3c94ddd --- /dev/null +++ b/playbook/docker/mediaserver/mount.yml @@ -0,0 +1,18 @@ +--- +- name: mount external nfs disks + hosts: mediaserver + vars_files: + - vars.yml + + tasks: + - name: make mountpoint + file: + path: /docker/dockerconfig + state: directory + + - name: mount /docker to /docker/dockerconfig + mount: + path: 192.168.0.16:/docker + src: /docker/dockerconfig + boot: yes + state: mounted \ No newline at end of file diff --git a/playbook/docker/mediaserver/nzbget.yml b/playbook/docker/mediaserver/nzbget.yml new file mode 100644 index 0000000..fec4a12 --- /dev/null +++ b/playbook/docker/mediaserver/nzbget.yml @@ -0,0 +1,35 @@ +--- +- name: nzbget + hosts: linux + become: yes + vars_files: + - vars.yml + + tasks: + - name: pip docker + pip: + name: docker + executable: pip3 + + - name: stop nzb + docker_container: + name: nzbget + state: stopped + ignore_errors: yes + + - name: Make Nzb + docker_container: + name: nzbget + image: linuxserver/nzbget:latest + state: started + env: + PUID=1000 + PGID=1000 + TZ=Europe/London + ports: + - 6789:6789 + volumes: + - "/docker/config/nzbconfig:/config" + - "/docker/nzbdownloads:/downloads" + networks: + - name: "{{ network }}" \ No newline at end of file diff --git a/playbook/docker/mediaserver/sonarr.yml b/playbook/docker/mediaserver/sonarr.yml new file mode 100644 index 0000000..6795c32 --- /dev/null +++ b/playbook/docker/mediaserver/sonarr.yml @@ -0,0 +1,37 @@ +--- +- name: sonarr + hosts: linux + become: yes + vars_files: + - vars.yml + + tasks: + - name: pip docker + pip: + name: docker + + - name: stop sonarr + docker_container: + name: sonarr + state: stopped + ignore_errors: yes + + - name: start sonarr + docker_container: + name: sonarr + image: linuxserver/sonarr:latest + state: started + env: + PUID=1000 + PGID=1000 + TZ=Europe/London + UMASK_SET=022 #optional + ports: + - 8989:8989 + volumes: + - "/docker/sonarr/config:/config" + - "/docker/sonarr/data:/tv" + - "/docker/nzbdownloads:/downloads" + networks: + - name: "{{ network }}" + diff --git a/playbook/docker/mediaserver/vars.yml b/playbook/docker/mediaserver/vars.yml index f9b6e10..156a5cc 100644 --- a/playbook/docker/mediaserver/vars.yml +++ b/playbook/docker/mediaserver/vars.yml @@ -1,4 +1,21 @@ --- +# fstab info +mount_user: !vault | + $ANSIBLE_VAULT;1.1;AES256 + 38316431326133336166313838623232393765323137363737333161623262653632656664306266 + 3963633932616139616563386232323062623632313131620a613962623932303838663639373038 + 39333063363265616366343636366565386236626339663763323761363035623730333437646432 + 3463373232326334370a333033326637366534356430376637363861663133633634373832303032 + 6634 + +mount_pass: !vault | + $ANSIBLE_VAULT;1.1;AES256 + 37353436303838363038343639306636636165663335346166353133633935613235306235386336 + 3932313964333232333963623331373838393163616231320a323037653564303138633930323961 + 38646632663661616338643462346238363265323535383639616166396434663536626361663331 + 3166626638316561630a643465633938346431336430613235653465626231353831303961396134 + 3231 + # Volumes sonarr_data: sonarr_data sonarr_config: sonarr_config diff --git a/playbook/linux/auto-securityupdates.yml b/playbook/linux/auto-securityupdates.yml deleted file mode 100644 index 122e948..0000000 --- a/playbook/linux/auto-securityupdates.yml +++ /dev/null @@ -1,17 +0,0 @@ - ---- - -- name: enable - hosts: linux - - tasks: - # https://galaxy.ansible.com/jnv/unattended-upgrades - - name: unattended-upgrades - become: true - include_role: - name: jnv.unattended-upgrades - vars: - #unattended_package_blacklist: [] - unattended_automatic_reboot: true - - diff --git a/playbook/linux/common.yml b/playbook/linux/common.yml new file mode 100644 index 0000000..b3ce95c --- /dev/null +++ b/playbook/linux/common.yml @@ -0,0 +1,34 @@ +--- +# This is a common playbooks for all linux servers +# Contains all the basics needed for servers to get started +# Once this is installed and maintained look for server based roles like docker servers + +- name: Install Linux Requirement + hosts: linux-all + become: yes + + tasks: + - name: install packages + apt: + name: "{{ packages }}" + state: present + vars: + packages: + - python3 + - python3-pip + - nfs-common + - tree + when: ansible_distribution == "Ubuntu" + + - name: Install pip + include_role: + name: geerlingguy.pip + + # https://galaxy.ansible.com/jnv/unattended-upgrades + - name: unattended-upgrades + become: true + include_role: + name: jnv.unattended-upgrades + vars: + #unattended_package_blacklist: [] + unattended_automatic_reboot: true diff --git a/playbook/linux/elastic/elastic-7.x.list b/playbook/linux/elastic/elastic-7.x.list deleted file mode 100644 index 7eef915..0000000 --- a/playbook/linux/elastic/elastic-7.x.list +++ /dev/null @@ -1 +0,0 @@ -deb https://artifacts.elastic.co/packages/7.x/apt stable main diff --git a/playbook/linux/elastic/install-client.yml b/playbook/linux/elastic/install-client.yml deleted file mode 100644 index 67a923f..0000000 --- a/playbook/linux/elastic/install-client.yml +++ /dev/null @@ -1,40 +0,0 @@ ---- -# This will install all the client parts needed for elastic to monitor client computers - -- name: Install elastic client programs - hosts: elasticClients - vars: - kibana_host: '192.168.0.173:5601' - elasticsearch_hosts: '["192.168.0.173:9200"]' - - tasks: - - name: Install elastic repo - include: install-repo.yml - - - name: Install elastic heartbeat - become: true - apt: - name: heartbeat-elastic - - - name: Update Heatbeat config - become: true - template: - src: heartbeat.j2 - dest: /etc/heartbeat/heartbeat.yml - - - name: Configure elastic heartbeat - include: config-heartbeat.yml - - - name: Install elastic metricbeat - become: true - apt: - name: metricbeat - - - name: Update Metricbeat config - become: true - template: - src: metricbeat.j2 - dest: /etc/metricbeat/metricbeat.yml - - - name: Configure elastic metricbeat - include: config-metricbeat.yml diff --git a/playbook/linux/elastic/install-repo.yml b/playbook/linux/elastic/install-repo.yml deleted file mode 100644 index c4504a6..0000000 --- a/playbook/linux/elastic/install-repo.yml +++ /dev/null @@ -1,29 +0,0 @@ ---- - -- name: Install Elastic GPG Key - become: true - apt_key: - url: "https://artifacts.elastic.co/GPG-KEY-elasticsearch" - state: present - id: 46095ACC8548582C1A2699A9D27D666CD88E42B4 - -- name: Install apt-transport-https - become: true - apt: - name: apt-transport-https - -- name: Add Elastic Repo - become: true - copy: - dest: '/etc/apt/sources.list.d/elastic-7.x.list' - content: "deb https://artifacts.elastic.co/packages/7.x/apt stable main" - # copy: - #src: elastic-7.x.list - # dest: /etc/apt/sources.list.d/ - # backup: yes - -- name: Update Packages - become: true - apt: - update_cache: true - diff --git a/playbook/linux/elastic/install-role-filebeat.yml b/playbook/linux/elastic/install-role-filebeat.yml deleted file mode 100644 index 79453a1..0000000 --- a/playbook/linux/elastic/install-role-filebeat.yml +++ /dev/null @@ -1,14 +0,0 @@ - -- name: Install Filebeat - hosts: elasticClients - - tasks: - - name: Install Filebeat - include_role: - name: luther38.filebeat - vars: - kibana_host: 172.20.0.142:5601 - elasticsearch_hosts: "'172.20.0.142:9200'" - systemd_enabled: true - systemd_restart: true - diff --git a/playbook/linux/elastic/install-role-metricbeat.yml b/playbook/linux/elastic/install-role-metricbeat.yml deleted file mode 100644 index 8643cd0..0000000 --- a/playbook/linux/elastic/install-role-metricbeat.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- - -- name: Install Metricbeat - hosts: elasticClients - - tasks: - - name: Install Metricbeat - become: true - include_role: - name: luther38.metricbeat - vars: - kibana_host: 172.20.0.142 - elasticsearch_hosts: '["172.20.0.142:9200"]' - systemd_enable_service: true - systemd_restart_service: true - diff --git a/playbook/linux/elastic/install-role-winlogbeat.yml b/playbook/linux/elastic/install-role-winlogbeat.yml deleted file mode 100644 index ba943da..0000000 --- a/playbook/linux/elastic/install-role-winlogbeat.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- - -- name: Install WinLogBeat - hosts: windows - - tasks: - - name: Install WinLogBeat - become: true - include_role: - name: luther38.winlogbeat - vars: - version: 7.0.0 - kibana_host: 172.20.0.142 - elasticsearch_hosts: '["172.20.0.142:9200"]' - - diff --git a/playbook/linux/elastic/install-server.yml b/playbook/linux/elastic/install-server.yml deleted file mode 100644 index cf7ff19..0000000 --- a/playbook/linux/elastic/install-server.yml +++ /dev/null @@ -1,62 +0,0 @@ ---- -# This will install all elastic services for a elastic server -# ElasticSearch -# Kibana - -- name: Install Elastic server programs - hosts: elastic - vars: - es_cluster_name: 'logging-dev' - es_node_name: 'dev-data-01' - es_node_master: 'true' - es_node_data: 'true' - es_path_data: '/var/lib/elasticsearch' - es_path_logs: '/var/log/elasticsearch' - es_http_port: '9200' - es_transport_host: 'localhost' - es_transport_port: '9300' - k_server_port: 5601 - k_elasticsearch_hosts: 'http://192.168.0.173:9200' - - tasks: - - name: Install Requrements - include: install-repo.yml - - - name: Install ElasticSearch from apt - become: true - apt: - name: elasticsearch - - - name: Update ElasticSearch config - become: true - template: - src: elasticsearch.j2 - dest: /etc/elasticsearch/elasticsearch.yml - - - name: Configure ElasticSearch - include: config-elasticsearch.yml - - - name: Install Kibana from apt - become: true - apt: - name: kibana - - - name: Configure Kibana - become: true - template: - src: kibana.j2 - dest: /etc/kibana/kibana.yml - - - name: Configure Kibana - include: config-kibana.yml - - - name: Install Heartbeat - become: true - apt: - name: heartbeat - - #- name: Install Logstash - #become: true - #apt: - #name: logstash - diff --git a/playbook/linux/elastic/install-win-client.yml b/playbook/linux/elastic/install-win-client.yml deleted file mode 100644 index bd4e251..0000000 --- a/playbook/linux/elastic/install-win-client.yml +++ /dev/null @@ -1,27 +0,0 @@ ---- -# This will install all the client parts needed for elastic to monitor client computers - -- name: Install elastic client programs - hosts: windows - vars: - elastic_version: '7.0.0' - url_heartbeat: 'https://artifacts.elastic.co/downloads/beats/heartbeat/heartbeat-{{elastic_version}}-windows-x86_64.zip' - url_metricbeat: 'https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.0.0-windows-x86_64.zip' - url_winlogbeat: 'https://artifacts.elastic.co/downloads/beats/winlogbeat/winlogbeat-7.0.0-windows-x86_64.zip' - temp: 'c:\temp\' - program_files: 'c:\program files\' - kibana_host: '192.168.0.173:5601' - elasticsearch_hosts: '["192.168.0.173:9200"]' - - - tasks: - - name: make temp folder - win_file: - path: c:\temp\ - state: directory - - - name: Install Metricbeat - include: config-win-metricbeat.yml - - - name: Install WinLogbeat - include: config-winlogbeat.yml diff --git a/playbook/linux/elastic/role-test.yml b/playbook/linux/elastic/role-test.yml deleted file mode 100644 index 4f535bc..0000000 --- a/playbook/linux/elastic/role-test.yml +++ /dev/null @@ -1,35 +0,0 @@ - -- name: testing elastic role - hosts: elastic - - tasks: - - name: install/Update Java - become: true - import_role: - name: geerlingguy.java - - - name: install elasticsearch - become: true - import_role: - name: elasticsearch - vars: - cluster_name: "loggin-dev" - ufw_http_port: true - ufw_transport_port: true - systemd_enabled: true - systemd_restart: true - node_name: "{{ ansible_hostname }}" - discovery_seed_hosts: "'127.0.0.1', '172.20.0.142', '192.168.0.173'" - cluster_initial_master_nodes: " '172.20.0.142', '192.168.0.173' " - - - name: install kibana - become: true - import_role: - name: kibana - vars: - server_port: 5601 - ufw_server_port: true - server_host: "{{ ansible_default_ipv4.address }}" - server_name: "{{ ansible_hostname }}" - elasticsearch_hosts: " 'http://localhost:9200', 'http://dm-nagios.local:9200', 'http://172.20.0.142:9200' " - diff --git a/playbook/linux/install-awx.yml b/playbook/linux/install-awx.yml index 5bbc947..90a78fe 100644 --- a/playbook/linux/install-awx.yml +++ b/playbook/linux/install-awx.yml @@ -32,12 +32,10 @@ - name: pip remove docker pip: - name: docker + name: docker-py state: absent executable: pip - - roles: #- geerlingguy.repo-epel - geerlingguy.git diff --git a/playbook/linux/install-powershell.yml b/playbook/linux/install-powershell.yml deleted file mode 100644 index a2f2bf9..0000000 --- a/playbook/linux/install-powershell.yml +++ /dev/null @@ -1,34 +0,0 @@ - -- name: Install PowerShell Core - hosts: linux - #debugger: always - - tasks: - - name: Check if PowerShell is installed - failed_when: "'Failed' PowerShell is already installed." - apt: - name: powershell - - - name: Install Microsoft GPG Key - get_url: - url: https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb - dest: /tmp/ - - - name: Register GPG Key - become: true - become_method: sudo - apt: deb="/tmp/packages-microsoft-prod.deb" - #command: dpkg -i ~/packages-microsoft-prod.deb - - - name: Update repos and Install PowerShell Core - become: true - become_method: sudo - apt: - name: powershell - update_cache: yes - state: present - - - name: Remove Extra files - file: - state: absent - path: /tmp/packages-microsoft-prod.deb From 7cd173afcb88db54c41f98ed883839fefdd7a97b Mon Sep 17 00:00:00 2001 From: James Tombleson Date: Mon, 4 Nov 2019 06:35:24 -0800 Subject: [PATCH 5/5] Moving all mediaserver tasks to a single playbook --- playbook/docker/mediaserver/mediaserver.yml | 112 ++++++++++++++++++-- playbook/docker/mediaserver/vars.yml | 17 --- test.yaml | 30 ------ 3 files changed, 102 insertions(+), 57 deletions(-) delete mode 100644 test.yaml diff --git a/playbook/docker/mediaserver/mediaserver.yml b/playbook/docker/mediaserver/mediaserver.yml index 2fcbaff..1a576e1 100644 --- a/playbook/docker/mediaserver/mediaserver.yml +++ b/playbook/docker/mediaserver/mediaserver.yml @@ -1,6 +1,13 @@ - name: Configure Media Server hosts: mediaserver + become: yes + vars: + dockerFolder: "/docker" + dockerMount: "/docker/config" + dockerPlex: "/docker/plex" + nfsAddress: 192.168.0.16 + dockerNetwork: mediaserver tasks: - name: install docker @@ -10,24 +17,34 @@ - name: make docker folder location file: - path: /docker + path: "{{ dockerFolder }}" state: directory - become: yes - name: make docker config path file: - path: /docker/config + path: "{{ dockerMount }}" state: directory - become: yes - name: mount nfs to /docker/config mount: - src: "192.168.0.16:/docker/" - path: /docker/config + src: "{{ nfsAddress }}:/docker/" + path: "{{ dockerMount }}" + fstype: nfs + boot: yes + state: mounted + + - name: make plex mount point + file: + path: "{{ dockerPlex }}" + state: directory + + - name: mount nfs to /docker/plex + mount: + src: "{{nfsAddress }}:/plex/" + path: "{{ dockerPlex }}" fstype: nfs boot: yes state: mounted - become: yes - name: install docker pip package pip: @@ -37,6 +54,81 @@ - name: make docker network docker_network: - - name: mediaserver - - \ No newline at end of file + name: "{{ dockerNetwork }}" + + - name: stop hydra + docker_container: + name: hydra + state: stopped + ignore_errors: yes + + - name: Make Hydra + docker_container: + name: hydra + image: 'linuxserver/hydra2:latest' + state: started + env: + #PUID=1000 + #PGID=1000 + PUID=0 + PGID=0 + TZ=Europe/London + ports: + - 5076:5076 + volumes: + #- "{{ hydra_config }}:/config" + - "{{ dockerMount }}/hydra:/config" + - "/docker/downloads:/downloads" + networks: + - name: "{{ dockerNetwork }}" + + - name: stop sonarr + docker_container: + name: sonarr + state: stopped + ignore_errors: yes + + - name: start sonarr + docker_container: + name: sonarr + image: linuxserver/sonarr:latest + state: started + env: + # Use 0 because this runs as root + #PUID=1000 + #PGID=1000 + PUID=0 + PGID=0 + TZ=Europe/London + UMASK_SET=022 #optional + ports: + - 8989:8989 + volumes: + - "{{ dockerMount }}/sonarr/config:/config" + - "/docker/sonarr/data:/tv" + - "/docker/downloads:/downloads" + networks: + - name: "{{ dockerNetwork }}" + + - name: stop nzb + docker_container: + name: nzbget + state: stopped + ignore_errors: yes + + - name: Make Nzb + docker_container: + name: nzbget + image: linuxserver/nzbget:latest + state: started + env: + PUID=0 + PGID=0 + TZ=Europe/London + ports: + - 6789:6789 + volumes: + - "{{ dockerMount }}/nzbget:/config" + - "/docker/downloads:/downloads" + networks: + - name: "{{ dockerNetwork }}" \ No newline at end of file diff --git a/playbook/docker/mediaserver/vars.yml b/playbook/docker/mediaserver/vars.yml index 156a5cc..f9b6e10 100644 --- a/playbook/docker/mediaserver/vars.yml +++ b/playbook/docker/mediaserver/vars.yml @@ -1,21 +1,4 @@ --- -# fstab info -mount_user: !vault | - $ANSIBLE_VAULT;1.1;AES256 - 38316431326133336166313838623232393765323137363737333161623262653632656664306266 - 3963633932616139616563386232323062623632313131620a613962623932303838663639373038 - 39333063363265616366343636366565386236626339663763323761363035623730333437646432 - 3463373232326334370a333033326637366534356430376637363861663133633634373832303032 - 6634 - -mount_pass: !vault | - $ANSIBLE_VAULT;1.1;AES256 - 37353436303838363038343639306636636165663335346166353133633935613235306235386336 - 3932313964333232333963623331373838393163616231320a323037653564303138633930323961 - 38646632663661616338643462346238363265323535383639616166396434663536626361663331 - 3166626638316561630a643465633938346431336430613235653465626231353831303961396134 - 3231 - # Volumes sonarr_data: sonarr_data sonarr_config: sonarr_config diff --git a/test.yaml b/test.yaml deleted file mode 100644 index 54d459b..0000000 --- a/test.yaml +++ /dev/null @@ -1,30 +0,0 @@ ---- -all: - hosts: - dmi-dev01: - children: - linux: - hosts: - 172.20.0.142: - vars: - ansible_user: ansible - ansible_connection: ssh - ansible_password: - ansible_become_method: sudo - ansible_become_pass: - ansible_python_interpreter: /usr/bin/python3 - windows: - hosts: - dev01: - vars: - ansible_user: ansible - ansible_password: - ansible_connection: winrm - ansible_port: 5985 - ansible_winrm_scheme: http - ansible_winrm_transport: ntlm - ansible_winrm_server_cert_validation: ignore - osx: - hosts: - 127.0.0.1 -