From e1e343667a13feb4060fb785e6d8e743d59d0d25 Mon Sep 17 00:00:00 2001 From: Guillem Hernandez Sola Date: Fri, 30 May 2025 09:53:45 +0200 Subject: [PATCH] Added all files --- .gitignore | 78 ++++++ README.md | 229 ++++++++++++++++++ Vagrantfile | 59 +++++ ansible.sh | 6 + examples/000_example/group_vars/all | 3 + examples/000_example/group_vars/webservers | 7 + examples/000_example/hosts | 2 + examples/000_example/roles/apache/README.md | 38 +++ .../roles/apache/defaults/main.yml | 2 + .../roles/apache/handlers/main.yml | 4 + .../000_example/roles/apache/meta/main.yml | 57 +++++ .../000_example/roles/apache/tasks/main.yml | 19 ++ .../roles/apache/templates/httpd.conf.j2 | 225 +++++++++++++++++ .../roles/apache/templates/index.html.j2 | 6 + .../000_example/roles/apache/tests/inventory | 2 + .../000_example/roles/apache/tests/test.yml | 5 + .../000_example/roles/apache/vars/main.yml | 2 + examples/000_example/roles/common/README.md | 38 +++ .../roles/common/defaults/main.yml | 2 + .../roles/common/handlers/main.yml | 4 + .../000_example/roles/common/meta/main.yml | 57 +++++ .../000_example/roles/common/tasks/main.yml | 9 + .../000_example/roles/common/tasks/ntp.yml | 15 ++ .../roles/common/tasks/selinux.yml | 13 + .../roles/common/templates/ntp.conf.j2 | 7 + .../000_example/roles/common/tests/inventory | 2 + .../000_example/roles/common/tests/test.yml | 5 + .../000_example/roles/common/vars/main.yml | 2 + examples/000_example/site.yml | 7 + examples/000_initial_example/001-hostname.yml | 4 + examples/000_initial_example/hosts | 19 ++ .../000_initial_examples/etc_ansible_hosts | 12 + examples/000_initial_examples/hostname.yml | 5 + .../your-first-hosts-file | 12 + examples/001_apt/database.yml | 5 + examples/001_apt/hostname.yml | 5 + examples/001_apt/hosts | 5 + examples/001_apt/loadbalancer.yml | 5 + examples/002_become/database.yml | 6 + examples/002_become/hostname.yml | 5 + examples/002_become/hosts | 8 + examples/002_become/loadbalancer.yml | 6 + examples/003_with_items/database.yml | 6 + examples/003_with_items/hostname.yml | 5 + examples/003_with_items/loadbalancer.yml | 6 + examples/003_with_items/webserver.yml | 12 + examples/004_services/control.yml | 8 + examples/004_services/database.yml | 9 + examples/004_services/loadbalancer.yml | 9 + examples/004_services/playbooks/hostname.yml | 5 + .../004_services/playbooks/stack_restart.yml | 18 ++ .../playbooks/stack_restart.yml.save | 17 ++ .../004_services/playbooks/stack_stopped.yml | 18 ++ examples/004_services/webserver.yml | 14 ++ examples/005_stack_restart/control.yml | 8 + examples/005_stack_restart/database.yml | 9 + examples/005_stack_restart/loadbalancer.yml | 9 + .../005_stack_restart/playbook/hostname.yml | 5 + .../playbook/stack_restart.yml | 28 +++ examples/005_stack_restart/webserver.yml | 14 ++ examples/006_notify_handlers/control.yml | 8 + examples/006_notify_handlers/database.yml | 9 + examples/006_notify_handlers/demo/app/demo.py | 20 ++ .../006_notify_handlers/demo/app/demo.wsgi | 10 + .../demo/app/requirements.txt | 9 + examples/006_notify_handlers/demo/demo.conf | 11 + examples/006_notify_handlers/loadbalancer.yml | 9 + .../006_notify_handlers/playbook/hostname.yml | 5 + .../playbook/stack_restart.yml | 28 +++ examples/006_notify_handlers/webserver.yml | 22 ++ examples/007_files_copy/control.yml | 8 + examples/007_files_copy/database.yml | 9 + examples/007_files_copy/demo/app/demo.py | 20 ++ examples/007_files_copy/demo/app/demo.wsgi | 10 + .../007_files_copy/demo/app/requirements.txt | 9 + examples/007_files_copy/demo/demo.conf | 11 + examples/007_files_copy/loadbalancer.yml | 9 + examples/007_files_copy/playbook/hostname.yml | 5 + .../007_files_copy/playbook/stack_restart.yml | 28 +++ examples/007_files_copy/webserver.yml | 30 +++ examples/008_pip/control.yml | 8 + examples/008_pip/database.yml | 9 + examples/008_pip/demo/app/demo.py | 20 ++ examples/008_pip/demo/app/demo.wsgi | 10 + examples/008_pip/demo/app/requirements.txt | 9 + examples/008_pip/demo/demo.conf | 11 + examples/008_pip/loadbalancer.yml | 9 + examples/008_pip/playbook/hostname.yml | 5 + examples/008_pip/playbook/stack_restart.yml | 28 +++ examples/008_pip/webserver.yml | 34 +++ examples/009_files/control.yml | 8 + examples/009_files/database.yml | 9 + examples/009_files/demo/app/demo.py | 20 ++ examples/009_files/demo/app/demo.wsgi | 10 + examples/009_files/demo/app/requirements.txt | 9 + examples/009_files/demo/demo.conf | 11 + examples/009_files/loadbalancer.yml | 9 + examples/009_files/playbook/hostname.yml | 5 + examples/009_files/playbook/stack_restart.yml | 28 +++ examples/009_files/webserver.yml | 42 ++++ examples/010_templates/control.yml | 8 + examples/010_templates/database.yml | 9 + examples/010_templates/demo/app/demo.py | 20 ++ examples/010_templates/demo/app/demo.wsgi | 10 + .../010_templates/demo/app/requirements.txt | 9 + examples/010_templates/demo/demo.conf | 11 + examples/010_templates/loadbalancer.yml | 25 ++ examples/010_templates/playbook/hostname.yml | 5 + .../playbook/loadbalancer-default-nginx.yml | 18 ++ .../010_templates/playbook/nginx-default.conf | 137 +++++++++++ .../010_templates/playbook/nginx-default.html | 36 +++ .../010_templates/playbook/stack_restart.yml | 28 +++ .../010_templates/templates/nginx.conf.j2 | 13 + examples/010_templates/webserver.yml | 42 ++++ examples/011_lineinfile/control.yml | 8 + examples/011_lineinfile/database.yml | 15 ++ examples/011_lineinfile/demo/app/demo.py | 20 ++ examples/011_lineinfile/demo/app/demo.wsgi | 10 + .../011_lineinfile/demo/app/requirements.txt | 9 + examples/011_lineinfile/demo/demo.conf | 11 + examples/011_lineinfile/loadbalancer.yml | 25 ++ examples/011_lineinfile/playbook/hostname.yml | 5 + .../011_lineinfile/playbook/stack_restart.yml | 28 +++ .../011_lineinfile/templates/nginx.conf.j2 | 13 + examples/011_lineinfile/webserver.yml | 42 ++++ .../.clean-database.yml.swp | Bin 0 -> 1024 bytes examples/012_mysql_management/control.yml | 8 + examples/012_mysql_management/database.yml | 21 ++ .../012_mysql_management/demo/app/demo.py | 20 ++ .../012_mysql_management/demo/app/demo.wsgi | 10 + .../demo/app/requirements.txt | 9 + examples/012_mysql_management/demo/demo.conf | 11 + .../012_mysql_management/loadbalancer.yml | 25 ++ .../playbook/clean-database.yml | 9 + .../playbook/hostname.yml | 5 + .../playbook/stack_restart.yml | 28 +++ .../templates/nginx.conf.j2 | 13 + examples/012_mysql_management/webserver.yml | 42 ++++ examples/013_wait_for/control.yml | 8 + examples/013_wait_for/database.yml | 28 +++ examples/013_wait_for/demo/app/demo.py | 20 ++ examples/013_wait_for/demo/app/demo.wsgi | 10 + .../013_wait_for/demo/app/requirements.txt | 9 + examples/013_wait_for/demo/demo.conf | 11 + examples/013_wait_for/loadbalancer.yml | 25 ++ examples/013_wait_for/playbook/hostname.yml | 5 + .../013_wait_for/playbook/stack_restart.yml | 33 +++ .../013_wait_for/playbook/stack_status.yml | 27 +++ examples/013_wait_for/templates/nginx.conf.j2 | 13 + examples/013_wait_for/webserver.yml | 43 ++++ examples/014_stack_status/control.yml | 9 + examples/014_stack_status/database.yml | 28 +++ examples/014_stack_status/demo/app/demo.py | 20 ++ examples/014_stack_status/demo/app/demo.wsgi | 10 + .../demo/app/requirements.txt | 9 + examples/014_stack_status/demo/demo.conf | 11 + examples/014_stack_status/loadbalancer.yml | 30 +++ .../014_stack_status/playbooks/hostname.yml | 5 + .../playbooks/stack_restart.yml | 33 +++ .../playbooks/stack_status.yml | 67 +++++ .../014_stack_status/templates/nginx.conf.j2 | 13 + examples/014_stack_status/webserver.yml | 43 ++++ examples/015_roles/playbooks/hostname.yml | 5 + .../015_roles/playbooks/stack_restart.yml | 33 +++ examples/015_roles/roles/apache2/.travis.yml | 29 +++ examples/015_roles/roles/apache2/README.md | 38 +++ .../015_roles/roles/apache2/defaults/main.yml | 2 + .../015_roles/roles/apache2/handlers/main.yml | 4 + .../015_roles/roles/apache2/meta/main.yml | 52 ++++ .../015_roles/roles/apache2/tasks/main.yml | 21 ++ .../015_roles/roles/apache2/tests/inventory | 2 + .../015_roles/roles/apache2/tests/test.yml | 5 + .../015_roles/roles/apache2/vars/main.yml | 2 + examples/015_roles/roles/control/.travis.yml | 29 +++ examples/015_roles/roles/control/README.md | 38 +++ .../015_roles/roles/control/defaults/main.yml | 2 + .../015_roles/roles/control/handlers/main.yml | 2 + .../015_roles/roles/control/meta/main.yml | 52 ++++ .../015_roles/roles/control/tasks/main.yml | 7 + .../015_roles/roles/control/tests/inventory | 2 + .../015_roles/roles/control/tests/test.yml | 5 + .../015_roles/roles/control/vars/main.yml | 2 + examples/015_roles/roles/demo_app/.travis.yml | 29 +++ examples/015_roles/roles/demo_app/README.md | 38 +++ .../roles/demo_app/defaults/main.yml | 2 + .../roles/demo_app/files/demo/app/demo.py | 20 ++ .../roles/demo_app/files/demo/app/demo.wsgi | 10 + .../demo_app/files/demo/app/requirements.txt | 9 + .../roles/demo_app/files/demo/demo.conf | 11 + .../roles/demo_app/handlers/main.yml | 4 + .../015_roles/roles/demo_app/meta/main.yml | 52 ++++ .../015_roles/roles/demo_app/tasks/main.yml | 24 ++ .../015_roles/roles/demo_app/tests/inventory | 2 + .../015_roles/roles/demo_app/tests/test.yml | 5 + .../015_roles/roles/demo_app/vars/main.yml | 2 + examples/015_roles/roles/mysql/.travis.yml | 29 +++ examples/015_roles/roles/mysql/README.md | 38 +++ .../015_roles/roles/mysql/defaults/main.yml | 2 + .../015_roles/roles/mysql/handlers/main.yml | 4 + examples/015_roles/roles/mysql/meta/main.yml | 52 ++++ examples/015_roles/roles/mysql/tasks/main.yml | 25 ++ .../015_roles/roles/mysql/tests/inventory | 2 + examples/015_roles/roles/mysql/tests/test.yml | 5 + examples/015_roles/roles/mysql/vars/main.yml | 2 + examples/015_roles/roles/nginx/.travis.yml | 29 +++ examples/015_roles/roles/nginx/README.md | 38 +++ .../015_roles/roles/nginx/defaults/main.yml | 2 + .../015_roles/roles/nginx/handlers/main.yml | 4 + examples/015_roles/roles/nginx/meta/main.yml | 52 ++++ examples/015_roles/roles/nginx/tasks/main.yml | 24 ++ .../roles/nginx/templates/nginx.conf.j2 | 13 + .../015_roles/roles/nginx/tests/inventory | 2 + examples/015_roles/roles/nginx/tests/test.yml | 5 + examples/015_roles/roles/nginx/vars/main.yml | 2 + examples/015_roles/roles/status/.travis.yml | 29 +++ examples/015_roles/roles/status/README.md | 38 +++ .../015_roles/roles/status/defaults/main.yml | 2 + .../015_roles/roles/status/handlers/main.yml | 2 + examples/015_roles/roles/status/meta/main.yml | 52 ++++ .../015_roles/roles/status/tests/inventory | 2 + .../015_roles/roles/status/tests/test.yml | 5 + examples/015_roles/roles/status/vars/main.yml | 2 + examples/015_roles/site.yml | 88 +++++++ examples/015_roles/stack_status.yml | 67 +++++ examples/015_roles/templates/nginx.conf.j2 | 13 + examples/016_tasks_handlers/control.yml | 5 + examples/016_tasks_handlers/database.yml | 5 + examples/016_tasks_handlers/demo/app/demo.py | 20 ++ .../016_tasks_handlers/demo/app/demo.wsgi | 10 + .../demo/app/requirements.txt | 9 + examples/016_tasks_handlers/demo/demo.conf | 11 + examples/016_tasks_handlers/loadbalancer.yml | 30 +++ .../016_tasks_handlers/playbooks/hostname.yml | 5 + .../playbooks/stack_restart.yml | 33 +++ .../playbooks/stack_status.yml | 67 +++++ .../roles/apache2/README.md | 38 +++ .../roles/apache2/defaults/main.yml | 2 + .../roles/apache2/handlers/main.yml | 2 + .../roles/apache2/meta/main.yml | 139 +++++++++++ .../roles/apache2/tasks/main.yml | 2 + .../roles/apache2/vars/main.yml | 2 + .../roles/control/README.md | 38 +++ .../roles/control/defaults/main.yml | 2 + .../roles/control/handlers/main.yml | 2 + .../roles/control/meta/main.yml | 139 +++++++++++ .../roles/control/tasks/main.yml | 6 + .../roles/control/vars/main.yml | 2 + .../roles/demo_app/README.md | 38 +++ .../roles/demo_app/defaults/main.yml | 2 + .../roles/demo_app/handlers/main.yml | 2 + .../roles/demo_app/meta/main.yml | 139 +++++++++++ .../roles/demo_app/tasks/main.yml | 2 + .../roles/demo_app/vars/main.yml | 2 + .../016_tasks_handlers/roles/mysql/README.md | 38 +++ .../roles/mysql/defaults/main.yml | 2 + .../roles/mysql/handlers/main.yml | 3 + .../roles/mysql/meta/main.yml | 139 +++++++++++ .../roles/mysql/tasks/main.yml | 21 ++ .../roles/mysql/vars/main.yml | 2 + .../016_tasks_handlers/roles/nginx/README.md | 38 +++ .../roles/nginx/defaults/main.yml | 2 + .../roles/nginx/handlers/main.yml | 2 + .../roles/nginx/meta/main.yml | 139 +++++++++++ .../roles/nginx/tasks/main.yml | 2 + .../roles/nginx/vars/main.yml | 2 + .../templates/nginx.conf.j2 | 13 + examples/016_tasks_handlers/webserver.yml | 43 ++++ examples/017_files_templates/control.yml | 5 + examples/017_files_templates/database.yml | 5 + examples/017_files_templates/demo/app/demo.py | 20 ++ .../017_files_templates/demo/app/demo.wsgi | 10 + .../demo/app/requirements.txt | 9 + examples/017_files_templates/demo/demo.conf | 11 + examples/017_files_templates/loadbalancer.yml | 5 + .../playbooks/hostname.yml | 5 + .../playbooks/stack_restart.yml | 33 +++ .../playbooks/stack_status.yml | 67 +++++ .../roles/apache2/README.md | 38 +++ .../roles/apache2/defaults/main.yml | 2 + .../roles/apache2/handlers/main.yml | 3 + .../roles/apache2/meta/main.yml | 139 +++++++++++ .../roles/apache2/tasks/main.yml | 17 ++ .../roles/apache2/vars/main.yml | 2 + .../roles/control/README.md | 38 +++ .../roles/control/defaults/main.yml | 2 + .../roles/control/handlers/main.yml | 2 + .../roles/control/meta/main.yml | 139 +++++++++++ .../roles/control/tasks/main.yml | 6 + .../roles/control/vars/main.yml | 2 + .../roles/demo_app/README.md | 38 +++ .../roles/demo_app/defaults/main.yml | 2 + .../roles/demo_app/files/demo/app/demo.py | 23 ++ .../roles/demo_app/files/demo/app/demo.wsgi | 10 + .../demo_app/files/demo/app/requirements.txt | 2 + .../roles/demo_app/files/demo/demo.conf | 11 + .../roles/demo_app/handlers/main.yml | 3 + .../roles/demo_app/meta/main.yml | 139 +++++++++++ .../roles/demo_app/tasks/main.yml | 23 ++ .../roles/demo_app/vars/main.yml | 2 + .../017_files_templates/roles/mysql/README.md | 38 +++ .../roles/mysql/defaults/main.yml | 2 + .../roles/mysql/handlers/main.yml | 3 + .../roles/mysql/meta/main.yml | 139 +++++++++++ .../roles/mysql/tasks/main.yml | 21 ++ .../roles/mysql/vars/main.yml | 2 + .../017_files_templates/roles/nginx/README.md | 38 +++ .../roles/nginx/defaults/main.yml | 2 + .../roles/nginx/handlers/main.yml | 3 + .../roles/nginx/meta/main.yml | 139 +++++++++++ .../roles/nginx/tasks/main.yml | 23 ++ .../roles/nginx/templates/nginx.conf.j2 | 13 + .../roles/nginx/vars/main.yml | 2 + examples/017_files_templates/webserver.yml | 6 + examples/018_site_yml/control.yml | 5 + examples/018_site_yml/database.yml | 5 + examples/018_site_yml/demo/app/demo.py | 20 ++ examples/018_site_yml/demo/app/demo.wsgi | 10 + .../018_site_yml/demo/app/requirements.txt | 9 + examples/018_site_yml/demo/demo.conf | 11 + examples/018_site_yml/loadbalancer.yml | 28 +++ examples/018_site_yml/playbooks/hostname.yml | 5 + .../018_site_yml/playbooks/stack_restart.yml | 33 +++ .../018_site_yml/playbooks/stack_status.yml | 67 +++++ examples/018_site_yml/roles/apache2/README.md | 38 +++ .../roles/apache2/defaults/main.yml | 2 + .../roles/apache2/handlers/main.yml | 3 + .../018_site_yml/roles/apache2/meta/main.yml | 139 +++++++++++ .../018_site_yml/roles/apache2/tasks/main.yml | 17 ++ .../018_site_yml/roles/apache2/vars/main.yml | 2 + examples/018_site_yml/roles/control/README.md | 38 +++ .../roles/control/defaults/main.yml | 2 + .../roles/control/handlers/main.yml | 2 + .../018_site_yml/roles/control/meta/main.yml | 139 +++++++++++ .../018_site_yml/roles/control/tasks/main.yml | 6 + .../018_site_yml/roles/control/vars/main.yml | 2 + .../018_site_yml/roles/demo_app/README.md | 38 +++ .../roles/demo_app/defaults/main.yml | 2 + .../roles/demo_app/files/demo/app/demo.py | 23 ++ .../roles/demo_app/files/demo/app/demo.wsgi | 10 + .../demo_app/files/demo/app/requirements.txt | 2 + .../roles/demo_app/files/demo/demo.conf | 11 + .../roles/demo_app/handlers/main.yml | 3 + .../018_site_yml/roles/demo_app/meta/main.yml | 139 +++++++++++ .../roles/demo_app/tasks/main.yml | 23 ++ .../018_site_yml/roles/demo_app/vars/main.yml | 2 + examples/018_site_yml/roles/mysql/README.md | 38 +++ .../roles/mysql/defaults/main.yml | 2 + .../roles/mysql/handlers/main.yml | 3 + .../018_site_yml/roles/mysql/meta/main.yml | 139 +++++++++++ .../018_site_yml/roles/mysql/tasks/main.yml | 21 ++ .../018_site_yml/roles/mysql/vars/main.yml | 2 + examples/018_site_yml/roles/nginx/README.md | 38 +++ .../roles/nginx/defaults/main.yml | 2 + .../roles/nginx/handlers/main.yml | 3 + .../018_site_yml/roles/nginx/meta/main.yml | 139 +++++++++++ .../018_site_yml/roles/nginx/tasks/main.yml | 23 ++ .../roles/nginx/templates/nginx.conf.j2 | 13 + .../018_site_yml/roles/nginx/vars/main.yml | 2 + examples/018_site_yml/site.yml | 5 + examples/018_site_yml/webserver.yml | 6 + examples/019_facts/control.yml | 5 + examples/019_facts/database.yml | 5 + examples/019_facts/demo/app/demo.py | 20 ++ examples/019_facts/demo/app/demo.wsgi | 10 + examples/019_facts/demo/app/requirements.txt | 9 + examples/019_facts/demo/demo.conf | 11 + examples/019_facts/loadbalancer.yml | 5 + examples/019_facts/playbooks/hostname.yml | 5 + .../019_facts/playbooks/stack_restart.yml | 33 +++ examples/019_facts/playbooks/stack_status.yml | 67 +++++ examples/019_facts/roles/apache2/README.md | 38 +++ .../019_facts/roles/apache2/defaults/main.yml | 2 + .../019_facts/roles/apache2/handlers/main.yml | 3 + .../019_facts/roles/apache2/meta/main.yml | 139 +++++++++++ .../019_facts/roles/apache2/tasks/main.yml | 17 ++ .../019_facts/roles/apache2/vars/main.yml | 2 + examples/019_facts/roles/control/README.md | 38 +++ .../019_facts/roles/control/defaults/main.yml | 2 + .../019_facts/roles/control/handlers/main.yml | 2 + .../019_facts/roles/control/meta/main.yml | 139 +++++++++++ .../019_facts/roles/control/tasks/main.yml | 6 + .../019_facts/roles/control/vars/main.yml | 2 + examples/019_facts/roles/demo_app/README.md | 38 +++ .../roles/demo_app/defaults/main.yml | 2 + .../roles/demo_app/files/demo/app/demo.py | 23 ++ .../roles/demo_app/files/demo/app/demo.wsgi | 10 + .../demo_app/files/demo/app/requirements.txt | 2 + .../roles/demo_app/files/demo/demo.conf | 11 + .../roles/demo_app/handlers/main.yml | 3 + .../019_facts/roles/demo_app/meta/main.yml | 139 +++++++++++ .../019_facts/roles/demo_app/tasks/main.yml | 23 ++ .../019_facts/roles/demo_app/vars/main.yml | 2 + examples/019_facts/roles/mysql/README.md | 38 +++ .../019_facts/roles/mysql/defaults/main.yml | 2 + .../019_facts/roles/mysql/handlers/main.yml | 3 + examples/019_facts/roles/mysql/meta/main.yml | 139 +++++++++++ examples/019_facts/roles/mysql/tasks/main.yml | 26 ++ examples/019_facts/roles/mysql/vars/main.yml | 2 + examples/019_facts/roles/nginx/README.md | 38 +++ .../019_facts/roles/nginx/defaults/main.yml | 2 + .../019_facts/roles/nginx/handlers/main.yml | 3 + examples/019_facts/roles/nginx/meta/main.yml | 139 +++++++++++ examples/019_facts/roles/nginx/tasks/main.yml | 23 ++ .../roles/nginx/templates/nginx.conf.j2 | 13 + examples/019_facts/roles/nginx/vars/main.yml | 2 + examples/019_facts/site.yml | 6 + examples/019_facts/webserver.yml | 6 + examples/020_defaults/control.yml | 5 + examples/020_defaults/database.yml | 5 + examples/020_defaults/demo/app/demo.py | 20 ++ examples/020_defaults/demo/app/demo.wsgi | 10 + .../020_defaults/demo/app/requirements.txt | 9 + examples/020_defaults/demo/demo.conf | 11 + examples/020_defaults/loadbalancer.yml | 5 + examples/020_defaults/playbooks/hostname.yml | 5 + .../020_defaults/playbooks/stack_restart.yml | 33 +++ .../020_defaults/playbooks/stack_status.yml | 67 +++++ examples/020_defaults/roles/apache2/README.md | 38 +++ .../roles/apache2/defaults/main.yml | 2 + .../roles/apache2/handlers/main.yml | 3 + .../020_defaults/roles/apache2/meta/main.yml | 139 +++++++++++ .../020_defaults/roles/apache2/tasks/main.yml | 17 ++ .../020_defaults/roles/apache2/vars/main.yml | 2 + examples/020_defaults/roles/control/README.md | 38 +++ .../roles/control/defaults/main.yml | 2 + .../roles/control/handlers/main.yml | 2 + .../020_defaults/roles/control/meta/main.yml | 139 +++++++++++ .../020_defaults/roles/control/tasks/main.yml | 6 + .../020_defaults/roles/control/vars/main.yml | 2 + .../020_defaults/roles/demo_app/README.md | 38 +++ .../roles/demo_app/defaults/main.yml | 2 + .../roles/demo_app/files/demo/app/demo.py | 23 ++ .../roles/demo_app/files/demo/app/demo.wsgi | 12 + .../demo_app/files/demo/app/requirements.txt | 2 + .../roles/demo_app/files/demo/demo.conf | 11 + .../roles/demo_app/handlers/main.yml | 3 + .../020_defaults/roles/demo_app/meta/main.yml | 139 +++++++++++ .../roles/demo_app/tasks/main.yml | 23 ++ .../020_defaults/roles/demo_app/vars/main.yml | 2 + examples/020_defaults/roles/mysql/README.md | 38 +++ .../roles/mysql/defaults/main.yml | 6 + .../roles/mysql/handlers/main.yml | 3 + .../020_defaults/roles/mysql/meta/main.yml | 139 +++++++++++ .../020_defaults/roles/mysql/tasks/main.yml | 23 ++ .../020_defaults/roles/mysql/vars/main.yml | 2 + examples/020_defaults/roles/nginx/README.md | 38 +++ .../roles/nginx/defaults/main.yml | 2 + .../roles/nginx/handlers/main.yml | 3 + .../020_defaults/roles/nginx/meta/main.yml | 139 +++++++++++ .../020_defaults/roles/nginx/tasks/main.yml | 23 ++ .../roles/nginx/templates/nginx.conf.j2 | 13 + .../020_defaults/roles/nginx/vars/main.yml | 2 + examples/020_defaults/site.yml | 6 + examples/020_defaults/webserver.yml | 6 + examples/021_vars/control.yml | 5 + examples/021_vars/database.yml | 6 + examples/021_vars/demo/app/demo.py | 20 ++ examples/021_vars/demo/app/demo.wsgi | 10 + examples/021_vars/demo/app/requirements.txt | 9 + examples/021_vars/demo/demo.conf | 11 + examples/021_vars/loadbalancer.yml | 5 + examples/021_vars/playbooks/hostname.yml | 5 + examples/021_vars/playbooks/stack_restart.yml | 33 +++ examples/021_vars/playbooks/stack_status.yml | 67 +++++ examples/021_vars/roles/apache2/README.md | 38 +++ .../021_vars/roles/apache2/defaults/main.yml | 2 + .../021_vars/roles/apache2/handlers/main.yml | 3 + examples/021_vars/roles/apache2/meta/main.yml | 139 +++++++++++ .../021_vars/roles/apache2/tasks/main.yml | 17 ++ examples/021_vars/roles/apache2/vars/main.yml | 2 + examples/021_vars/roles/control/README.md | 38 +++ .../021_vars/roles/control/defaults/main.yml | 2 + .../021_vars/roles/control/handlers/main.yml | 2 + examples/021_vars/roles/control/meta/main.yml | 139 +++++++++++ .../021_vars/roles/control/tasks/main.yml | 6 + examples/021_vars/roles/control/vars/main.yml | 2 + examples/021_vars/roles/demo_app/README.md | 38 +++ .../021_vars/roles/demo_app/defaults/main.yml | 2 + .../roles/demo_app/files/demo/app/demo.py | 23 ++ .../roles/demo_app/files/demo/app/demo.wsgi | 11 + .../demo_app/files/demo/app/requirements.txt | 2 + .../roles/demo_app/files/demo/demo.conf | 11 + .../021_vars/roles/demo_app/handlers/main.yml | 3 + .../021_vars/roles/demo_app/meta/main.yml | 139 +++++++++++ .../021_vars/roles/demo_app/tasks/main.yml | 23 ++ .../021_vars/roles/demo_app/vars/main.yml | 2 + examples/021_vars/roles/mysql/README.md | 38 +++ .../021_vars/roles/mysql/defaults/main.yml | 6 + .../021_vars/roles/mysql/handlers/main.yml | 3 + examples/021_vars/roles/mysql/meta/main.yml | 139 +++++++++++ examples/021_vars/roles/mysql/tasks/main.yml | 27 +++ examples/021_vars/roles/mysql/vars/main.yml | 2 + examples/021_vars/roles/nginx/README.md | 38 +++ .../021_vars/roles/nginx/defaults/main.yml | 6 + .../021_vars/roles/nginx/handlers/main.yml | 3 + examples/021_vars/roles/nginx/meta/main.yml | 139 +++++++++++ examples/021_vars/roles/nginx/tasks/main.yml | 30 +++ .../roles/nginx/templates/nginx.conf.j2 | 13 + examples/021_vars/roles/nginx/vars/main.yml | 2 + examples/021_vars/site.yml | 6 + examples/021_vars/webserver.yml | 6 + examples/022_with_dict/control.yml | 5 + examples/022_with_dict/database.yml | 5 + examples/022_with_dict/demo/app/demo.py | 20 ++ examples/022_with_dict/demo/app/demo.wsgi | 10 + .../022_with_dict/demo/app/requirements.txt | 9 + examples/022_with_dict/demo/demo.conf | 11 + examples/022_with_dict/loadbalancer.yml | 5 + examples/022_with_dict/playbooks/hostname.yml | 5 + .../022_with_dict/playbooks/stack_restart.yml | 33 +++ .../022_with_dict/playbooks/stack_status.yml | 67 +++++ .../022_with_dict/roles/apache2/README.md | 38 +++ .../roles/apache2/defaults/main.yml | 2 + .../roles/apache2/handlers/main.yml | 3 + .../022_with_dict/roles/apache2/meta/main.yml | 139 +++++++++++ .../roles/apache2/tasks/main.yml | 17 ++ .../022_with_dict/roles/apache2/vars/main.yml | 2 + .../022_with_dict/roles/control/README.md | 38 +++ .../roles/control/defaults/main.yml | 2 + .../roles/control/handlers/main.yml | 2 + .../022_with_dict/roles/control/meta/main.yml | 139 +++++++++++ .../roles/control/tasks/main.yml | 6 + .../022_with_dict/roles/control/vars/main.yml | 2 + .../022_with_dict/roles/demo_app/README.md | 38 +++ .../roles/demo_app/defaults/main.yml | 2 + .../roles/demo_app/files/demo/app/demo.py | 23 ++ .../roles/demo_app/files/demo/app/demo.wsgi | 10 + .../demo_app/files/demo/app/requirements.txt | 2 + .../roles/demo_app/files/demo/demo.conf | 11 + .../roles/demo_app/handlers/main.yml | 3 + .../roles/demo_app/meta/main.yml | 139 +++++++++++ .../roles/demo_app/tasks/main.yml | 23 ++ .../roles/demo_app/vars/main.yml | 2 + examples/022_with_dict/roles/mysql/README.md | 38 +++ .../roles/mysql/defaults/main.yml | 5 + .../roles/mysql/handlers/main.yml | 3 + .../022_with_dict/roles/mysql/meta/main.yml | 139 +++++++++++ .../022_with_dict/roles/mysql/tasks/main.yml | 23 ++ .../022_with_dict/roles/mysql/vars/main.yml | 2 + examples/022_with_dict/roles/nginx/README.md | 38 +++ .../roles/nginx/defaults/main.yml | 5 + .../roles/nginx/handlers/main.yml | 3 + .../022_with_dict/roles/nginx/meta/main.yml | 139 +++++++++++ .../022_with_dict/roles/nginx/tasks/main.yml | 25 ++ .../roles/nginx/templates/nginx.conf.j2 | 13 + .../022_with_dict/roles/nginx/vars/main.yml | 2 + examples/022_with_dict/site.yml | 5 + examples/022_with_dict/webserver.yml | 6 + examples/023_selective_removal/control.yml | 5 + examples/023_selective_removal/database.yml | 5 + .../023_selective_removal/demo/app/demo.py | 20 ++ .../023_selective_removal/demo/app/demo.wsgi | 10 + .../demo/app/requirements.txt | 9 + examples/023_selective_removal/demo/demo.conf | 11 + .../023_selective_removal/loadbalancer.yml | 5 + .../playbooks/hostname.yml | 5 + .../playbooks/stack_restart.yml | 33 +++ .../playbooks/stack_status.yml | 67 +++++ .../roles/apache2/README.md | 38 +++ .../roles/apache2/defaults/main.yml | 2 + .../roles/apache2/handlers/main.yml | 3 + .../roles/apache2/meta/main.yml | 139 +++++++++++ .../roles/apache2/tasks/main.yml | 17 ++ .../roles/apache2/vars/main.yml | 2 + .../roles/control/README.md | 38 +++ .../roles/control/defaults/main.yml | 2 + .../roles/control/handlers/main.yml | 2 + .../roles/control/meta/main.yml | 139 +++++++++++ .../roles/control/tasks/main.yml | 6 + .../roles/control/vars/main.yml | 2 + .../roles/demo_app/README.md | 38 +++ .../roles/demo_app/defaults/main.yml | 2 + .../roles/demo_app/files/demo/app/demo.py | 23 ++ .../roles/demo_app/files/demo/app/demo.wsgi | 11 + .../demo_app/files/demo/app/requirements.txt | 2 + .../roles/demo_app/files/demo/demo.conf | 11 + .../roles/demo_app/handlers/main.yml | 3 + .../roles/demo_app/meta/main.yml | 139 +++++++++++ .../roles/demo_app/tasks/main.yml | 23 ++ .../roles/demo_app/vars/main.yml | 2 + .../roles/mysql/README.md | 38 +++ .../roles/mysql/defaults/main.yml | 5 + .../roles/mysql/handlers/main.yml | 3 + .../roles/mysql/meta/main.yml | 139 +++++++++++ .../roles/mysql/tasks/main.yml | 23 ++ .../roles/mysql/vars/main.yml | 2 + .../roles/nginx/README.md | 38 +++ .../roles/nginx/defaults/main.yml | 5 + .../roles/nginx/handlers/main.yml | 3 + .../roles/nginx/meta/main.yml | 139 +++++++++++ .../roles/nginx/tasks/main.yml | 31 +++ .../roles/nginx/templates/nginx.conf.j2 | 13 + .../roles/nginx/vars/main.yml | 2 + examples/023_selective_removal/site.yml | 6 + examples/023_selective_removal/webserver.yml | 6 + examples/024_continued/control.yml | 5 + examples/024_continued/database.yml | 5 + examples/024_continued/demo/app/demo.py | 20 ++ examples/024_continued/demo/app/demo.wsgi | 10 + .../024_continued/demo/app/requirements.txt | 9 + examples/024_continued/demo/demo.conf | 11 + examples/024_continued/loadbalancer.yml | 5 + examples/024_continued/playbooks/hostname.yml | 5 + .../024_continued/playbooks/stack_restart.yml | 33 +++ .../024_continued/playbooks/stack_status.yml | 67 +++++ .../024_continued/roles/apache2/README.md | 38 +++ .../roles/apache2/defaults/main.yml | 2 + .../roles/apache2/handlers/main.yml | 3 + .../024_continued/roles/apache2/meta/main.yml | 139 +++++++++++ .../roles/apache2/tasks/main.yml | 17 ++ .../024_continued/roles/apache2/vars/main.yml | 2 + .../024_continued/roles/control/README.md | 38 +++ .../roles/control/defaults/main.yml | 2 + .../roles/control/handlers/main.yml | 2 + .../024_continued/roles/control/meta/main.yml | 139 +++++++++++ .../roles/control/tasks/main.yml | 6 + .../024_continued/roles/control/vars/main.yml | 2 + .../024_continued/roles/demo_app/README.md | 38 +++ .../roles/demo_app/defaults/main.yml | 2 + .../roles/demo_app/files/demo/app/demo.py | 23 ++ .../demo_app/files/demo/app/requirements.txt | 2 + .../roles/demo_app/files/demo/demo.conf | 11 + .../roles/demo_app/handlers/main.yml | 3 + .../roles/demo_app/meta/main.yml | 139 +++++++++++ .../roles/demo_app/tasks/main.yml | 27 +++ .../roles/demo_app/templates/demo.wsgi.j2 | 10 + .../roles/demo_app/vars/main.yml | 2 + examples/024_continued/roles/mysql/README.md | 38 +++ .../roles/mysql/defaults/main.yml | 5 + .../roles/mysql/handlers/main.yml | 3 + .../024_continued/roles/mysql/meta/main.yml | 139 +++++++++++ .../024_continued/roles/mysql/tasks/main.yml | 24 ++ .../024_continued/roles/mysql/vars/main.yml | 2 + examples/024_continued/roles/nginx/README.md | 38 +++ .../roles/nginx/defaults/main.yml | 5 + .../roles/nginx/handlers/main.yml | 3 + .../024_continued/roles/nginx/meta/main.yml | 139 +++++++++++ .../024_continued/roles/nginx/tasks/main.yml | 31 +++ .../roles/nginx/templates/nginx.conf.j2 | 13 + .../024_continued/roles/nginx/vars/main.yml | 2 + examples/024_continued/site.yml | 6 + examples/024_continued/webserver.yml | 6 + .../025_vars_files_group_vars/control.yml | 5 + .../025_vars_files_group_vars/database.yml | 8 + .../025_vars_files_group_vars/group_vars/all | 12 + .../loadbalancer.yml | 5 + .../playbooks/hostname.yml | 5 + .../playbooks/stack_restart.yml | 33 +++ .../playbooks/stack_status.yml | 67 +++++ .../roles/apache2/README.md | 38 +++ .../roles/apache2/defaults/main.yml | 2 + .../roles/apache2/handlers/main.yml | 3 + .../roles/apache2/meta/main.yml | 139 +++++++++++ .../roles/apache2/tasks/main.yml | 17 ++ .../roles/apache2/vars/main.yml | 2 + .../roles/control/README.md | 38 +++ .../roles/control/defaults/main.yml | 2 + .../roles/control/handlers/main.yml | 2 + .../roles/control/meta/main.yml | 139 +++++++++++ .../roles/control/tasks/main.yml | 6 + .../roles/control/vars/main.yml | 2 + .../roles/demo_app/README.md | 38 +++ .../roles/demo_app/defaults/main.yml | 2 + .../roles/demo_app/files/demo/app/demo.py | 20 ++ .../roles/demo_app/files/demo/app/demo.wsgi | 10 + .../demo_app/files/demo/app/requirements.txt | 9 + .../roles/demo_app/files/demo/demo.conf | 11 + .../roles/demo_app/handlers/main.yml | 3 + .../roles/demo_app/meta/main.yml | 139 +++++++++++ .../roles/demo_app/tasks/main.yml | 27 +++ .../roles/demo_app/templates/demo.wsgi.j2 | 10 + .../roles/demo_app/vars/main.yml | 2 + .../roles/mysql/README.md | 38 +++ .../roles/mysql/defaults/main.yml | 5 + .../roles/mysql/handlers/main.yml | 3 + .../roles/mysql/meta/main.yml | 139 +++++++++++ .../roles/mysql/tasks/main.yml | 27 +++ .../roles/mysql/vars/main.yml | 2 + .../roles/nginx/README.md | 38 +++ .../roles/nginx/defaults/main.yml | 5 + .../roles/nginx/handlers/main.yml | 3 + .../roles/nginx/meta/main.yml | 139 +++++++++++ .../roles/nginx/tasks/main.yml | 35 +++ .../roles/nginx/templates/nginx.conf.j2 | 13 + .../roles/nginx/vars/main.yml | 2 + examples/025_vars_files_group_vars/site.yml | 6 + .../025_vars_files_group_vars/webserver.yml | 6 + examples/026_vault/control.yml | 5 + examples/026_vault/database.yml | 8 + examples/026_vault/group_vars/all | 15 ++ examples/026_vault/loadbalancer.yml | 5 + examples/026_vault/playbooks/hostname.yml | 5 + .../026_vault/playbooks/stack_restart.yml | 33 +++ examples/026_vault/playbooks/stack_status.yml | 67 +++++ examples/026_vault/roles/apache2/README.md | 38 +++ .../026_vault/roles/apache2/defaults/main.yml | 2 + .../026_vault/roles/apache2/handlers/main.yml | 3 + .../026_vault/roles/apache2/meta/main.yml | 139 +++++++++++ .../026_vault/roles/apache2/tasks/main.yml | 17 ++ .../026_vault/roles/apache2/vars/main.yml | 2 + examples/026_vault/roles/control/README.md | 38 +++ .../026_vault/roles/control/defaults/main.yml | 2 + .../026_vault/roles/control/handlers/main.yml | 2 + .../026_vault/roles/control/meta/main.yml | 139 +++++++++++ .../026_vault/roles/control/tasks/main.yml | 6 + .../026_vault/roles/control/vars/main.yml | 2 + examples/026_vault/roles/demo_app/README.md | 38 +++ .../roles/demo_app/defaults/main.yml | 2 + .../roles/demo_app/files/demo/app/demo.py | 20 ++ .../roles/demo_app/files/demo/app/demo.wsgi | 10 + .../demo_app/files/demo/app/requirements.txt | 9 + .../roles/demo_app/files/demo/demo.conf | 11 + .../roles/demo_app/handlers/main.yml | 3 + .../026_vault/roles/demo_app/meta/main.yml | 139 +++++++++++ .../026_vault/roles/demo_app/tasks/main.yml | 27 +++ .../roles/demo_app/templates/demo.wsgi.j2 | 10 + .../026_vault/roles/demo_app/vars/main.yml | 2 + examples/026_vault/roles/mysql/README.md | 38 +++ .../026_vault/roles/mysql/defaults/main.yml | 5 + .../026_vault/roles/mysql/handlers/main.yml | 3 + examples/026_vault/roles/mysql/meta/main.yml | 139 +++++++++++ examples/026_vault/roles/mysql/tasks/main.yml | 27 +++ examples/026_vault/roles/mysql/vars/main.yml | 2 + examples/026_vault/roles/nginx/README.md | 38 +++ .../026_vault/roles/nginx/defaults/main.yml | 5 + .../026_vault/roles/nginx/handlers/main.yml | 3 + examples/026_vault/roles/nginx/meta/main.yml | 139 +++++++++++ examples/026_vault/roles/nginx/tasks/main.yml | 35 +++ .../roles/nginx/templates/nginx.conf.j2 | 13 + examples/026_vault/roles/nginx/vars/main.yml | 2 + examples/026_vault/site.yml | 6 + examples/026_vault/webserver.yml | 6 + examples/027_gather_facts/control.yml | 6 + examples/027_gather_facts/database.yml | 8 + examples/027_gather_facts/group_vars/all | 12 + examples/027_gather_facts/loadbalancer.yml | 6 + .../027_gather_facts/playbooks/hostname.yml | 5 + .../playbooks/stack_restart.yml | 33 +++ .../playbooks/stack_status.yml | 71 ++++++ .../027_gather_facts/roles/apache2/README.md | 38 +++ .../roles/apache2/defaults/main.yml | 2 + .../roles/apache2/handlers/main.yml | 3 + .../roles/apache2/meta/main.yml | 139 +++++++++++ .../roles/apache2/tasks/main.yml | 17 ++ .../roles/apache2/vars/main.yml | 2 + .../027_gather_facts/roles/control/README.md | 38 +++ .../roles/control/defaults/main.yml | 2 + .../roles/control/handlers/main.yml | 2 + .../roles/control/meta/main.yml | 139 +++++++++++ .../roles/control/tasks/main.yml | 6 + .../roles/control/vars/main.yml | 2 + .../027_gather_facts/roles/demo_app/README.md | 38 +++ .../roles/demo_app/defaults/main.yml | 2 + .../roles/demo_app/files/demo/app/demo.py | 20 ++ .../roles/demo_app/files/demo/app/demo.wsgi | 10 + .../demo_app/files/demo/app/requirements.txt | 9 + .../roles/demo_app/files/demo/demo.conf | 11 + .../roles/demo_app/handlers/main.yml | 3 + .../roles/demo_app/meta/main.yml | 139 +++++++++++ .../roles/demo_app/tasks/main.yml | 27 +++ .../roles/demo_app/templates/demo.wsgi.j2 | 10 + .../roles/demo_app/vars/main.yml | 2 + .../027_gather_facts/roles/mysql/README.md | 38 +++ .../roles/mysql/defaults/main.yml | 5 + .../roles/mysql/handlers/main.yml | 3 + .../roles/mysql/meta/main.yml | 139 +++++++++++ .../roles/mysql/tasks/main.yml | 27 +++ .../roles/mysql/vars/main.yml | 2 + .../027_gather_facts/roles/nginx/README.md | 38 +++ .../roles/nginx/defaults/main.yml | 5 + .../roles/nginx/handlers/main.yml | 3 + .../roles/nginx/meta/main.yml | 139 +++++++++++ .../roles/nginx/tasks/main.yml | 35 +++ .../roles/nginx/templates/nginx.conf.j2 | 13 + .../roles/nginx/vars/main.yml | 2 + examples/027_gather_facts/site.yml | 6 + examples/027_gather_facts/webserver.yml | 7 + examples/028_apt_cache_one_day/control.yml | 6 + examples/028_apt_cache_one_day/database.yml | 8 + examples/028_apt_cache_one_day/group_vars/all | 12 + .../028_apt_cache_one_day/loadbalancer.yml | 6 + .../playbooks/hostname.yml | 5 + .../playbooks/stack_restart.yml | 33 +++ .../playbooks/stack_status.yml | 71 ++++++ .../roles/apache2/README.md | 38 +++ .../roles/apache2/defaults/main.yml | 2 + .../roles/apache2/handlers/main.yml | 3 + .../roles/apache2/meta/main.yml | 139 +++++++++++ .../roles/apache2/tasks/main.yml | 20 ++ .../roles/apache2/vars/main.yml | 2 + .../roles/control/README.md | 38 +++ .../roles/control/defaults/main.yml | 2 + .../roles/control/handlers/main.yml | 2 + .../roles/control/meta/main.yml | 139 +++++++++++ .../roles/control/tasks/main.yml | 9 + .../roles/control/vars/main.yml | 2 + .../roles/demo_app/README.md | 38 +++ .../roles/demo_app/defaults/main.yml | 2 + .../roles/demo_app/files/demo/app/demo.py | 20 ++ .../roles/demo_app/files/demo/app/demo.wsgi | 10 + .../demo_app/files/demo/app/requirements.txt | 9 + .../roles/demo_app/files/demo/demo.conf | 11 + .../roles/demo_app/handlers/main.yml | 3 + .../roles/demo_app/meta/main.yml | 139 +++++++++++ .../roles/demo_app/tasks/main.yml | 30 +++ .../roles/demo_app/templates/demo.wsgi.j2 | 10 + .../roles/demo_app/vars/main.yml | 2 + .../roles/mysql/README.md | 38 +++ .../roles/mysql/defaults/main.yml | 5 + .../roles/mysql/handlers/main.yml | 3 + .../roles/mysql/meta/main.yml | 139 +++++++++++ .../roles/mysql/tasks/main.yml | 30 +++ .../roles/mysql/vars/main.yml | 2 + .../roles/nginx/README.md | 38 +++ .../roles/nginx/defaults/main.yml | 5 + .../roles/nginx/handlers/main.yml | 3 + .../roles/nginx/meta/main.yml | 139 +++++++++++ .../roles/nginx/tasks/main.yml | 38 +++ .../roles/nginx/templates/nginx.conf.j2 | 13 + .../roles/nginx/vars/main.yml | 2 + examples/028_apt_cache_one_day/site.yml | 6 + examples/028_apt_cache_one_day/webserver.yml | 7 + examples/029_tags/control.yml | 6 + examples/029_tags/database.yml | 8 + examples/029_tags/group_vars/all | 12 + examples/029_tags/loadbalancer.yml | 6 + examples/029_tags/playbooks/hostname.yml | 5 + examples/029_tags/playbooks/stack_restart.yml | 33 +++ examples/029_tags/playbooks/stack_status.yml | 71 ++++++ examples/029_tags/roles/apache2/README.md | 38 +++ .../029_tags/roles/apache2/defaults/main.yml | 2 + .../029_tags/roles/apache2/handlers/main.yml | 3 + examples/029_tags/roles/apache2/meta/main.yml | 139 +++++++++++ .../029_tags/roles/apache2/tasks/main.yml | 21 ++ examples/029_tags/roles/apache2/vars/main.yml | 2 + examples/029_tags/roles/control/README.md | 38 +++ .../029_tags/roles/control/defaults/main.yml | 2 + .../029_tags/roles/control/handlers/main.yml | 2 + examples/029_tags/roles/control/meta/main.yml | 139 +++++++++++ .../029_tags/roles/control/tasks/main.yml | 9 + examples/029_tags/roles/control/vars/main.yml | 2 + examples/029_tags/roles/demo_app/README.md | 38 +++ .../029_tags/roles/demo_app/defaults/main.yml | 2 + .../roles/demo_app/files/demo/app/demo.py | 20 ++ .../roles/demo_app/files/demo/app/demo.wsgi | 10 + .../demo_app/files/demo/app/requirements.txt | 9 + .../roles/demo_app/files/demo/demo.conf | 11 + .../029_tags/roles/demo_app/handlers/main.yml | 3 + .../029_tags/roles/demo_app/meta/main.yml | 139 +++++++++++ .../029_tags/roles/demo_app/tasks/main.yml | 35 +++ .../roles/demo_app/templates/demo.wsgi.j2 | 10 + .../029_tags/roles/demo_app/vars/main.yml | 2 + examples/029_tags/roles/mysql/README.md | 38 +++ .../029_tags/roles/mysql/defaults/main.yml | 5 + .../029_tags/roles/mysql/handlers/main.yml | 3 + examples/029_tags/roles/mysql/meta/main.yml | 139 +++++++++++ examples/029_tags/roles/mysql/tasks/main.yml | 30 +++ examples/029_tags/roles/mysql/vars/main.yml | 2 + examples/029_tags/roles/nginx/README.md | 38 +++ .../029_tags/roles/nginx/defaults/main.yml | 5 + .../029_tags/roles/nginx/handlers/main.yml | 3 + examples/029_tags/roles/nginx/meta/main.yml | 139 +++++++++++ examples/029_tags/roles/nginx/tasks/main.yml | 38 +++ .../roles/nginx/templates/nginx.conf.j2 | 13 + examples/029_tags/roles/nginx/vars/main.yml | 2 + examples/029_tags/site.yml | 6 + examples/029_tags/webserver.yml | 7 + examples/030_windows/README.md | 71 ++++++ examples/030_windows/all-hosts | 9 + examples/030_windows/windows.yml | 41 ++++ examples/031_aws/README.md | 33 +++ examples/031_aws/aws-example.yml | 53 ++++ examples/032_azure/README.md | 3 + examples/032_azure/test_ansible_azure.yml | 60 +++++ examples/extra_vagrant_files/Vagrantfile1804 | 28 +++ examples/extra_vagrant_files/Vagrantfile2004 | 28 +++ examples/extra_vagrant_files/Vagrantfile2104 | 28 +++ .../extra_vagrant_files/VagrantfileDebian | 28 +++ .../essential_box/Vagrantfile | 11 + .../essential_box/install.sh | 3 + .../multi_agent_setup/VagrantFile | 39 +++ .../multi_agent_setup/install.sh | 3 + misc/all-hosts | 11 + misc/arquitectura-ansible.pdf | Bin 0 -> 863701 bytes misc/nginx.conf | 56 +++++ 885 files changed, 22353 insertions(+) create mode 100755 .gitignore create mode 100755 README.md create mode 100644 Vagrantfile create mode 100644 ansible.sh create mode 100755 examples/000_example/group_vars/all create mode 100755 examples/000_example/group_vars/webservers create mode 100755 examples/000_example/hosts create mode 100755 examples/000_example/roles/apache/README.md create mode 100755 examples/000_example/roles/apache/defaults/main.yml create mode 100755 examples/000_example/roles/apache/handlers/main.yml create mode 100755 examples/000_example/roles/apache/meta/main.yml create mode 100755 examples/000_example/roles/apache/tasks/main.yml create mode 100755 examples/000_example/roles/apache/templates/httpd.conf.j2 create mode 100755 examples/000_example/roles/apache/templates/index.html.j2 create mode 100755 examples/000_example/roles/apache/tests/inventory create mode 100755 examples/000_example/roles/apache/tests/test.yml create mode 100755 examples/000_example/roles/apache/vars/main.yml create mode 100755 examples/000_example/roles/common/README.md create mode 100755 examples/000_example/roles/common/defaults/main.yml create mode 100755 examples/000_example/roles/common/handlers/main.yml create mode 100755 examples/000_example/roles/common/meta/main.yml create mode 100755 examples/000_example/roles/common/tasks/main.yml create mode 100755 examples/000_example/roles/common/tasks/ntp.yml create mode 100755 examples/000_example/roles/common/tasks/selinux.yml create mode 100755 examples/000_example/roles/common/templates/ntp.conf.j2 create mode 100755 examples/000_example/roles/common/tests/inventory create mode 100755 examples/000_example/roles/common/tests/test.yml create mode 100755 examples/000_example/roles/common/vars/main.yml create mode 100755 examples/000_example/site.yml create mode 100644 examples/000_initial_example/001-hostname.yml create mode 100644 examples/000_initial_example/hosts create mode 100755 examples/000_initial_examples/etc_ansible_hosts create mode 100644 examples/000_initial_examples/hostname.yml create mode 100644 examples/000_initial_examples/your-first-hosts-file create mode 100644 examples/001_apt/database.yml create mode 100644 examples/001_apt/hostname.yml create mode 100644 examples/001_apt/hosts create mode 100644 examples/001_apt/loadbalancer.yml create mode 100644 examples/002_become/database.yml create mode 100644 examples/002_become/hostname.yml create mode 100644 examples/002_become/hosts create mode 100644 examples/002_become/loadbalancer.yml create mode 100644 examples/003_with_items/database.yml create mode 100644 examples/003_with_items/hostname.yml create mode 100644 examples/003_with_items/loadbalancer.yml create mode 100644 examples/003_with_items/webserver.yml create mode 100644 examples/004_services/control.yml create mode 100644 examples/004_services/database.yml create mode 100644 examples/004_services/loadbalancer.yml create mode 100644 examples/004_services/playbooks/hostname.yml create mode 100644 examples/004_services/playbooks/stack_restart.yml create mode 100644 examples/004_services/playbooks/stack_restart.yml.save create mode 100644 examples/004_services/playbooks/stack_stopped.yml create mode 100644 examples/004_services/webserver.yml create mode 100644 examples/005_stack_restart/control.yml create mode 100644 examples/005_stack_restart/database.yml create mode 100644 examples/005_stack_restart/loadbalancer.yml create mode 100644 examples/005_stack_restart/playbook/hostname.yml create mode 100644 examples/005_stack_restart/playbook/stack_restart.yml create mode 100644 examples/005_stack_restart/webserver.yml create mode 100644 examples/006_notify_handlers/control.yml create mode 100644 examples/006_notify_handlers/database.yml create mode 100644 examples/006_notify_handlers/demo/app/demo.py create mode 100644 examples/006_notify_handlers/demo/app/demo.wsgi create mode 100644 examples/006_notify_handlers/demo/app/requirements.txt create mode 100644 examples/006_notify_handlers/demo/demo.conf create mode 100644 examples/006_notify_handlers/loadbalancer.yml create mode 100644 examples/006_notify_handlers/playbook/hostname.yml create mode 100644 examples/006_notify_handlers/playbook/stack_restart.yml create mode 100644 examples/006_notify_handlers/webserver.yml create mode 100644 examples/007_files_copy/control.yml create mode 100644 examples/007_files_copy/database.yml create mode 100644 examples/007_files_copy/demo/app/demo.py create mode 100644 examples/007_files_copy/demo/app/demo.wsgi create mode 100644 examples/007_files_copy/demo/app/requirements.txt create mode 100644 examples/007_files_copy/demo/demo.conf create mode 100644 examples/007_files_copy/loadbalancer.yml create mode 100644 examples/007_files_copy/playbook/hostname.yml create mode 100644 examples/007_files_copy/playbook/stack_restart.yml create mode 100644 examples/007_files_copy/webserver.yml create mode 100644 examples/008_pip/control.yml create mode 100644 examples/008_pip/database.yml create mode 100644 examples/008_pip/demo/app/demo.py create mode 100644 examples/008_pip/demo/app/demo.wsgi create mode 100644 examples/008_pip/demo/app/requirements.txt create mode 100644 examples/008_pip/demo/demo.conf create mode 100644 examples/008_pip/loadbalancer.yml create mode 100644 examples/008_pip/playbook/hostname.yml create mode 100644 examples/008_pip/playbook/stack_restart.yml create mode 100644 examples/008_pip/webserver.yml create mode 100644 examples/009_files/control.yml create mode 100644 examples/009_files/database.yml create mode 100644 examples/009_files/demo/app/demo.py create mode 100644 examples/009_files/demo/app/demo.wsgi create mode 100644 examples/009_files/demo/app/requirements.txt create mode 100644 examples/009_files/demo/demo.conf create mode 100644 examples/009_files/loadbalancer.yml create mode 100644 examples/009_files/playbook/hostname.yml create mode 100644 examples/009_files/playbook/stack_restart.yml create mode 100644 examples/009_files/webserver.yml create mode 100644 examples/010_templates/control.yml create mode 100644 examples/010_templates/database.yml create mode 100644 examples/010_templates/demo/app/demo.py create mode 100644 examples/010_templates/demo/app/demo.wsgi create mode 100644 examples/010_templates/demo/app/requirements.txt create mode 100644 examples/010_templates/demo/demo.conf create mode 100644 examples/010_templates/loadbalancer.yml create mode 100644 examples/010_templates/playbook/hostname.yml create mode 100644 examples/010_templates/playbook/loadbalancer-default-nginx.yml create mode 100644 examples/010_templates/playbook/nginx-default.conf create mode 100644 examples/010_templates/playbook/nginx-default.html create mode 100644 examples/010_templates/playbook/stack_restart.yml create mode 100644 examples/010_templates/templates/nginx.conf.j2 create mode 100644 examples/010_templates/webserver.yml create mode 100644 examples/011_lineinfile/control.yml create mode 100644 examples/011_lineinfile/database.yml create mode 100644 examples/011_lineinfile/demo/app/demo.py create mode 100644 examples/011_lineinfile/demo/app/demo.wsgi create mode 100644 examples/011_lineinfile/demo/app/requirements.txt create mode 100644 examples/011_lineinfile/demo/demo.conf create mode 100644 examples/011_lineinfile/loadbalancer.yml create mode 100644 examples/011_lineinfile/playbook/hostname.yml create mode 100644 examples/011_lineinfile/playbook/stack_restart.yml create mode 100644 examples/011_lineinfile/templates/nginx.conf.j2 create mode 100644 examples/011_lineinfile/webserver.yml create mode 100644 examples/012_mysql_management/.clean-database.yml.swp create mode 100644 examples/012_mysql_management/control.yml create mode 100644 examples/012_mysql_management/database.yml create mode 100644 examples/012_mysql_management/demo/app/demo.py create mode 100644 examples/012_mysql_management/demo/app/demo.wsgi create mode 100644 examples/012_mysql_management/demo/app/requirements.txt create mode 100644 examples/012_mysql_management/demo/demo.conf create mode 100644 examples/012_mysql_management/loadbalancer.yml create mode 100644 examples/012_mysql_management/playbook/clean-database.yml create mode 100644 examples/012_mysql_management/playbook/hostname.yml create mode 100644 examples/012_mysql_management/playbook/stack_restart.yml create mode 100644 examples/012_mysql_management/templates/nginx.conf.j2 create mode 100644 examples/012_mysql_management/webserver.yml create mode 100644 examples/013_wait_for/control.yml create mode 100644 examples/013_wait_for/database.yml create mode 100644 examples/013_wait_for/demo/app/demo.py create mode 100644 examples/013_wait_for/demo/app/demo.wsgi create mode 100644 examples/013_wait_for/demo/app/requirements.txt create mode 100644 examples/013_wait_for/demo/demo.conf create mode 100644 examples/013_wait_for/loadbalancer.yml create mode 100644 examples/013_wait_for/playbook/hostname.yml create mode 100644 examples/013_wait_for/playbook/stack_restart.yml create mode 100644 examples/013_wait_for/playbook/stack_status.yml create mode 100644 examples/013_wait_for/templates/nginx.conf.j2 create mode 100644 examples/013_wait_for/webserver.yml create mode 100644 examples/014_stack_status/control.yml create mode 100644 examples/014_stack_status/database.yml create mode 100644 examples/014_stack_status/demo/app/demo.py create mode 100644 examples/014_stack_status/demo/app/demo.wsgi create mode 100644 examples/014_stack_status/demo/app/requirements.txt create mode 100644 examples/014_stack_status/demo/demo.conf create mode 100644 examples/014_stack_status/loadbalancer.yml create mode 100644 examples/014_stack_status/playbooks/hostname.yml create mode 100644 examples/014_stack_status/playbooks/stack_restart.yml create mode 100644 examples/014_stack_status/playbooks/stack_status.yml create mode 100644 examples/014_stack_status/templates/nginx.conf.j2 create mode 100644 examples/014_stack_status/webserver.yml create mode 100644 examples/015_roles/playbooks/hostname.yml create mode 100644 examples/015_roles/playbooks/stack_restart.yml create mode 100644 examples/015_roles/roles/apache2/.travis.yml create mode 100644 examples/015_roles/roles/apache2/README.md create mode 100644 examples/015_roles/roles/apache2/defaults/main.yml create mode 100644 examples/015_roles/roles/apache2/handlers/main.yml create mode 100644 examples/015_roles/roles/apache2/meta/main.yml create mode 100644 examples/015_roles/roles/apache2/tasks/main.yml create mode 100644 examples/015_roles/roles/apache2/tests/inventory create mode 100644 examples/015_roles/roles/apache2/tests/test.yml create mode 100644 examples/015_roles/roles/apache2/vars/main.yml create mode 100644 examples/015_roles/roles/control/.travis.yml create mode 100644 examples/015_roles/roles/control/README.md create mode 100644 examples/015_roles/roles/control/defaults/main.yml create mode 100644 examples/015_roles/roles/control/handlers/main.yml create mode 100644 examples/015_roles/roles/control/meta/main.yml create mode 100644 examples/015_roles/roles/control/tasks/main.yml create mode 100644 examples/015_roles/roles/control/tests/inventory create mode 100644 examples/015_roles/roles/control/tests/test.yml create mode 100644 examples/015_roles/roles/control/vars/main.yml create mode 100644 examples/015_roles/roles/demo_app/.travis.yml create mode 100644 examples/015_roles/roles/demo_app/README.md create mode 100644 examples/015_roles/roles/demo_app/defaults/main.yml create mode 100644 examples/015_roles/roles/demo_app/files/demo/app/demo.py create mode 100644 examples/015_roles/roles/demo_app/files/demo/app/demo.wsgi create mode 100644 examples/015_roles/roles/demo_app/files/demo/app/requirements.txt create mode 100644 examples/015_roles/roles/demo_app/files/demo/demo.conf create mode 100644 examples/015_roles/roles/demo_app/handlers/main.yml create mode 100644 examples/015_roles/roles/demo_app/meta/main.yml create mode 100644 examples/015_roles/roles/demo_app/tasks/main.yml create mode 100644 examples/015_roles/roles/demo_app/tests/inventory create mode 100644 examples/015_roles/roles/demo_app/tests/test.yml create mode 100644 examples/015_roles/roles/demo_app/vars/main.yml create mode 100644 examples/015_roles/roles/mysql/.travis.yml create mode 100644 examples/015_roles/roles/mysql/README.md create mode 100644 examples/015_roles/roles/mysql/defaults/main.yml create mode 100644 examples/015_roles/roles/mysql/handlers/main.yml create mode 100644 examples/015_roles/roles/mysql/meta/main.yml create mode 100644 examples/015_roles/roles/mysql/tasks/main.yml create mode 100644 examples/015_roles/roles/mysql/tests/inventory create mode 100644 examples/015_roles/roles/mysql/tests/test.yml create mode 100644 examples/015_roles/roles/mysql/vars/main.yml create mode 100644 examples/015_roles/roles/nginx/.travis.yml create mode 100644 examples/015_roles/roles/nginx/README.md create mode 100644 examples/015_roles/roles/nginx/defaults/main.yml create mode 100644 examples/015_roles/roles/nginx/handlers/main.yml create mode 100644 examples/015_roles/roles/nginx/meta/main.yml create mode 100644 examples/015_roles/roles/nginx/tasks/main.yml create mode 100644 examples/015_roles/roles/nginx/templates/nginx.conf.j2 create mode 100644 examples/015_roles/roles/nginx/tests/inventory create mode 100644 examples/015_roles/roles/nginx/tests/test.yml create mode 100644 examples/015_roles/roles/nginx/vars/main.yml create mode 100644 examples/015_roles/roles/status/.travis.yml create mode 100644 examples/015_roles/roles/status/README.md create mode 100644 examples/015_roles/roles/status/defaults/main.yml create mode 100644 examples/015_roles/roles/status/handlers/main.yml create mode 100644 examples/015_roles/roles/status/meta/main.yml create mode 100644 examples/015_roles/roles/status/tests/inventory create mode 100644 examples/015_roles/roles/status/tests/test.yml create mode 100644 examples/015_roles/roles/status/vars/main.yml create mode 100644 examples/015_roles/site.yml create mode 100644 examples/015_roles/stack_status.yml create mode 100644 examples/015_roles/templates/nginx.conf.j2 create mode 100644 examples/016_tasks_handlers/control.yml create mode 100644 examples/016_tasks_handlers/database.yml create mode 100644 examples/016_tasks_handlers/demo/app/demo.py create mode 100644 examples/016_tasks_handlers/demo/app/demo.wsgi create mode 100644 examples/016_tasks_handlers/demo/app/requirements.txt create mode 100644 examples/016_tasks_handlers/demo/demo.conf create mode 100644 examples/016_tasks_handlers/loadbalancer.yml create mode 100644 examples/016_tasks_handlers/playbooks/hostname.yml create mode 100644 examples/016_tasks_handlers/playbooks/stack_restart.yml create mode 100644 examples/016_tasks_handlers/playbooks/stack_status.yml create mode 100644 examples/016_tasks_handlers/roles/apache2/README.md create mode 100644 examples/016_tasks_handlers/roles/apache2/defaults/main.yml create mode 100644 examples/016_tasks_handlers/roles/apache2/handlers/main.yml create mode 100644 examples/016_tasks_handlers/roles/apache2/meta/main.yml create mode 100644 examples/016_tasks_handlers/roles/apache2/tasks/main.yml create mode 100644 examples/016_tasks_handlers/roles/apache2/vars/main.yml create mode 100644 examples/016_tasks_handlers/roles/control/README.md create mode 100644 examples/016_tasks_handlers/roles/control/defaults/main.yml create mode 100644 examples/016_tasks_handlers/roles/control/handlers/main.yml create mode 100644 examples/016_tasks_handlers/roles/control/meta/main.yml create mode 100644 examples/016_tasks_handlers/roles/control/tasks/main.yml create mode 100644 examples/016_tasks_handlers/roles/control/vars/main.yml create mode 100644 examples/016_tasks_handlers/roles/demo_app/README.md create mode 100644 examples/016_tasks_handlers/roles/demo_app/defaults/main.yml create mode 100644 examples/016_tasks_handlers/roles/demo_app/handlers/main.yml create mode 100644 examples/016_tasks_handlers/roles/demo_app/meta/main.yml create mode 100644 examples/016_tasks_handlers/roles/demo_app/tasks/main.yml create mode 100644 examples/016_tasks_handlers/roles/demo_app/vars/main.yml create mode 100644 examples/016_tasks_handlers/roles/mysql/README.md create mode 100644 examples/016_tasks_handlers/roles/mysql/defaults/main.yml create mode 100644 examples/016_tasks_handlers/roles/mysql/handlers/main.yml create mode 100644 examples/016_tasks_handlers/roles/mysql/meta/main.yml create mode 100644 examples/016_tasks_handlers/roles/mysql/tasks/main.yml create mode 100644 examples/016_tasks_handlers/roles/mysql/vars/main.yml create mode 100644 examples/016_tasks_handlers/roles/nginx/README.md create mode 100644 examples/016_tasks_handlers/roles/nginx/defaults/main.yml create mode 100644 examples/016_tasks_handlers/roles/nginx/handlers/main.yml create mode 100644 examples/016_tasks_handlers/roles/nginx/meta/main.yml create mode 100644 examples/016_tasks_handlers/roles/nginx/tasks/main.yml create mode 100644 examples/016_tasks_handlers/roles/nginx/vars/main.yml create mode 100644 examples/016_tasks_handlers/templates/nginx.conf.j2 create mode 100644 examples/016_tasks_handlers/webserver.yml create mode 100644 examples/017_files_templates/control.yml create mode 100644 examples/017_files_templates/database.yml create mode 100644 examples/017_files_templates/demo/app/demo.py create mode 100644 examples/017_files_templates/demo/app/demo.wsgi create mode 100644 examples/017_files_templates/demo/app/requirements.txt create mode 100644 examples/017_files_templates/demo/demo.conf create mode 100644 examples/017_files_templates/loadbalancer.yml create mode 100644 examples/017_files_templates/playbooks/hostname.yml create mode 100644 examples/017_files_templates/playbooks/stack_restart.yml create mode 100644 examples/017_files_templates/playbooks/stack_status.yml create mode 100644 examples/017_files_templates/roles/apache2/README.md create mode 100644 examples/017_files_templates/roles/apache2/defaults/main.yml create mode 100644 examples/017_files_templates/roles/apache2/handlers/main.yml create mode 100644 examples/017_files_templates/roles/apache2/meta/main.yml create mode 100644 examples/017_files_templates/roles/apache2/tasks/main.yml create mode 100644 examples/017_files_templates/roles/apache2/vars/main.yml create mode 100644 examples/017_files_templates/roles/control/README.md create mode 100644 examples/017_files_templates/roles/control/defaults/main.yml create mode 100644 examples/017_files_templates/roles/control/handlers/main.yml create mode 100644 examples/017_files_templates/roles/control/meta/main.yml create mode 100644 examples/017_files_templates/roles/control/tasks/main.yml create mode 100644 examples/017_files_templates/roles/control/vars/main.yml create mode 100644 examples/017_files_templates/roles/demo_app/README.md create mode 100644 examples/017_files_templates/roles/demo_app/defaults/main.yml create mode 100644 examples/017_files_templates/roles/demo_app/files/demo/app/demo.py create mode 100644 examples/017_files_templates/roles/demo_app/files/demo/app/demo.wsgi create mode 100644 examples/017_files_templates/roles/demo_app/files/demo/app/requirements.txt create mode 100644 examples/017_files_templates/roles/demo_app/files/demo/demo.conf create mode 100644 examples/017_files_templates/roles/demo_app/handlers/main.yml create mode 100644 examples/017_files_templates/roles/demo_app/meta/main.yml create mode 100644 examples/017_files_templates/roles/demo_app/tasks/main.yml create mode 100644 examples/017_files_templates/roles/demo_app/vars/main.yml create mode 100644 examples/017_files_templates/roles/mysql/README.md create mode 100644 examples/017_files_templates/roles/mysql/defaults/main.yml create mode 100644 examples/017_files_templates/roles/mysql/handlers/main.yml create mode 100644 examples/017_files_templates/roles/mysql/meta/main.yml create mode 100644 examples/017_files_templates/roles/mysql/tasks/main.yml create mode 100644 examples/017_files_templates/roles/mysql/vars/main.yml create mode 100644 examples/017_files_templates/roles/nginx/README.md create mode 100644 examples/017_files_templates/roles/nginx/defaults/main.yml create mode 100644 examples/017_files_templates/roles/nginx/handlers/main.yml create mode 100644 examples/017_files_templates/roles/nginx/meta/main.yml create mode 100644 examples/017_files_templates/roles/nginx/tasks/main.yml create mode 100644 examples/017_files_templates/roles/nginx/templates/nginx.conf.j2 create mode 100644 examples/017_files_templates/roles/nginx/vars/main.yml create mode 100644 examples/017_files_templates/webserver.yml create mode 100644 examples/018_site_yml/control.yml create mode 100644 examples/018_site_yml/database.yml create mode 100644 examples/018_site_yml/demo/app/demo.py create mode 100644 examples/018_site_yml/demo/app/demo.wsgi create mode 100644 examples/018_site_yml/demo/app/requirements.txt create mode 100644 examples/018_site_yml/demo/demo.conf create mode 100644 examples/018_site_yml/loadbalancer.yml create mode 100644 examples/018_site_yml/playbooks/hostname.yml create mode 100644 examples/018_site_yml/playbooks/stack_restart.yml create mode 100644 examples/018_site_yml/playbooks/stack_status.yml create mode 100644 examples/018_site_yml/roles/apache2/README.md create mode 100644 examples/018_site_yml/roles/apache2/defaults/main.yml create mode 100644 examples/018_site_yml/roles/apache2/handlers/main.yml create mode 100644 examples/018_site_yml/roles/apache2/meta/main.yml create mode 100644 examples/018_site_yml/roles/apache2/tasks/main.yml create mode 100644 examples/018_site_yml/roles/apache2/vars/main.yml create mode 100644 examples/018_site_yml/roles/control/README.md create mode 100644 examples/018_site_yml/roles/control/defaults/main.yml create mode 100644 examples/018_site_yml/roles/control/handlers/main.yml create mode 100644 examples/018_site_yml/roles/control/meta/main.yml create mode 100644 examples/018_site_yml/roles/control/tasks/main.yml create mode 100644 examples/018_site_yml/roles/control/vars/main.yml create mode 100644 examples/018_site_yml/roles/demo_app/README.md create mode 100644 examples/018_site_yml/roles/demo_app/defaults/main.yml create mode 100644 examples/018_site_yml/roles/demo_app/files/demo/app/demo.py create mode 100644 examples/018_site_yml/roles/demo_app/files/demo/app/demo.wsgi create mode 100644 examples/018_site_yml/roles/demo_app/files/demo/app/requirements.txt create mode 100644 examples/018_site_yml/roles/demo_app/files/demo/demo.conf create mode 100644 examples/018_site_yml/roles/demo_app/handlers/main.yml create mode 100644 examples/018_site_yml/roles/demo_app/meta/main.yml create mode 100644 examples/018_site_yml/roles/demo_app/tasks/main.yml create mode 100644 examples/018_site_yml/roles/demo_app/vars/main.yml create mode 100644 examples/018_site_yml/roles/mysql/README.md create mode 100644 examples/018_site_yml/roles/mysql/defaults/main.yml create mode 100644 examples/018_site_yml/roles/mysql/handlers/main.yml create mode 100644 examples/018_site_yml/roles/mysql/meta/main.yml create mode 100644 examples/018_site_yml/roles/mysql/tasks/main.yml create mode 100644 examples/018_site_yml/roles/mysql/vars/main.yml create mode 100644 examples/018_site_yml/roles/nginx/README.md create mode 100644 examples/018_site_yml/roles/nginx/defaults/main.yml create mode 100644 examples/018_site_yml/roles/nginx/handlers/main.yml create mode 100644 examples/018_site_yml/roles/nginx/meta/main.yml create mode 100644 examples/018_site_yml/roles/nginx/tasks/main.yml create mode 100644 examples/018_site_yml/roles/nginx/templates/nginx.conf.j2 create mode 100644 examples/018_site_yml/roles/nginx/vars/main.yml create mode 100644 examples/018_site_yml/site.yml create mode 100644 examples/018_site_yml/webserver.yml create mode 100644 examples/019_facts/control.yml create mode 100644 examples/019_facts/database.yml create mode 100644 examples/019_facts/demo/app/demo.py create mode 100644 examples/019_facts/demo/app/demo.wsgi create mode 100644 examples/019_facts/demo/app/requirements.txt create mode 100644 examples/019_facts/demo/demo.conf create mode 100644 examples/019_facts/loadbalancer.yml create mode 100644 examples/019_facts/playbooks/hostname.yml create mode 100644 examples/019_facts/playbooks/stack_restart.yml create mode 100644 examples/019_facts/playbooks/stack_status.yml create mode 100644 examples/019_facts/roles/apache2/README.md create mode 100644 examples/019_facts/roles/apache2/defaults/main.yml create mode 100644 examples/019_facts/roles/apache2/handlers/main.yml create mode 100644 examples/019_facts/roles/apache2/meta/main.yml create mode 100644 examples/019_facts/roles/apache2/tasks/main.yml create mode 100644 examples/019_facts/roles/apache2/vars/main.yml create mode 100644 examples/019_facts/roles/control/README.md create mode 100644 examples/019_facts/roles/control/defaults/main.yml create mode 100644 examples/019_facts/roles/control/handlers/main.yml create mode 100644 examples/019_facts/roles/control/meta/main.yml create mode 100644 examples/019_facts/roles/control/tasks/main.yml create mode 100644 examples/019_facts/roles/control/vars/main.yml create mode 100644 examples/019_facts/roles/demo_app/README.md create mode 100644 examples/019_facts/roles/demo_app/defaults/main.yml create mode 100644 examples/019_facts/roles/demo_app/files/demo/app/demo.py create mode 100644 examples/019_facts/roles/demo_app/files/demo/app/demo.wsgi create mode 100644 examples/019_facts/roles/demo_app/files/demo/app/requirements.txt create mode 100644 examples/019_facts/roles/demo_app/files/demo/demo.conf create mode 100644 examples/019_facts/roles/demo_app/handlers/main.yml create mode 100644 examples/019_facts/roles/demo_app/meta/main.yml create mode 100644 examples/019_facts/roles/demo_app/tasks/main.yml create mode 100644 examples/019_facts/roles/demo_app/vars/main.yml create mode 100644 examples/019_facts/roles/mysql/README.md create mode 100644 examples/019_facts/roles/mysql/defaults/main.yml create mode 100644 examples/019_facts/roles/mysql/handlers/main.yml create mode 100644 examples/019_facts/roles/mysql/meta/main.yml create mode 100644 examples/019_facts/roles/mysql/tasks/main.yml create mode 100644 examples/019_facts/roles/mysql/vars/main.yml create mode 100644 examples/019_facts/roles/nginx/README.md create mode 100644 examples/019_facts/roles/nginx/defaults/main.yml create mode 100644 examples/019_facts/roles/nginx/handlers/main.yml create mode 100644 examples/019_facts/roles/nginx/meta/main.yml create mode 100644 examples/019_facts/roles/nginx/tasks/main.yml create mode 100644 examples/019_facts/roles/nginx/templates/nginx.conf.j2 create mode 100644 examples/019_facts/roles/nginx/vars/main.yml create mode 100644 examples/019_facts/site.yml create mode 100644 examples/019_facts/webserver.yml create mode 100644 examples/020_defaults/control.yml create mode 100644 examples/020_defaults/database.yml create mode 100644 examples/020_defaults/demo/app/demo.py create mode 100644 examples/020_defaults/demo/app/demo.wsgi create mode 100644 examples/020_defaults/demo/app/requirements.txt create mode 100644 examples/020_defaults/demo/demo.conf create mode 100644 examples/020_defaults/loadbalancer.yml create mode 100644 examples/020_defaults/playbooks/hostname.yml create mode 100644 examples/020_defaults/playbooks/stack_restart.yml create mode 100644 examples/020_defaults/playbooks/stack_status.yml create mode 100644 examples/020_defaults/roles/apache2/README.md create mode 100644 examples/020_defaults/roles/apache2/defaults/main.yml create mode 100644 examples/020_defaults/roles/apache2/handlers/main.yml create mode 100644 examples/020_defaults/roles/apache2/meta/main.yml create mode 100644 examples/020_defaults/roles/apache2/tasks/main.yml create mode 100644 examples/020_defaults/roles/apache2/vars/main.yml create mode 100644 examples/020_defaults/roles/control/README.md create mode 100644 examples/020_defaults/roles/control/defaults/main.yml create mode 100644 examples/020_defaults/roles/control/handlers/main.yml create mode 100644 examples/020_defaults/roles/control/meta/main.yml create mode 100644 examples/020_defaults/roles/control/tasks/main.yml create mode 100644 examples/020_defaults/roles/control/vars/main.yml create mode 100644 examples/020_defaults/roles/demo_app/README.md create mode 100644 examples/020_defaults/roles/demo_app/defaults/main.yml create mode 100644 examples/020_defaults/roles/demo_app/files/demo/app/demo.py create mode 100644 examples/020_defaults/roles/demo_app/files/demo/app/demo.wsgi create mode 100644 examples/020_defaults/roles/demo_app/files/demo/app/requirements.txt create mode 100644 examples/020_defaults/roles/demo_app/files/demo/demo.conf create mode 100644 examples/020_defaults/roles/demo_app/handlers/main.yml create mode 100644 examples/020_defaults/roles/demo_app/meta/main.yml create mode 100644 examples/020_defaults/roles/demo_app/tasks/main.yml create mode 100644 examples/020_defaults/roles/demo_app/vars/main.yml create mode 100644 examples/020_defaults/roles/mysql/README.md create mode 100644 examples/020_defaults/roles/mysql/defaults/main.yml create mode 100644 examples/020_defaults/roles/mysql/handlers/main.yml create mode 100644 examples/020_defaults/roles/mysql/meta/main.yml create mode 100644 examples/020_defaults/roles/mysql/tasks/main.yml create mode 100644 examples/020_defaults/roles/mysql/vars/main.yml create mode 100644 examples/020_defaults/roles/nginx/README.md create mode 100644 examples/020_defaults/roles/nginx/defaults/main.yml create mode 100644 examples/020_defaults/roles/nginx/handlers/main.yml create mode 100644 examples/020_defaults/roles/nginx/meta/main.yml create mode 100644 examples/020_defaults/roles/nginx/tasks/main.yml create mode 100644 examples/020_defaults/roles/nginx/templates/nginx.conf.j2 create mode 100644 examples/020_defaults/roles/nginx/vars/main.yml create mode 100644 examples/020_defaults/site.yml create mode 100644 examples/020_defaults/webserver.yml create mode 100644 examples/021_vars/control.yml create mode 100644 examples/021_vars/database.yml create mode 100644 examples/021_vars/demo/app/demo.py create mode 100644 examples/021_vars/demo/app/demo.wsgi create mode 100644 examples/021_vars/demo/app/requirements.txt create mode 100644 examples/021_vars/demo/demo.conf create mode 100644 examples/021_vars/loadbalancer.yml create mode 100644 examples/021_vars/playbooks/hostname.yml create mode 100644 examples/021_vars/playbooks/stack_restart.yml create mode 100644 examples/021_vars/playbooks/stack_status.yml create mode 100644 examples/021_vars/roles/apache2/README.md create mode 100644 examples/021_vars/roles/apache2/defaults/main.yml create mode 100644 examples/021_vars/roles/apache2/handlers/main.yml create mode 100644 examples/021_vars/roles/apache2/meta/main.yml create mode 100644 examples/021_vars/roles/apache2/tasks/main.yml create mode 100644 examples/021_vars/roles/apache2/vars/main.yml create mode 100644 examples/021_vars/roles/control/README.md create mode 100644 examples/021_vars/roles/control/defaults/main.yml create mode 100644 examples/021_vars/roles/control/handlers/main.yml create mode 100644 examples/021_vars/roles/control/meta/main.yml create mode 100644 examples/021_vars/roles/control/tasks/main.yml create mode 100644 examples/021_vars/roles/control/vars/main.yml create mode 100644 examples/021_vars/roles/demo_app/README.md create mode 100644 examples/021_vars/roles/demo_app/defaults/main.yml create mode 100644 examples/021_vars/roles/demo_app/files/demo/app/demo.py create mode 100644 examples/021_vars/roles/demo_app/files/demo/app/demo.wsgi create mode 100644 examples/021_vars/roles/demo_app/files/demo/app/requirements.txt create mode 100644 examples/021_vars/roles/demo_app/files/demo/demo.conf create mode 100644 examples/021_vars/roles/demo_app/handlers/main.yml create mode 100644 examples/021_vars/roles/demo_app/meta/main.yml create mode 100644 examples/021_vars/roles/demo_app/tasks/main.yml create mode 100644 examples/021_vars/roles/demo_app/vars/main.yml create mode 100644 examples/021_vars/roles/mysql/README.md create mode 100644 examples/021_vars/roles/mysql/defaults/main.yml create mode 100644 examples/021_vars/roles/mysql/handlers/main.yml create mode 100644 examples/021_vars/roles/mysql/meta/main.yml create mode 100644 examples/021_vars/roles/mysql/tasks/main.yml create mode 100644 examples/021_vars/roles/mysql/vars/main.yml create mode 100644 examples/021_vars/roles/nginx/README.md create mode 100644 examples/021_vars/roles/nginx/defaults/main.yml create mode 100644 examples/021_vars/roles/nginx/handlers/main.yml create mode 100644 examples/021_vars/roles/nginx/meta/main.yml create mode 100644 examples/021_vars/roles/nginx/tasks/main.yml create mode 100644 examples/021_vars/roles/nginx/templates/nginx.conf.j2 create mode 100644 examples/021_vars/roles/nginx/vars/main.yml create mode 100644 examples/021_vars/site.yml create mode 100644 examples/021_vars/webserver.yml create mode 100644 examples/022_with_dict/control.yml create mode 100644 examples/022_with_dict/database.yml create mode 100644 examples/022_with_dict/demo/app/demo.py create mode 100644 examples/022_with_dict/demo/app/demo.wsgi create mode 100644 examples/022_with_dict/demo/app/requirements.txt create mode 100644 examples/022_with_dict/demo/demo.conf create mode 100644 examples/022_with_dict/loadbalancer.yml create mode 100644 examples/022_with_dict/playbooks/hostname.yml create mode 100644 examples/022_with_dict/playbooks/stack_restart.yml create mode 100644 examples/022_with_dict/playbooks/stack_status.yml create mode 100644 examples/022_with_dict/roles/apache2/README.md create mode 100644 examples/022_with_dict/roles/apache2/defaults/main.yml create mode 100644 examples/022_with_dict/roles/apache2/handlers/main.yml create mode 100644 examples/022_with_dict/roles/apache2/meta/main.yml create mode 100644 examples/022_with_dict/roles/apache2/tasks/main.yml create mode 100644 examples/022_with_dict/roles/apache2/vars/main.yml create mode 100644 examples/022_with_dict/roles/control/README.md create mode 100644 examples/022_with_dict/roles/control/defaults/main.yml create mode 100644 examples/022_with_dict/roles/control/handlers/main.yml create mode 100644 examples/022_with_dict/roles/control/meta/main.yml create mode 100644 examples/022_with_dict/roles/control/tasks/main.yml create mode 100644 examples/022_with_dict/roles/control/vars/main.yml create mode 100644 examples/022_with_dict/roles/demo_app/README.md create mode 100644 examples/022_with_dict/roles/demo_app/defaults/main.yml create mode 100644 examples/022_with_dict/roles/demo_app/files/demo/app/demo.py create mode 100644 examples/022_with_dict/roles/demo_app/files/demo/app/demo.wsgi create mode 100644 examples/022_with_dict/roles/demo_app/files/demo/app/requirements.txt create mode 100644 examples/022_with_dict/roles/demo_app/files/demo/demo.conf create mode 100644 examples/022_with_dict/roles/demo_app/handlers/main.yml create mode 100644 examples/022_with_dict/roles/demo_app/meta/main.yml create mode 100644 examples/022_with_dict/roles/demo_app/tasks/main.yml create mode 100644 examples/022_with_dict/roles/demo_app/vars/main.yml create mode 100644 examples/022_with_dict/roles/mysql/README.md create mode 100644 examples/022_with_dict/roles/mysql/defaults/main.yml create mode 100644 examples/022_with_dict/roles/mysql/handlers/main.yml create mode 100644 examples/022_with_dict/roles/mysql/meta/main.yml create mode 100644 examples/022_with_dict/roles/mysql/tasks/main.yml create mode 100644 examples/022_with_dict/roles/mysql/vars/main.yml create mode 100644 examples/022_with_dict/roles/nginx/README.md create mode 100644 examples/022_with_dict/roles/nginx/defaults/main.yml create mode 100644 examples/022_with_dict/roles/nginx/handlers/main.yml create mode 100644 examples/022_with_dict/roles/nginx/meta/main.yml create mode 100644 examples/022_with_dict/roles/nginx/tasks/main.yml create mode 100644 examples/022_with_dict/roles/nginx/templates/nginx.conf.j2 create mode 100644 examples/022_with_dict/roles/nginx/vars/main.yml create mode 100644 examples/022_with_dict/site.yml create mode 100644 examples/022_with_dict/webserver.yml create mode 100644 examples/023_selective_removal/control.yml create mode 100644 examples/023_selective_removal/database.yml create mode 100644 examples/023_selective_removal/demo/app/demo.py create mode 100644 examples/023_selective_removal/demo/app/demo.wsgi create mode 100644 examples/023_selective_removal/demo/app/requirements.txt create mode 100644 examples/023_selective_removal/demo/demo.conf create mode 100644 examples/023_selective_removal/loadbalancer.yml create mode 100644 examples/023_selective_removal/playbooks/hostname.yml create mode 100644 examples/023_selective_removal/playbooks/stack_restart.yml create mode 100644 examples/023_selective_removal/playbooks/stack_status.yml create mode 100644 examples/023_selective_removal/roles/apache2/README.md create mode 100644 examples/023_selective_removal/roles/apache2/defaults/main.yml create mode 100644 examples/023_selective_removal/roles/apache2/handlers/main.yml create mode 100644 examples/023_selective_removal/roles/apache2/meta/main.yml create mode 100644 examples/023_selective_removal/roles/apache2/tasks/main.yml create mode 100644 examples/023_selective_removal/roles/apache2/vars/main.yml create mode 100644 examples/023_selective_removal/roles/control/README.md create mode 100644 examples/023_selective_removal/roles/control/defaults/main.yml create mode 100644 examples/023_selective_removal/roles/control/handlers/main.yml create mode 100644 examples/023_selective_removal/roles/control/meta/main.yml create mode 100644 examples/023_selective_removal/roles/control/tasks/main.yml create mode 100644 examples/023_selective_removal/roles/control/vars/main.yml create mode 100644 examples/023_selective_removal/roles/demo_app/README.md create mode 100644 examples/023_selective_removal/roles/demo_app/defaults/main.yml create mode 100644 examples/023_selective_removal/roles/demo_app/files/demo/app/demo.py create mode 100644 examples/023_selective_removal/roles/demo_app/files/demo/app/demo.wsgi create mode 100644 examples/023_selective_removal/roles/demo_app/files/demo/app/requirements.txt create mode 100644 examples/023_selective_removal/roles/demo_app/files/demo/demo.conf create mode 100644 examples/023_selective_removal/roles/demo_app/handlers/main.yml create mode 100644 examples/023_selective_removal/roles/demo_app/meta/main.yml create mode 100644 examples/023_selective_removal/roles/demo_app/tasks/main.yml create mode 100644 examples/023_selective_removal/roles/demo_app/vars/main.yml create mode 100644 examples/023_selective_removal/roles/mysql/README.md create mode 100644 examples/023_selective_removal/roles/mysql/defaults/main.yml create mode 100644 examples/023_selective_removal/roles/mysql/handlers/main.yml create mode 100644 examples/023_selective_removal/roles/mysql/meta/main.yml create mode 100644 examples/023_selective_removal/roles/mysql/tasks/main.yml create mode 100644 examples/023_selective_removal/roles/mysql/vars/main.yml create mode 100644 examples/023_selective_removal/roles/nginx/README.md create mode 100644 examples/023_selective_removal/roles/nginx/defaults/main.yml create mode 100644 examples/023_selective_removal/roles/nginx/handlers/main.yml create mode 100644 examples/023_selective_removal/roles/nginx/meta/main.yml create mode 100644 examples/023_selective_removal/roles/nginx/tasks/main.yml create mode 100644 examples/023_selective_removal/roles/nginx/templates/nginx.conf.j2 create mode 100644 examples/023_selective_removal/roles/nginx/vars/main.yml create mode 100644 examples/023_selective_removal/site.yml create mode 100644 examples/023_selective_removal/webserver.yml create mode 100644 examples/024_continued/control.yml create mode 100644 examples/024_continued/database.yml create mode 100644 examples/024_continued/demo/app/demo.py create mode 100644 examples/024_continued/demo/app/demo.wsgi create mode 100644 examples/024_continued/demo/app/requirements.txt create mode 100644 examples/024_continued/demo/demo.conf create mode 100644 examples/024_continued/loadbalancer.yml create mode 100644 examples/024_continued/playbooks/hostname.yml create mode 100644 examples/024_continued/playbooks/stack_restart.yml create mode 100644 examples/024_continued/playbooks/stack_status.yml create mode 100644 examples/024_continued/roles/apache2/README.md create mode 100644 examples/024_continued/roles/apache2/defaults/main.yml create mode 100644 examples/024_continued/roles/apache2/handlers/main.yml create mode 100644 examples/024_continued/roles/apache2/meta/main.yml create mode 100644 examples/024_continued/roles/apache2/tasks/main.yml create mode 100644 examples/024_continued/roles/apache2/vars/main.yml create mode 100644 examples/024_continued/roles/control/README.md create mode 100644 examples/024_continued/roles/control/defaults/main.yml create mode 100644 examples/024_continued/roles/control/handlers/main.yml create mode 100644 examples/024_continued/roles/control/meta/main.yml create mode 100644 examples/024_continued/roles/control/tasks/main.yml create mode 100644 examples/024_continued/roles/control/vars/main.yml create mode 100644 examples/024_continued/roles/demo_app/README.md create mode 100644 examples/024_continued/roles/demo_app/defaults/main.yml create mode 100644 examples/024_continued/roles/demo_app/files/demo/app/demo.py create mode 100644 examples/024_continued/roles/demo_app/files/demo/app/requirements.txt create mode 100644 examples/024_continued/roles/demo_app/files/demo/demo.conf create mode 100644 examples/024_continued/roles/demo_app/handlers/main.yml create mode 100644 examples/024_continued/roles/demo_app/meta/main.yml create mode 100644 examples/024_continued/roles/demo_app/tasks/main.yml create mode 100644 examples/024_continued/roles/demo_app/templates/demo.wsgi.j2 create mode 100644 examples/024_continued/roles/demo_app/vars/main.yml create mode 100644 examples/024_continued/roles/mysql/README.md create mode 100644 examples/024_continued/roles/mysql/defaults/main.yml create mode 100644 examples/024_continued/roles/mysql/handlers/main.yml create mode 100644 examples/024_continued/roles/mysql/meta/main.yml create mode 100644 examples/024_continued/roles/mysql/tasks/main.yml create mode 100644 examples/024_continued/roles/mysql/vars/main.yml create mode 100644 examples/024_continued/roles/nginx/README.md create mode 100644 examples/024_continued/roles/nginx/defaults/main.yml create mode 100644 examples/024_continued/roles/nginx/handlers/main.yml create mode 100644 examples/024_continued/roles/nginx/meta/main.yml create mode 100644 examples/024_continued/roles/nginx/tasks/main.yml create mode 100644 examples/024_continued/roles/nginx/templates/nginx.conf.j2 create mode 100644 examples/024_continued/roles/nginx/vars/main.yml create mode 100644 examples/024_continued/site.yml create mode 100644 examples/024_continued/webserver.yml create mode 100644 examples/025_vars_files_group_vars/control.yml create mode 100644 examples/025_vars_files_group_vars/database.yml create mode 100644 examples/025_vars_files_group_vars/group_vars/all create mode 100644 examples/025_vars_files_group_vars/loadbalancer.yml create mode 100644 examples/025_vars_files_group_vars/playbooks/hostname.yml create mode 100644 examples/025_vars_files_group_vars/playbooks/stack_restart.yml create mode 100644 examples/025_vars_files_group_vars/playbooks/stack_status.yml create mode 100644 examples/025_vars_files_group_vars/roles/apache2/README.md create mode 100644 examples/025_vars_files_group_vars/roles/apache2/defaults/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/apache2/handlers/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/apache2/meta/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/apache2/tasks/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/apache2/vars/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/control/README.md create mode 100644 examples/025_vars_files_group_vars/roles/control/defaults/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/control/handlers/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/control/meta/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/control/tasks/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/control/vars/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/demo_app/README.md create mode 100644 examples/025_vars_files_group_vars/roles/demo_app/defaults/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/demo_app/files/demo/app/demo.py create mode 100644 examples/025_vars_files_group_vars/roles/demo_app/files/demo/app/demo.wsgi create mode 100644 examples/025_vars_files_group_vars/roles/demo_app/files/demo/app/requirements.txt create mode 100644 examples/025_vars_files_group_vars/roles/demo_app/files/demo/demo.conf create mode 100644 examples/025_vars_files_group_vars/roles/demo_app/handlers/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/demo_app/meta/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/demo_app/tasks/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/demo_app/templates/demo.wsgi.j2 create mode 100644 examples/025_vars_files_group_vars/roles/demo_app/vars/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/mysql/README.md create mode 100644 examples/025_vars_files_group_vars/roles/mysql/defaults/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/mysql/handlers/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/mysql/meta/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/mysql/tasks/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/mysql/vars/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/nginx/README.md create mode 100644 examples/025_vars_files_group_vars/roles/nginx/defaults/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/nginx/handlers/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/nginx/meta/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/nginx/tasks/main.yml create mode 100644 examples/025_vars_files_group_vars/roles/nginx/templates/nginx.conf.j2 create mode 100644 examples/025_vars_files_group_vars/roles/nginx/vars/main.yml create mode 100644 examples/025_vars_files_group_vars/site.yml create mode 100644 examples/025_vars_files_group_vars/webserver.yml create mode 100644 examples/026_vault/control.yml create mode 100644 examples/026_vault/database.yml create mode 100644 examples/026_vault/group_vars/all create mode 100644 examples/026_vault/loadbalancer.yml create mode 100644 examples/026_vault/playbooks/hostname.yml create mode 100644 examples/026_vault/playbooks/stack_restart.yml create mode 100644 examples/026_vault/playbooks/stack_status.yml create mode 100644 examples/026_vault/roles/apache2/README.md create mode 100644 examples/026_vault/roles/apache2/defaults/main.yml create mode 100644 examples/026_vault/roles/apache2/handlers/main.yml create mode 100644 examples/026_vault/roles/apache2/meta/main.yml create mode 100644 examples/026_vault/roles/apache2/tasks/main.yml create mode 100644 examples/026_vault/roles/apache2/vars/main.yml create mode 100644 examples/026_vault/roles/control/README.md create mode 100644 examples/026_vault/roles/control/defaults/main.yml create mode 100644 examples/026_vault/roles/control/handlers/main.yml create mode 100644 examples/026_vault/roles/control/meta/main.yml create mode 100644 examples/026_vault/roles/control/tasks/main.yml create mode 100644 examples/026_vault/roles/control/vars/main.yml create mode 100644 examples/026_vault/roles/demo_app/README.md create mode 100644 examples/026_vault/roles/demo_app/defaults/main.yml create mode 100644 examples/026_vault/roles/demo_app/files/demo/app/demo.py create mode 100644 examples/026_vault/roles/demo_app/files/demo/app/demo.wsgi create mode 100644 examples/026_vault/roles/demo_app/files/demo/app/requirements.txt create mode 100644 examples/026_vault/roles/demo_app/files/demo/demo.conf create mode 100644 examples/026_vault/roles/demo_app/handlers/main.yml create mode 100644 examples/026_vault/roles/demo_app/meta/main.yml create mode 100644 examples/026_vault/roles/demo_app/tasks/main.yml create mode 100644 examples/026_vault/roles/demo_app/templates/demo.wsgi.j2 create mode 100644 examples/026_vault/roles/demo_app/vars/main.yml create mode 100644 examples/026_vault/roles/mysql/README.md create mode 100644 examples/026_vault/roles/mysql/defaults/main.yml create mode 100644 examples/026_vault/roles/mysql/handlers/main.yml create mode 100644 examples/026_vault/roles/mysql/meta/main.yml create mode 100644 examples/026_vault/roles/mysql/tasks/main.yml create mode 100644 examples/026_vault/roles/mysql/vars/main.yml create mode 100644 examples/026_vault/roles/nginx/README.md create mode 100644 examples/026_vault/roles/nginx/defaults/main.yml create mode 100644 examples/026_vault/roles/nginx/handlers/main.yml create mode 100644 examples/026_vault/roles/nginx/meta/main.yml create mode 100644 examples/026_vault/roles/nginx/tasks/main.yml create mode 100644 examples/026_vault/roles/nginx/templates/nginx.conf.j2 create mode 100644 examples/026_vault/roles/nginx/vars/main.yml create mode 100644 examples/026_vault/site.yml create mode 100644 examples/026_vault/webserver.yml create mode 100644 examples/027_gather_facts/control.yml create mode 100644 examples/027_gather_facts/database.yml create mode 100644 examples/027_gather_facts/group_vars/all create mode 100644 examples/027_gather_facts/loadbalancer.yml create mode 100644 examples/027_gather_facts/playbooks/hostname.yml create mode 100644 examples/027_gather_facts/playbooks/stack_restart.yml create mode 100644 examples/027_gather_facts/playbooks/stack_status.yml create mode 100644 examples/027_gather_facts/roles/apache2/README.md create mode 100644 examples/027_gather_facts/roles/apache2/defaults/main.yml create mode 100644 examples/027_gather_facts/roles/apache2/handlers/main.yml create mode 100644 examples/027_gather_facts/roles/apache2/meta/main.yml create mode 100644 examples/027_gather_facts/roles/apache2/tasks/main.yml create mode 100644 examples/027_gather_facts/roles/apache2/vars/main.yml create mode 100644 examples/027_gather_facts/roles/control/README.md create mode 100644 examples/027_gather_facts/roles/control/defaults/main.yml create mode 100644 examples/027_gather_facts/roles/control/handlers/main.yml create mode 100644 examples/027_gather_facts/roles/control/meta/main.yml create mode 100644 examples/027_gather_facts/roles/control/tasks/main.yml create mode 100644 examples/027_gather_facts/roles/control/vars/main.yml create mode 100644 examples/027_gather_facts/roles/demo_app/README.md create mode 100644 examples/027_gather_facts/roles/demo_app/defaults/main.yml create mode 100644 examples/027_gather_facts/roles/demo_app/files/demo/app/demo.py create mode 100644 examples/027_gather_facts/roles/demo_app/files/demo/app/demo.wsgi create mode 100644 examples/027_gather_facts/roles/demo_app/files/demo/app/requirements.txt create mode 100644 examples/027_gather_facts/roles/demo_app/files/demo/demo.conf create mode 100644 examples/027_gather_facts/roles/demo_app/handlers/main.yml create mode 100644 examples/027_gather_facts/roles/demo_app/meta/main.yml create mode 100644 examples/027_gather_facts/roles/demo_app/tasks/main.yml create mode 100644 examples/027_gather_facts/roles/demo_app/templates/demo.wsgi.j2 create mode 100644 examples/027_gather_facts/roles/demo_app/vars/main.yml create mode 100644 examples/027_gather_facts/roles/mysql/README.md create mode 100644 examples/027_gather_facts/roles/mysql/defaults/main.yml create mode 100644 examples/027_gather_facts/roles/mysql/handlers/main.yml create mode 100644 examples/027_gather_facts/roles/mysql/meta/main.yml create mode 100644 examples/027_gather_facts/roles/mysql/tasks/main.yml create mode 100644 examples/027_gather_facts/roles/mysql/vars/main.yml create mode 100644 examples/027_gather_facts/roles/nginx/README.md create mode 100644 examples/027_gather_facts/roles/nginx/defaults/main.yml create mode 100644 examples/027_gather_facts/roles/nginx/handlers/main.yml create mode 100644 examples/027_gather_facts/roles/nginx/meta/main.yml create mode 100644 examples/027_gather_facts/roles/nginx/tasks/main.yml create mode 100644 examples/027_gather_facts/roles/nginx/templates/nginx.conf.j2 create mode 100644 examples/027_gather_facts/roles/nginx/vars/main.yml create mode 100644 examples/027_gather_facts/site.yml create mode 100644 examples/027_gather_facts/webserver.yml create mode 100644 examples/028_apt_cache_one_day/control.yml create mode 100644 examples/028_apt_cache_one_day/database.yml create mode 100644 examples/028_apt_cache_one_day/group_vars/all create mode 100644 examples/028_apt_cache_one_day/loadbalancer.yml create mode 100644 examples/028_apt_cache_one_day/playbooks/hostname.yml create mode 100644 examples/028_apt_cache_one_day/playbooks/stack_restart.yml create mode 100644 examples/028_apt_cache_one_day/playbooks/stack_status.yml create mode 100644 examples/028_apt_cache_one_day/roles/apache2/README.md create mode 100644 examples/028_apt_cache_one_day/roles/apache2/defaults/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/apache2/handlers/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/apache2/meta/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/apache2/tasks/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/apache2/vars/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/control/README.md create mode 100644 examples/028_apt_cache_one_day/roles/control/defaults/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/control/handlers/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/control/meta/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/control/tasks/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/control/vars/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/demo_app/README.md create mode 100644 examples/028_apt_cache_one_day/roles/demo_app/defaults/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/demo_app/files/demo/app/demo.py create mode 100644 examples/028_apt_cache_one_day/roles/demo_app/files/demo/app/demo.wsgi create mode 100644 examples/028_apt_cache_one_day/roles/demo_app/files/demo/app/requirements.txt create mode 100644 examples/028_apt_cache_one_day/roles/demo_app/files/demo/demo.conf create mode 100644 examples/028_apt_cache_one_day/roles/demo_app/handlers/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/demo_app/meta/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/demo_app/tasks/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/demo_app/templates/demo.wsgi.j2 create mode 100644 examples/028_apt_cache_one_day/roles/demo_app/vars/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/mysql/README.md create mode 100644 examples/028_apt_cache_one_day/roles/mysql/defaults/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/mysql/handlers/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/mysql/meta/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/mysql/tasks/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/mysql/vars/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/nginx/README.md create mode 100644 examples/028_apt_cache_one_day/roles/nginx/defaults/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/nginx/handlers/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/nginx/meta/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/nginx/tasks/main.yml create mode 100644 examples/028_apt_cache_one_day/roles/nginx/templates/nginx.conf.j2 create mode 100644 examples/028_apt_cache_one_day/roles/nginx/vars/main.yml create mode 100644 examples/028_apt_cache_one_day/site.yml create mode 100644 examples/028_apt_cache_one_day/webserver.yml create mode 100644 examples/029_tags/control.yml create mode 100644 examples/029_tags/database.yml create mode 100644 examples/029_tags/group_vars/all create mode 100644 examples/029_tags/loadbalancer.yml create mode 100644 examples/029_tags/playbooks/hostname.yml create mode 100644 examples/029_tags/playbooks/stack_restart.yml create mode 100644 examples/029_tags/playbooks/stack_status.yml create mode 100644 examples/029_tags/roles/apache2/README.md create mode 100644 examples/029_tags/roles/apache2/defaults/main.yml create mode 100644 examples/029_tags/roles/apache2/handlers/main.yml create mode 100644 examples/029_tags/roles/apache2/meta/main.yml create mode 100644 examples/029_tags/roles/apache2/tasks/main.yml create mode 100644 examples/029_tags/roles/apache2/vars/main.yml create mode 100644 examples/029_tags/roles/control/README.md create mode 100644 examples/029_tags/roles/control/defaults/main.yml create mode 100644 examples/029_tags/roles/control/handlers/main.yml create mode 100644 examples/029_tags/roles/control/meta/main.yml create mode 100644 examples/029_tags/roles/control/tasks/main.yml create mode 100644 examples/029_tags/roles/control/vars/main.yml create mode 100644 examples/029_tags/roles/demo_app/README.md create mode 100644 examples/029_tags/roles/demo_app/defaults/main.yml create mode 100644 examples/029_tags/roles/demo_app/files/demo/app/demo.py create mode 100644 examples/029_tags/roles/demo_app/files/demo/app/demo.wsgi create mode 100644 examples/029_tags/roles/demo_app/files/demo/app/requirements.txt create mode 100644 examples/029_tags/roles/demo_app/files/demo/demo.conf create mode 100644 examples/029_tags/roles/demo_app/handlers/main.yml create mode 100644 examples/029_tags/roles/demo_app/meta/main.yml create mode 100644 examples/029_tags/roles/demo_app/tasks/main.yml create mode 100644 examples/029_tags/roles/demo_app/templates/demo.wsgi.j2 create mode 100644 examples/029_tags/roles/demo_app/vars/main.yml create mode 100644 examples/029_tags/roles/mysql/README.md create mode 100644 examples/029_tags/roles/mysql/defaults/main.yml create mode 100644 examples/029_tags/roles/mysql/handlers/main.yml create mode 100644 examples/029_tags/roles/mysql/meta/main.yml create mode 100644 examples/029_tags/roles/mysql/tasks/main.yml create mode 100644 examples/029_tags/roles/mysql/vars/main.yml create mode 100644 examples/029_tags/roles/nginx/README.md create mode 100644 examples/029_tags/roles/nginx/defaults/main.yml create mode 100644 examples/029_tags/roles/nginx/handlers/main.yml create mode 100644 examples/029_tags/roles/nginx/meta/main.yml create mode 100644 examples/029_tags/roles/nginx/tasks/main.yml create mode 100644 examples/029_tags/roles/nginx/templates/nginx.conf.j2 create mode 100644 examples/029_tags/roles/nginx/vars/main.yml create mode 100644 examples/029_tags/site.yml create mode 100644 examples/029_tags/webserver.yml create mode 100644 examples/030_windows/README.md create mode 100644 examples/030_windows/all-hosts create mode 100644 examples/030_windows/windows.yml create mode 100644 examples/031_aws/README.md create mode 100644 examples/031_aws/aws-example.yml create mode 100644 examples/032_azure/README.md create mode 100644 examples/032_azure/test_ansible_azure.yml create mode 100644 examples/extra_vagrant_files/Vagrantfile1804 create mode 100644 examples/extra_vagrant_files/Vagrantfile2004 create mode 100644 examples/extra_vagrant_files/Vagrantfile2104 create mode 100644 examples/extra_vagrant_files/VagrantfileDebian create mode 100755 examples/extra_vagrant_files/essential_box/Vagrantfile create mode 100644 examples/extra_vagrant_files/essential_box/install.sh create mode 100644 examples/extra_vagrant_files/multi_agent_setup/VagrantFile create mode 100644 examples/extra_vagrant_files/multi_agent_setup/install.sh create mode 100644 misc/all-hosts create mode 100644 misc/arquitectura-ansible.pdf create mode 100644 misc/nginx.conf diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..a242a50 --- /dev/null +++ b/.gitignore @@ -0,0 +1,78 @@ + +# Created by https://www.gitignore.io/api/macos,windows,vagrant,ansible,visualstudiocode + +### Ansible ### +*.retry + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Vagrant ### +# General +.vagrant/ + +# Log files (if you are creating logs in debug mode, uncomment this) +# *.logs + +### Vagrant Patch ### +*.box + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + + +# End of https://www.gitignore.io/api/macos,windows,vagrant,ansible,visualstudiocode \ No newline at end of file diff --git a/README.md b/README.md new file mode 100755 index 0000000..f2b5b31 --- /dev/null +++ b/README.md @@ -0,0 +1,229 @@ +[![Agile611](https://www.agile611.com/wp-content/uploads/2020/09/cropped-logo-header.png)](http://www.agile611.com/) + +# Agile611 Ansible Training + +This repository contains the code examples from the configuration management tools Ansible. It uses Vagrant to demonstrate these tools in practice. + +## Requirements + +For Ansible, it is necessary to install [Ansible](http://docs.ansible.com/ansible/intro_installation.html) on the host machine. This repo uses a Vagrant box based on Ubuntu and we will use APT to install ansible. + +## Example code + +Clone this repository with: + +```shell +git clone https://bitbucket.org/agile611/startusingansible.git +``` + +## Initial configuration + +* Start environment, we are going to need 4 ubuntu boxes (Ansible, Alfa, Bravo, Charlie) + +```shell +vagrant up +vagrant ssh ansible +``` + +* Starting workspace on ansible box + +```shell +vagrant@ansible$ sudo apt-get update +vagrant@ansible$ sudo apt-get install ansible -y +``` + +* Check your ansible installation checking the response from this command: + +```shell +vagrant@ansible$ ansible localhost -m setup +``` + +* Create a ssh key to connect to the webserver box just pressing enter to the requested questions: + +```shell +vagrant@ansible$ ssh-keygen +vagrant@ansible$ cat /home/vagrant/.ssh/id_rsa.pub +``` + +* Copy /home/vagrant/.ssh/id_rsa.pub into the clipboard on webserver box and execute: + +```shell +vagrant@alfa$ sudo -s +root@alfa# mkdir /root/.ssh +root@alfa# echo 'full contents of id_rsa.pub from ansible node' > /root/.ssh/authorized_keys +root@alfa# chmod 700 /root/.ssh +root@alfa# chmod 640 /root/.ssh/authorized_keys +``` + +* Check if you can connect to the webserver using the ssh key (not prompting a password). + +```shell +vagrant@ansible$ ssh root@192.168.0.2 +``` + +If you can connect, the initial config is done. Repeat this for Bravo and Charlie Vms. + +### IMPORTANT NOTE +Priority order from the config files: +* ANSIBLE_CONFIG (environment variable POSIX) +* ansible.cfg (current folder) +* ~/.ansible.cfg (user home from the executor) +* /etc/ansible/ansible.cfg (general file) + +## Test the environment + +* Setup Ansible Inventory on the ansible box, create the following folders: + +```shell +vagrant@ansible$ mkdir example_ansible +vagrant@ansible$ mkdir example_ansible/hosts +vagrant@ansible$ nano example_ansible/hosts/all +``` + +And on the file `hosts/all` and the following lines: + +```ini +[alfa] +192.168.0.2 + +[bravo] +192.168.0.3 +``` + +* Check if everything works executing the following command: + +```shell +vagrant@ansible$ cd example_ansible +vagrant@ansible$ ansible -i hosts -u root -m ping all +``` + +* What happen? + +The expected response is as follows: + +```shell +192.168.0.2 | SUCCESS => { + "changed": false, + "ping": "pong" +} +``` + +## Initial configuration and first yaml file + +* Create the file `request.yml` + +```yaml +--- +- hosts: webserver + + tasks: + - name: What system are you? + command: uname -a + register: info + + - name: print var + debug: var=info + + - name: print field + debug: var=info.stdout + + - name: What your name? + command: hostname + register: info + + - name: Give me your name + debug: var=info.stdout +``` + +* Execute the following command to show what tasks are we going to execute: + +```shell + +vagrant@ansible$ ansible-playbook -i hosts/all -u root request.yml --list-hosts --list-tasks +``` + +* Execute the following command to perform the tasks described before: + +```shell +vagrant@ansible$ ansible-playbook -i hosts/all -u root request.yml +``` + +### IMPORTANT NOTE + +The user root is used here for testing purposes and to make the environment easier to implement. Note that it is also the user which has the ssh key installed. You can add the ssh key to the user you in order to execute Ansible commands. + +### More examples (on examples folder) + +* 000_initial_examples +* 001_apt +* 002_become +* 003_with_items +* 004_services +* 005_stack_restart +* 006_notify_handlers +* 007_files_copy +* 008_pip +* 009_files +* 010_templates +* 011_lineinfile +* 012_mysql_management +* 013_wait_for +* 014_stack_status +* 015_roles +* 016_tasks_handlers +* 017_files_templates +* 018_site_yml +* 019_facts +* 020_defaults +* 021_vars +* 022_with_dict +* 023_selective_removal +* 024_continued +* 025_vars_files_group_vars +* 026_vault + +## Problems provisioning the box + +If you have problems provisioning the box, you can download it directly from [here](https://app.vagrantup.com/bento/boxes/ubuntu-20.04/versions/202112.19.0/providers/virtualbox.box) + +After that you need to know the path of the box and execute the following command: + +```shell + vagrant box add /The/Path/From/Your/Downloaded/box/bento-ubuntu-20-04.box --name bento/ubuntu-20.04 + vagrant init bento/ubuntu-20.04 +``` + +The init command creates a VagrantFile with your initial configuration. On the same folder where this Vagrantfile is, please execute to following command: + +```shell + vagrant up +``` + +After that, please connect to the box using the following command: + +```shell + vagrant ssh +``` + +If you get a terminal from the box, your environment is ready. + +## Common networking problems + +If you have proxies or VPNs running on your machine, it is possible that Vagrant is not able to provision your environment. + +Please check your connectivity before. + +## Support + +This tutorial is released into the public domain by [Agile611](http://www.agile611.com/) under Creative Commons Attribution-NonCommercial 4.0 International. + +[![License: CC BY-NC 4.0](https://img.shields.io/badge/License-CC_BY--NC_4.0-lightgrey.svg)](https://creativecommons.org/licenses/by-nc/4.0/) + + +This README file was originally written by [Guillem Hernández Sola](https://www.linkedin.com/in/guillemhs/) and is likewise released into the public domain. + +Please contact Agile611 for further details. + +* [Agile611](http://www.agile611.com/) +* Laureà Miró 309 +* 08950 Esplugues de Llobregat (Barcelona) \ No newline at end of file diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 0000000..9ea6272 --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,59 @@ +Vagrant.configure(2) do |config| + # Máquina de control para el agente Ansible + config.vm.define "ansible" do |ansible| + ansible.vm.box = "bento/ubuntu-24.04" # Imagen base Ubuntu 24.04 + ansible.vm.network "private_network", ip: "192.168.11.10" # IP privada + ansible.vm.hostname = "ansible" # Nombre de host + ansible.vm.synced_folder ".", "/home/vagrant/sync", type: "rsync" # Carpeta sincronizada + ansible.vm.provider "virtualbox" do |vb| + vb.memory = 512 # Memoria RAM asignada + vb.cpus = 1 # Número de CPUs asignadas + end + ansible.vm.provision :shell, :path => "ansible.sh" # Script de aprovisionamiento + end + + # Máquina para la base de datos + config.vm.define "database" do |database| + database.vm.box = "bento/ubuntu-24.04" + database.vm.network "private_network", ip: "192.168.11.20" + database.vm.hostname = "database" + database.vm.synced_folder ".", "/home/vagrant/sync", type: "rsync" + database.vm.provision :shell, :path => "ansible.sh" + database.vm.network "forwarded_port", guest: 80, host: 8081 # Redirección del puerto 80 + database.vm.network "forwarded_port", guest: 3306, host: 3306 # Redirección del puerto MySQL + database.vm.provider "virtualbox" do |vb| + vb.memory = 512 + vb.cpus = 1 + end + end + + # Máquina para el balanceador de carga + config.vm.define "loadbalancer" do |loadbalancer| + loadbalancer.vm.box = "bento/ubuntu-24.04" + loadbalancer.vm.network "private_network", ip: "192.168.11.30" + loadbalancer.vm.hostname = "loadbalancer" + loadbalancer.vm.synced_folder ".", "/home/vagrant/sync", type: "rsync" + loadbalancer.vm.provision :shell, :path => "ansible.sh" + loadbalancer.vm.network "forwarded_port", guest: 80, host: 8080 # Redirección del puerto 80 + loadbalancer.vm.network "forwarded_port", guest: 3306, host: 33061 # Redirección del puerto MySQL alternativo + loadbalancer.vm.provider "virtualbox" do |vb| + vb.memory = 512 + vb.cpus = 1 + end + end + + # Máquina para el servidor web + config.vm.define "webserver" do |webserver| + webserver.vm.box = "bento/ubuntu-24.04" + webserver.vm.network "private_network", ip: "192.168.11.40" + webserver.vm.hostname = "webserver" + webserver.vm.synced_folder ".", "/home/vagrant/sync", type: "rsync" + webserver.vm.provision :shell, :path => "ansible.sh" + webserver.vm.network "forwarded_port", guest: 80, host: 80 # Redirección del puerto 80 + webserver.vm.network "forwarded_port", guest: 3306, host: 33062 # Redirección del puerto MySQL alternativo + webserver.vm.provider "virtualbox" do |vb| + vb.memory = 512 + vb.cpus = 1 + end + end + end \ No newline at end of file diff --git a/ansible.sh b/ansible.sh new file mode 100644 index 0000000..8127e16 --- /dev/null +++ b/ansible.sh @@ -0,0 +1,6 @@ +apt-get update +apt install software-properties-common -y +apt-add-repository ppa:ansible/ansible +apt-get install ansible net-tools -y +# Add vagrant user to sudoers +echo "vagrant ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/vagrant \ No newline at end of file diff --git a/examples/000_example/group_vars/all b/examples/000_example/group_vars/all new file mode 100755 index 0000000..6f2aaac --- /dev/null +++ b/examples/000_example/group_vars/all @@ -0,0 +1,3 @@ +--- +httpd_port: 80 +ntpserver: 192.168.0.2 diff --git a/examples/000_example/group_vars/webservers b/examples/000_example/group_vars/webservers new file mode 100755 index 0000000..2514c06 --- /dev/null +++ b/examples/000_example/group_vars/webservers @@ -0,0 +1,7 @@ +iface: '{{ ansible_default_ipv4.interface }}' +apache_test_message: hello world +apache_max_keep_alive_requests: 113 +apache_docroot: /var/www/html +sites_available: /etc/httpd/conf/sites-available +sites_enabled: /etc/httpd/conf/sites-enabled +lameapp_version: 1 diff --git a/examples/000_example/hosts b/examples/000_example/hosts new file mode 100755 index 0000000..5e5fc9c --- /dev/null +++ b/examples/000_example/hosts @@ -0,0 +1,2 @@ +[webservers] +192.168.0.2 \ No newline at end of file diff --git a/examples/000_example/roles/apache/README.md b/examples/000_example/roles/apache/README.md new file mode 100755 index 0000000..225dd44 --- /dev/null +++ b/examples/000_example/roles/apache/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/000_example/roles/apache/defaults/main.yml b/examples/000_example/roles/apache/defaults/main.yml new file mode 100755 index 0000000..596f53c --- /dev/null +++ b/examples/000_example/roles/apache/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for apache \ No newline at end of file diff --git a/examples/000_example/roles/apache/handlers/main.yml b/examples/000_example/roles/apache/handlers/main.yml new file mode 100755 index 0000000..d65a488 --- /dev/null +++ b/examples/000_example/roles/apache/handlers/main.yml @@ -0,0 +1,4 @@ +--- +# handlers file for apache +- name: restart apache + service: name=apache2 state=restarted diff --git a/examples/000_example/roles/apache/meta/main.yml b/examples/000_example/roles/apache/meta/main.yml new file mode 100755 index 0000000..7223799 --- /dev/null +++ b/examples/000_example/roles/apache/meta/main.yml @@ -0,0 +1,57 @@ +galaxy_info: + author: your name + description: your description + company: your company (optional) + + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + + min_ansible_version: 1.2 + + # If this a Container Enabled role, provide the minimum Ansible Container version. + # min_ansible_container_version: + + # Optionally specify the branch Galaxy will use when accessing the GitHub + # repo for this role. During role install, if no tags are available, + # Galaxy will use this branch. During import Galaxy will access files on + # this branch. If Travis integration is configured, only notifications for this + # branch will be accepted. Otherwise, in all cases, the repo's default branch + # (usually master) will be used. + #github_branch: + + # + # platforms is a list of platforms, and each platform has a name and a list of versions. + # + # platforms: + # - name: Fedora + # versions: + # - all + # - 25 + # - name: SomePlatform + # versions: + # - all + # - 1.0 + # - 7 + # - 99.99 + + galaxy_tags: [] + # List tags for your role here, one per line. A tag is a keyword that describes + # and categorizes the role. Users find roles by searching for tags. Be sure to + # remove the '[]' above, if you add tags to this list. + # + # NOTE: A tag is limited to a single word comprised of alphanumeric characters. + # Maximum 20 tags per role. + +dependencies: [] + # List your role dependencies here, one per line. Be sure to remove the '[]' above, + # if you add dependencies to this list. \ No newline at end of file diff --git a/examples/000_example/roles/apache/tasks/main.yml b/examples/000_example/roles/apache/tasks/main.yml new file mode 100755 index 0000000..ec2922b --- /dev/null +++ b/examples/000_example/roles/apache/tasks/main.yml @@ -0,0 +1,19 @@ +--- +# tasks file for apache +- name: install apache + apt: name=apache2 state=present update-cache=yes + +- name: copy index.html + template: + src: index.html.j2 + dest: /var/www/html/index.html + +- name: copy httpd conf + template: + src: httpd.conf.j2 + dest: /etc/apache2 + notify: restart apache + +- name: start apache + service: + name: apache2 state=started enabled=yes diff --git a/examples/000_example/roles/apache/templates/httpd.conf.j2 b/examples/000_example/roles/apache/templates/httpd.conf.j2 new file mode 100755 index 0000000..dd2e0fb --- /dev/null +++ b/examples/000_example/roles/apache/templates/httpd.conf.j2 @@ -0,0 +1,225 @@ +# {{ ansible_managed }} + +# This is the main Apache server configuration file. It contains the +# configuration directives that give the server its instructions. +# See http://httpd.apache.org/docs/2.4/ for detailed information about +# the directives and /usr/share/doc/apache2/README.Debian about Debian specific +# hints. +# +# +# Summary of how the Apache 2 configuration works in Debian: +# The Apache 2 web server configuration in Debian is quite different to +# upstream's suggested way to configure the web server. This is because Debian's +# default Apache2 installation attempts to make adding and removing modules, +# virtual hosts, and extra configuration directives as flexible as possible, in +# order to make automating the changes and administering the server as easy as +# possible. + +ServerName {{ apache2_server_name|default(ansible_fqdn) }} + +# It is split into several files forming the configuration hierarchy outlined +# below, all located in the /etc/apache2/ directory: +# +# /etc/apache2/ +# |-- apache2.conf +# | `-- ports.conf +# |-- mods-enabled +# | |-- *.load +# | `-- *.conf +# |-- conf-enabled +# | `-- *.conf +# `-- sites-enabled +# `-- *.conf +# +# +# * apache2.conf is the main configuration file (this file). It puts the pieces +# together by including all remaining configuration files when starting up the +# web server. +# +# * ports.conf is always included from the main configuration file. It is +# supposed to determine listening ports for incoming connections which can be +# customized anytime. +# +# * Configuration files in the mods-enabled/, conf-enabled/ and sites-enabled/ +# directories contain particular configuration snippets which manage modules, +# global configuration fragments, or virtual host configurations, +# respectively. +# +# They are activated by symlinking available configuration files from their +# respective *-available/ counterparts. These should be managed by using our +# helpers a2enmod/a2dismod, a2ensite/a2dissite and a2enconf/a2disconf. See +# their respective man pages for detailed information. +# +# * The binary is called apache2. Due to the use of environment variables, in +# the default configuration, apache2 needs to be started/stopped with +# /etc/init.d/apache2 or apache2ctl. Calling /usr/bin/apache2 directly will not +# work with the default configuration. + + +# Global configuration +# + +# +# ServerRoot: The top of the directory tree under which the server's +# configuration, error, and log files are kept. +# +# NOTE! If you intend to place this on an NFS (or otherwise network) +# mounted filesystem then please read the Mutex documentation (available +# at ); +# you will save yourself a lot of trouble. +# +# Do NOT add a slash at the end of the directory path. +# +#ServerRoot "/etc/apache2" + +# +# The accept serialization lock file MUST BE STORED ON A LOCAL DISK. +# +Mutex file:${APACHE_LOCK_DIR} default + +# +# PidFile: The file in which the server should record its process +# identification number when it starts. +# This needs to be set in /etc/apache2/envvars +# +PidFile ${APACHE_PID_FILE} + +# +# Timeout: The number of seconds before receives and sends time out. +# +Timeout 300 + +# +# KeepAlive: Whether or not to allow persistent connections (more than +# one request per connection). Set to "Off" to deactivate. +# +KeepAlive On + +# +# MaxKeepAliveRequests: The maximum number of requests to allow +# during a persistent connection. Set to 0 to allow an unlimited amount. +# We recommend you leave this number high, for maximum performance. +# +MaxKeepAliveRequests 100 + +# +# KeepAliveTimeout: Number of seconds to wait for the next request from the +# same client on the same connection. +# +KeepAliveTimeout 5 + + +# These need to be set in /etc/apache2/envvars +User ${APACHE_RUN_USER} +Group ${APACHE_RUN_GROUP} + +# +# HostnameLookups: Log the names of clients or just their IP addresses +# e.g., www.apache.org (on) or 204.62.129.132 (off). +# The default is off because it'd be overall better for the net if people +# had to knowingly turn this feature on, since enabling it means that +# each client request will result in AT LEAST one lookup request to the +# nameserver. +# +HostnameLookups Off + +# ErrorLog: The location of the error log file. +# If you do not specify an ErrorLog directive within a +# container, error messages relating to that virtual host will be +# logged here. If you *do* define an error logfile for a +# container, that host's errors will be logged there and not here. +# +ErrorLog ${APACHE_LOG_DIR}/error.log + +# +# LogLevel: Control the severity of messages logged to the error_log. +# Available values: trace8, ..., trace1, debug, info, notice, warn, +# error, crit, alert, emerg. +# It is also possible to configure the log level for particular modules, e.g. +# "LogLevel info ssl:warn" +# +LogLevel warn + +# Include module configuration: +IncludeOptional mods-enabled/*.load +IncludeOptional mods-enabled/*.conf + +# Include list of ports to listen on +Include ports.conf + + +# Sets the default security model of the Apache2 HTTPD server. It does +# not allow access to the root filesystem outside of /usr/share and /var/www. +# The former is used by web applications packaged in Debian, +# the latter may be used for local directories served by the web server. If +# your system is serving content from a sub-directory in /srv you must allow +# access here, or in any related virtual host. + + Options FollowSymLinks + AllowOverride None + Require all denied + + + + AllowOverride None + Require all granted + + + + Options FollowSymLinks + AllowOverride None + Require all granted + + +# +# Options Indexes FollowSymLinks +# AllowOverride None +# Require all granted +# + + + + +# AccessFileName: The name of the file to look for in each directory +# for additional configuration directives. See also the AllowOverride +# directive. +# +AccessFileName .htaccess + +# +# The following lines prevent .htaccess and .htpasswd files from being +# viewed by Web clients. +# + + Require all denied + + + +# +# The following directives define some format nicknames for use with +# a CustomLog directive. +# +# These deviate from the Common Log Format definitions in that they use %O +# (the actual bytes sent including headers) instead of %b (the size of the +# requested file), because the latter makes it impossible to detect partial +# requests. +# +# Note that the use of %{X-Forwarded-For}i instead of %h is not recommended. +# Use mod_remoteip instead. +# +LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined +LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined +LogFormat "%h %l %u %t \"%r\" %>s %O" common +LogFormat "%{Referer}i -> %U" referer +LogFormat "%{User-agent}i" agent + +# Include of directories ignores editors' and dpkg's backup files, +# see README.Debian for details. + +# Include generic snippets of statements +IncludeOptional conf-enabled/*.conf + +# Include the virtual host configurations: +IncludeOptional sites-enabled/*.conf + +# vim: syntax=apache ts=4 sw=4 sts=4 sr noet \ No newline at end of file diff --git a/examples/000_example/roles/apache/templates/index.html.j2 b/examples/000_example/roles/apache/templates/index.html.j2 new file mode 100755 index 0000000..c8da5d9 --- /dev/null +++ b/examples/000_example/roles/apache/templates/index.html.j2 @@ -0,0 +1,6 @@ +{{ apache_test_message }} {{ ansible_distribution }} {{ ansible_distribution_version }}
+Current Host: {{ ansible_hostname }}
+Server list:
+{% for host in groups.webservers %} +{{ host }}
+{% endfor %} diff --git a/examples/000_example/roles/apache/tests/inventory b/examples/000_example/roles/apache/tests/inventory new file mode 100755 index 0000000..878877b --- /dev/null +++ b/examples/000_example/roles/apache/tests/inventory @@ -0,0 +1,2 @@ +localhost + diff --git a/examples/000_example/roles/apache/tests/test.yml b/examples/000_example/roles/apache/tests/test.yml new file mode 100755 index 0000000..6df1468 --- /dev/null +++ b/examples/000_example/roles/apache/tests/test.yml @@ -0,0 +1,5 @@ +--- +- hosts: webservers + remote_user: root + roles: + - apache \ No newline at end of file diff --git a/examples/000_example/roles/apache/vars/main.yml b/examples/000_example/roles/apache/vars/main.yml new file mode 100755 index 0000000..1173dc9 --- /dev/null +++ b/examples/000_example/roles/apache/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for apache \ No newline at end of file diff --git a/examples/000_example/roles/common/README.md b/examples/000_example/roles/common/README.md new file mode 100755 index 0000000..225dd44 --- /dev/null +++ b/examples/000_example/roles/common/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/000_example/roles/common/defaults/main.yml b/examples/000_example/roles/common/defaults/main.yml new file mode 100755 index 0000000..fa30550 --- /dev/null +++ b/examples/000_example/roles/common/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for common \ No newline at end of file diff --git a/examples/000_example/roles/common/handlers/main.yml b/examples/000_example/roles/common/handlers/main.yml new file mode 100755 index 0000000..4d78ef2 --- /dev/null +++ b/examples/000_example/roles/common/handlers/main.yml @@ -0,0 +1,4 @@ +--- +# handlers file for common +- name: restart ntp + service: name=ntpd state=restarted diff --git a/examples/000_example/roles/common/meta/main.yml b/examples/000_example/roles/common/meta/main.yml new file mode 100755 index 0000000..7223799 --- /dev/null +++ b/examples/000_example/roles/common/meta/main.yml @@ -0,0 +1,57 @@ +galaxy_info: + author: your name + description: your description + company: your company (optional) + + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + + min_ansible_version: 1.2 + + # If this a Container Enabled role, provide the minimum Ansible Container version. + # min_ansible_container_version: + + # Optionally specify the branch Galaxy will use when accessing the GitHub + # repo for this role. During role install, if no tags are available, + # Galaxy will use this branch. During import Galaxy will access files on + # this branch. If Travis integration is configured, only notifications for this + # branch will be accepted. Otherwise, in all cases, the repo's default branch + # (usually master) will be used. + #github_branch: + + # + # platforms is a list of platforms, and each platform has a name and a list of versions. + # + # platforms: + # - name: Fedora + # versions: + # - all + # - 25 + # - name: SomePlatform + # versions: + # - all + # - 1.0 + # - 7 + # - 99.99 + + galaxy_tags: [] + # List tags for your role here, one per line. A tag is a keyword that describes + # and categorizes the role. Users find roles by searching for tags. Be sure to + # remove the '[]' above, if you add tags to this list. + # + # NOTE: A tag is limited to a single word comprised of alphanumeric characters. + # Maximum 20 tags per role. + +dependencies: [] + # List your role dependencies here, one per line. Be sure to remove the '[]' above, + # if you add dependencies to this list. \ No newline at end of file diff --git a/examples/000_example/roles/common/tasks/main.yml b/examples/000_example/roles/common/tasks/main.yml new file mode 100755 index 0000000..293c480 --- /dev/null +++ b/examples/000_example/roles/common/tasks/main.yml @@ -0,0 +1,9 @@ +--- +# tasks file for common +- name: install epel repo + apt: + name: epel-release + state: present + +- include: selinux.yml +- include: ntp.yml diff --git a/examples/000_example/roles/common/tasks/ntp.yml b/examples/000_example/roles/common/tasks/ntp.yml new file mode 100755 index 0000000..f9e704e --- /dev/null +++ b/examples/000_example/roles/common/tasks/ntp.yml @@ -0,0 +1,15 @@ +--- +- name: install ntp + apt: + name: ntp + state: present + +- name: configure ntp file + template: + src: ntp.conf.j2 + dest: /etc/ntp.conf + +- name: start ntp + service: + name: ntpd + state: started diff --git a/examples/000_example/roles/common/tasks/selinux.yml b/examples/000_example/roles/common/tasks/selinux.yml new file mode 100755 index 0000000..7ef6a3c --- /dev/null +++ b/examples/000_example/roles/common/tasks/selinux.yml @@ -0,0 +1,13 @@ +--- +- name: install python bindings for SELinux + apt: + name: {{item}} + state: present + with_items: + - libselinux-python + - libsemanage-python + +- name: test to see if SELinux is running + command: getenforce + register: sestatus + changed_when: false diff --git a/examples/000_example/roles/common/templates/ntp.conf.j2 b/examples/000_example/roles/common/templates/ntp.conf.j2 new file mode 100755 index 0000000..e5c5483 --- /dev/null +++ b/examples/000_example/roles/common/templates/ntp.conf.j2 @@ -0,0 +1,7 @@ +driftfile /var/lib/ntp/drift + +restrict 127.0.0.1 +restrict -6 ::1 +server {{ ntpserver }} +includefile /etc/ntp/crypto/pw +keys /etc/ntp/keys diff --git a/examples/000_example/roles/common/tests/inventory b/examples/000_example/roles/common/tests/inventory new file mode 100755 index 0000000..878877b --- /dev/null +++ b/examples/000_example/roles/common/tests/inventory @@ -0,0 +1,2 @@ +localhost + diff --git a/examples/000_example/roles/common/tests/test.yml b/examples/000_example/roles/common/tests/test.yml new file mode 100755 index 0000000..8d24282 --- /dev/null +++ b/examples/000_example/roles/common/tests/test.yml @@ -0,0 +1,5 @@ +--- +- hosts: localhost + remote_user: root + roles: + - common \ No newline at end of file diff --git a/examples/000_example/roles/common/vars/main.yml b/examples/000_example/roles/common/vars/main.yml new file mode 100755 index 0000000..feaa92f --- /dev/null +++ b/examples/000_example/roles/common/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for common \ No newline at end of file diff --git a/examples/000_example/site.yml b/examples/000_example/site.yml new file mode 100755 index 0000000..d867915 --- /dev/null +++ b/examples/000_example/site.yml @@ -0,0 +1,7 @@ +--- +- name: install and start apache + hosts: webservers + remote_user: root + become: yes + roles: + - apache \ No newline at end of file diff --git a/examples/000_initial_example/001-hostname.yml b/examples/000_initial_example/001-hostname.yml new file mode 100644 index 0000000..130eef3 --- /dev/null +++ b/examples/000_initial_example/001-hostname.yml @@ -0,0 +1,4 @@ +--- + - hosts: all + tasks: + - command: hostname \ No newline at end of file diff --git a/examples/000_initial_example/hosts b/examples/000_initial_example/hosts new file mode 100644 index 0000000..6c37d55 --- /dev/null +++ b/examples/000_initial_example/hosts @@ -0,0 +1,19 @@ +[database] +192.168.0.2 +192.168.0.3 + +[loadbalancer] +192.168.0.3 +192.168.0.4 + +[webserver] +192.168.0.4 + +[alfa] +192.168.0.2 + +[bravo] +192.168.0.3 + +[charlie] +192.168.0.4 diff --git a/examples/000_initial_examples/etc_ansible_hosts b/examples/000_initial_examples/etc_ansible_hosts new file mode 100755 index 0000000..56f0156 --- /dev/null +++ b/examples/000_initial_examples/etc_ansible_hosts @@ -0,0 +1,12 @@ +[loadbalancer] +lb01 ansible_connection=local + +[webserver] +app01 ansible_connection=local +app02 ansible_connection=local + +[database] +db01 ansible_connection=local + +[control] +control ansible_connection=local diff --git a/examples/000_initial_examples/hostname.yml b/examples/000_initial_examples/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/000_initial_examples/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/000_initial_examples/your-first-hosts-file b/examples/000_initial_examples/your-first-hosts-file new file mode 100644 index 0000000..4861c2d --- /dev/null +++ b/examples/000_initial_examples/your-first-hosts-file @@ -0,0 +1,12 @@ +[loadbalancer] +lb01 + +[webserver] +app01 +app02 + +[database] +db01 + +[control] +control ansible_connection=local diff --git a/examples/001_apt/database.yml b/examples/001_apt/database.yml new file mode 100644 index 0000000..063f7d6 --- /dev/null +++ b/examples/001_apt/database.yml @@ -0,0 +1,5 @@ +--- +- hosts: database + tasks: + - name: install mysql-server + apt: name=mysql-server state=present update_cache=yes diff --git a/examples/001_apt/hostname.yml b/examples/001_apt/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/001_apt/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/001_apt/hosts b/examples/001_apt/hosts new file mode 100644 index 0000000..af525aa --- /dev/null +++ b/examples/001_apt/hosts @@ -0,0 +1,5 @@ +[database] +192.168.0.2 + +[loadbalancer] +192.168.0.3 \ No newline at end of file diff --git a/examples/001_apt/loadbalancer.yml b/examples/001_apt/loadbalancer.yml new file mode 100644 index 0000000..1639d97 --- /dev/null +++ b/examples/001_apt/loadbalancer.yml @@ -0,0 +1,5 @@ +--- +- hosts: loadbalancer + tasks: + - name: install nginx + apt: name=nginx state=present update_cache=yes diff --git a/examples/002_become/database.yml b/examples/002_become/database.yml new file mode 100644 index 0000000..82aa0f1 --- /dev/null +++ b/examples/002_become/database.yml @@ -0,0 +1,6 @@ +--- +- hosts: database + become: true + tasks: + - name: install mysql-server + apt: name=mysql-server state=present update_cache=yes diff --git a/examples/002_become/hostname.yml b/examples/002_become/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/002_become/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/002_become/hosts b/examples/002_become/hosts new file mode 100644 index 0000000..c4a9663 --- /dev/null +++ b/examples/002_become/hosts @@ -0,0 +1,8 @@ +[database] +192.168.0.2 + +[loadbalancer] +192.168.0.3 + +[webserver] +192.168.0.4 \ No newline at end of file diff --git a/examples/002_become/loadbalancer.yml b/examples/002_become/loadbalancer.yml new file mode 100644 index 0000000..50881f9 --- /dev/null +++ b/examples/002_become/loadbalancer.yml @@ -0,0 +1,6 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: install nginx + apt: name=nginx state=present update_cache=yes diff --git a/examples/003_with_items/database.yml b/examples/003_with_items/database.yml new file mode 100644 index 0000000..82aa0f1 --- /dev/null +++ b/examples/003_with_items/database.yml @@ -0,0 +1,6 @@ +--- +- hosts: database + become: true + tasks: + - name: install mysql-server + apt: name=mysql-server state=present update_cache=yes diff --git a/examples/003_with_items/hostname.yml b/examples/003_with_items/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/003_with_items/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/003_with_items/loadbalancer.yml b/examples/003_with_items/loadbalancer.yml new file mode 100644 index 0000000..50881f9 --- /dev/null +++ b/examples/003_with_items/loadbalancer.yml @@ -0,0 +1,6 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: install nginx + apt: name=nginx state=present update_cache=yes diff --git a/examples/003_with_items/webserver.yml b/examples/003_with_items/webserver.yml new file mode 100644 index 0000000..c6042e4 --- /dev/null +++ b/examples/003_with_items/webserver.yml @@ -0,0 +1,12 @@ +--- +- hosts: webserver + become: true + tasks: + - name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi-py3 + - python-pip-whl + - python3-virtualenv + diff --git a/examples/004_services/control.yml b/examples/004_services/control.yml new file mode 100644 index 0000000..999da09 --- /dev/null +++ b/examples/004_services/control.yml @@ -0,0 +1,8 @@ +--- +- hosts: control + become: true + tasks: + - name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - uacme diff --git a/examples/004_services/database.yml b/examples/004_services/database.yml new file mode 100644 index 0000000..06dd2cf --- /dev/null +++ b/examples/004_services/database.yml @@ -0,0 +1,9 @@ +--- +- hosts: database + become: true + tasks: + - name: install mysql-server + apt: name=mysql-server state=present update_cache=yes + + - name: ensure mysql started + service: name=mysql state=started enabled=yes diff --git a/examples/004_services/loadbalancer.yml b/examples/004_services/loadbalancer.yml new file mode 100644 index 0000000..435b161 --- /dev/null +++ b/examples/004_services/loadbalancer.yml @@ -0,0 +1,9 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: install nginx + apt: name=nginx state=present update_cache=yes + + - name: ensure nginx started + service: name=nginx state=started enabled=yes diff --git a/examples/004_services/playbooks/hostname.yml b/examples/004_services/playbooks/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/004_services/playbooks/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/004_services/playbooks/stack_restart.yml b/examples/004_services/playbooks/stack_restart.yml new file mode 100644 index 0000000..fbfb979 --- /dev/null +++ b/examples/004_services/playbooks/stack_restart.yml @@ -0,0 +1,18 @@ +--- +- hosts: database + become: true + tasks: + - name: reiniciar mysql + service: name=mysql state=restarted + +- hosts: loadbalancer + become: true + tasks: + - name: reiniciar nginx + service: name=nginx state=restarted + +- hosts: webserver + become: true + tasks: + - name: reiniciar apache + service: name=apache2 state=restarted diff --git a/examples/004_services/playbooks/stack_restart.yml.save b/examples/004_services/playbooks/stack_restart.yml.save new file mode 100644 index 0000000..6be67be --- /dev/null +++ b/examples/004_services/playbooks/stack_restart.yml.save @@ -0,0 +1,17 @@ +--- +- hosts: database + become: true + tasks: + - name: reiniciar mysql + service: name=mysql state=restarted + +- hosts: loadbalancer + become: true + tasks: + - name: reiniciar nginx + service: name=nginx state=restarted + +- hosts: webserver + become: true + tasks: + service: name=apache2 state=restarted diff --git a/examples/004_services/playbooks/stack_stopped.yml b/examples/004_services/playbooks/stack_stopped.yml new file mode 100644 index 0000000..88e2354 --- /dev/null +++ b/examples/004_services/playbooks/stack_stopped.yml @@ -0,0 +1,18 @@ +--- +- hosts: database + become: true + tasks: + - name: parar mysql + service: name=mysql state=stopped + +- hosts: loadbalancer + become: true + tasks: + - name: parar nginx + service: name=nginx state=stopped + +- hosts: webserver + become: true + tasks: + - name: parar apache + service: name=apache2 state=stopped diff --git a/examples/004_services/webserver.yml b/examples/004_services/webserver.yml new file mode 100644 index 0000000..b0d8b28 --- /dev/null +++ b/examples/004_services/webserver.yml @@ -0,0 +1,14 @@ +--- +- hosts: webserver + become: true + tasks: + - name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi-py3 + - python-pip-whl + - python3-virtualenv + + - name: ensure apache2 started + service: name=apache2 state=started enabled=yes diff --git a/examples/005_stack_restart/control.yml b/examples/005_stack_restart/control.yml new file mode 100644 index 0000000..999da09 --- /dev/null +++ b/examples/005_stack_restart/control.yml @@ -0,0 +1,8 @@ +--- +- hosts: control + become: true + tasks: + - name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - uacme diff --git a/examples/005_stack_restart/database.yml b/examples/005_stack_restart/database.yml new file mode 100644 index 0000000..0eac33a --- /dev/null +++ b/examples/005_stack_restart/database.yml @@ -0,0 +1,9 @@ +--- +- hosts: database + become: true + tasks: + - name: install mysql-server + apt: name=mysql-server state=present update_cache=yes + + - name: ensure mysql started + service: name=mysql state=started enabled=yes \ No newline at end of file diff --git a/examples/005_stack_restart/loadbalancer.yml b/examples/005_stack_restart/loadbalancer.yml new file mode 100644 index 0000000..435b161 --- /dev/null +++ b/examples/005_stack_restart/loadbalancer.yml @@ -0,0 +1,9 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: install nginx + apt: name=nginx state=present update_cache=yes + + - name: ensure nginx started + service: name=nginx state=started enabled=yes diff --git a/examples/005_stack_restart/playbook/hostname.yml b/examples/005_stack_restart/playbook/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/005_stack_restart/playbook/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/005_stack_restart/playbook/stack_restart.yml b/examples/005_stack_restart/playbook/stack_restart.yml new file mode 100644 index 0000000..a78d1b2 --- /dev/null +++ b/examples/005_stack_restart/playbook/stack_restart.yml @@ -0,0 +1,28 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started diff --git a/examples/005_stack_restart/webserver.yml b/examples/005_stack_restart/webserver.yml new file mode 100644 index 0000000..b0d8b28 --- /dev/null +++ b/examples/005_stack_restart/webserver.yml @@ -0,0 +1,14 @@ +--- +- hosts: webserver + become: true + tasks: + - name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi-py3 + - python-pip-whl + - python3-virtualenv + + - name: ensure apache2 started + service: name=apache2 state=started enabled=yes diff --git a/examples/006_notify_handlers/control.yml b/examples/006_notify_handlers/control.yml new file mode 100644 index 0000000..cab13d4 --- /dev/null +++ b/examples/006_notify_handlers/control.yml @@ -0,0 +1,8 @@ +--- +- hosts: control + become: true + tasks: + - name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - curl diff --git a/examples/006_notify_handlers/database.yml b/examples/006_notify_handlers/database.yml new file mode 100644 index 0000000..06dd2cf --- /dev/null +++ b/examples/006_notify_handlers/database.yml @@ -0,0 +1,9 @@ +--- +- hosts: database + become: true + tasks: + - name: install mysql-server + apt: name=mysql-server state=present update_cache=yes + + - name: ensure mysql started + service: name=mysql state=started enabled=yes diff --git a/examples/006_notify_handlers/demo/app/demo.py b/examples/006_notify_handlers/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/006_notify_handlers/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/006_notify_handlers/demo/app/demo.wsgi b/examples/006_notify_handlers/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/006_notify_handlers/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/006_notify_handlers/demo/app/requirements.txt b/examples/006_notify_handlers/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/006_notify_handlers/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/006_notify_handlers/demo/demo.conf b/examples/006_notify_handlers/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/006_notify_handlers/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/006_notify_handlers/loadbalancer.yml b/examples/006_notify_handlers/loadbalancer.yml new file mode 100644 index 0000000..435b161 --- /dev/null +++ b/examples/006_notify_handlers/loadbalancer.yml @@ -0,0 +1,9 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: install nginx + apt: name=nginx state=present update_cache=yes + + - name: ensure nginx started + service: name=nginx state=started enabled=yes diff --git a/examples/006_notify_handlers/playbook/hostname.yml b/examples/006_notify_handlers/playbook/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/006_notify_handlers/playbook/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/006_notify_handlers/playbook/stack_restart.yml b/examples/006_notify_handlers/playbook/stack_restart.yml new file mode 100644 index 0000000..a78d1b2 --- /dev/null +++ b/examples/006_notify_handlers/playbook/stack_restart.yml @@ -0,0 +1,28 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started diff --git a/examples/006_notify_handlers/webserver.yml b/examples/006_notify_handlers/webserver.yml new file mode 100644 index 0000000..6c7f752 --- /dev/null +++ b/examples/006_notify_handlers/webserver.yml @@ -0,0 +1,22 @@ +--- +- hosts: webserver + become: true + tasks: + - name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi-py3 + - python-pip-whl + - python3-virtualenv + + - name: ensure apache2 started + service: name=apache2 state=started enabled=yes + + - name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + + handlers: + - name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/007_files_copy/control.yml b/examples/007_files_copy/control.yml new file mode 100644 index 0000000..cab13d4 --- /dev/null +++ b/examples/007_files_copy/control.yml @@ -0,0 +1,8 @@ +--- +- hosts: control + become: true + tasks: + - name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - curl diff --git a/examples/007_files_copy/database.yml b/examples/007_files_copy/database.yml new file mode 100644 index 0000000..06dd2cf --- /dev/null +++ b/examples/007_files_copy/database.yml @@ -0,0 +1,9 @@ +--- +- hosts: database + become: true + tasks: + - name: install mysql-server + apt: name=mysql-server state=present update_cache=yes + + - name: ensure mysql started + service: name=mysql state=started enabled=yes diff --git a/examples/007_files_copy/demo/app/demo.py b/examples/007_files_copy/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/007_files_copy/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/007_files_copy/demo/app/demo.wsgi b/examples/007_files_copy/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/007_files_copy/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/007_files_copy/demo/app/requirements.txt b/examples/007_files_copy/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/007_files_copy/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/007_files_copy/demo/demo.conf b/examples/007_files_copy/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/007_files_copy/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/007_files_copy/loadbalancer.yml b/examples/007_files_copy/loadbalancer.yml new file mode 100644 index 0000000..435b161 --- /dev/null +++ b/examples/007_files_copy/loadbalancer.yml @@ -0,0 +1,9 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: install nginx + apt: name=nginx state=present update_cache=yes + + - name: ensure nginx started + service: name=nginx state=started enabled=yes diff --git a/examples/007_files_copy/playbook/hostname.yml b/examples/007_files_copy/playbook/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/007_files_copy/playbook/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/007_files_copy/playbook/stack_restart.yml b/examples/007_files_copy/playbook/stack_restart.yml new file mode 100644 index 0000000..a78d1b2 --- /dev/null +++ b/examples/007_files_copy/playbook/stack_restart.yml @@ -0,0 +1,28 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started diff --git a/examples/007_files_copy/webserver.yml b/examples/007_files_copy/webserver.yml new file mode 100644 index 0000000..26ef088 --- /dev/null +++ b/examples/007_files_copy/webserver.yml @@ -0,0 +1,30 @@ +--- +- hosts: webserver + become: true + tasks: + - name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi-py3 + - python-pip-whl + - python3-virtualenv + + - name: ensure apache2 started + service: name=apache2 state=started enabled=yes + + - name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + + - name: copy demo app source + copy: src=demo/app/ dest=/var/www/demo mode=0755 + notify: restart apache2 + + - name: copy apache virtual host config + copy: src=demo/demo.conf dest=/etc/apache2/sites-available mode=0755 + notify: restart apache2 + + handlers: + - name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/008_pip/control.yml b/examples/008_pip/control.yml new file mode 100644 index 0000000..cab13d4 --- /dev/null +++ b/examples/008_pip/control.yml @@ -0,0 +1,8 @@ +--- +- hosts: control + become: true + tasks: + - name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - curl diff --git a/examples/008_pip/database.yml b/examples/008_pip/database.yml new file mode 100644 index 0000000..06dd2cf --- /dev/null +++ b/examples/008_pip/database.yml @@ -0,0 +1,9 @@ +--- +- hosts: database + become: true + tasks: + - name: install mysql-server + apt: name=mysql-server state=present update_cache=yes + + - name: ensure mysql started + service: name=mysql state=started enabled=yes diff --git a/examples/008_pip/demo/app/demo.py b/examples/008_pip/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/008_pip/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/008_pip/demo/app/demo.wsgi b/examples/008_pip/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/008_pip/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/008_pip/demo/app/requirements.txt b/examples/008_pip/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/008_pip/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/008_pip/demo/demo.conf b/examples/008_pip/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/008_pip/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/008_pip/loadbalancer.yml b/examples/008_pip/loadbalancer.yml new file mode 100644 index 0000000..435b161 --- /dev/null +++ b/examples/008_pip/loadbalancer.yml @@ -0,0 +1,9 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: install nginx + apt: name=nginx state=present update_cache=yes + + - name: ensure nginx started + service: name=nginx state=started enabled=yes diff --git a/examples/008_pip/playbook/hostname.yml b/examples/008_pip/playbook/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/008_pip/playbook/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/008_pip/playbook/stack_restart.yml b/examples/008_pip/playbook/stack_restart.yml new file mode 100644 index 0000000..a78d1b2 --- /dev/null +++ b/examples/008_pip/playbook/stack_restart.yml @@ -0,0 +1,28 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started diff --git a/examples/008_pip/webserver.yml b/examples/008_pip/webserver.yml new file mode 100644 index 0000000..9c77cb5 --- /dev/null +++ b/examples/008_pip/webserver.yml @@ -0,0 +1,34 @@ +--- +- hosts: webserver + become: true + tasks: + - name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi-py3 + - python-pip-whl + - python3-virtualenv + + - name: ensure apache2 started + service: name=apache2 state=started enabled=yes + + - name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + + - name: copy demo app source + copy: src=demo/app/ dest=/var/www/demo mode=0755 + notify: restart apache2 + + - name: copy apache virtual host config + copy: src=demo/demo.conf dest=/etc/apache2/sites-available mode=0755 + notify: restart apache2 + + - name: setup python virtualenv + pip: requirements=/var/www/demo/requirements.txt virtualenv=/var/www/demo/.venv + notify: restart apache2 + + handlers: + - name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/009_files/control.yml b/examples/009_files/control.yml new file mode 100644 index 0000000..cab13d4 --- /dev/null +++ b/examples/009_files/control.yml @@ -0,0 +1,8 @@ +--- +- hosts: control + become: true + tasks: + - name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - curl diff --git a/examples/009_files/database.yml b/examples/009_files/database.yml new file mode 100644 index 0000000..06dd2cf --- /dev/null +++ b/examples/009_files/database.yml @@ -0,0 +1,9 @@ +--- +- hosts: database + become: true + tasks: + - name: install mysql-server + apt: name=mysql-server state=present update_cache=yes + + - name: ensure mysql started + service: name=mysql state=started enabled=yes diff --git a/examples/009_files/demo/app/demo.py b/examples/009_files/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/009_files/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/009_files/demo/app/demo.wsgi b/examples/009_files/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/009_files/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/009_files/demo/app/requirements.txt b/examples/009_files/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/009_files/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/009_files/demo/demo.conf b/examples/009_files/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/009_files/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/009_files/loadbalancer.yml b/examples/009_files/loadbalancer.yml new file mode 100644 index 0000000..435b161 --- /dev/null +++ b/examples/009_files/loadbalancer.yml @@ -0,0 +1,9 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: install nginx + apt: name=nginx state=present update_cache=yes + + - name: ensure nginx started + service: name=nginx state=started enabled=yes diff --git a/examples/009_files/playbook/hostname.yml b/examples/009_files/playbook/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/009_files/playbook/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/009_files/playbook/stack_restart.yml b/examples/009_files/playbook/stack_restart.yml new file mode 100644 index 0000000..a78d1b2 --- /dev/null +++ b/examples/009_files/playbook/stack_restart.yml @@ -0,0 +1,28 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started diff --git a/examples/009_files/webserver.yml b/examples/009_files/webserver.yml new file mode 100644 index 0000000..c73bf4f --- /dev/null +++ b/examples/009_files/webserver.yml @@ -0,0 +1,42 @@ +--- +- hosts: webserver + become: true + tasks: + - name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi-py3 + - python-pip-whl + - python3-virtualenv + + - name: ensure apache2 started + service: name=apache2 state=started enabled=yes + + - name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + + - name: copy demo app source + copy: src=demo/app/ dest=/var/www/demo mode=0755 + notify: restart apache2 + + - name: copy apache virtual host config + copy: src=demo/demo.conf dest=/etc/apache2/sites-available mode=0755 + notify: restart apache2 + + - name: setup python virtualenv + pip: requirements=/var/www/demo/requirements.txt virtualenv=/var/www/demo/.venv + notify: restart apache2 + + - name: de-activate default apache site + file: path=/etc/apache2/sites-enabled/000-default.conf state=absent + notify: restart apache2 + + - name: activate demo apache site + file: src=/etc/apache2/sites-available/demo.conf dest=/etc/apache2/sites-enabled/demo.conf state=link + notify: restart apache2 + + handlers: + - name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/010_templates/control.yml b/examples/010_templates/control.yml new file mode 100644 index 0000000..cab13d4 --- /dev/null +++ b/examples/010_templates/control.yml @@ -0,0 +1,8 @@ +--- +- hosts: control + become: true + tasks: + - name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - curl diff --git a/examples/010_templates/database.yml b/examples/010_templates/database.yml new file mode 100644 index 0000000..06dd2cf --- /dev/null +++ b/examples/010_templates/database.yml @@ -0,0 +1,9 @@ +--- +- hosts: database + become: true + tasks: + - name: install mysql-server + apt: name=mysql-server state=present update_cache=yes + + - name: ensure mysql started + service: name=mysql state=started enabled=yes diff --git a/examples/010_templates/demo/app/demo.py b/examples/010_templates/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/010_templates/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/010_templates/demo/app/demo.wsgi b/examples/010_templates/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/010_templates/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/010_templates/demo/app/requirements.txt b/examples/010_templates/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/010_templates/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/010_templates/demo/demo.conf b/examples/010_templates/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/010_templates/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/010_templates/loadbalancer.yml b/examples/010_templates/loadbalancer.yml new file mode 100644 index 0000000..835a4bc --- /dev/null +++ b/examples/010_templates/loadbalancer.yml @@ -0,0 +1,25 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: install nginx + apt: name=nginx state=present update_cache=yes + + - name: ensure nginx started + service: name=nginx state=started enabled=yes + + - name: configure nginx site + template: src=templates/nginx.conf.j2 dest=/etc/nginx/sites-available/demo mode=0644 + notify: restart nginx + + - name: de-activate default nginx site + file: path=/etc/nginx/sites-enabled/default state=absent + notify: restart nginx + + - name: activate demo nginx site + file: src=/etc/nginx/sites-available/demo dest=/etc/nginx/sites-enabled/demo state=link + notify: restart nginx + + handlers: + - name: restart nginx + service: name=nginx state=restarted diff --git a/examples/010_templates/playbook/hostname.yml b/examples/010_templates/playbook/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/010_templates/playbook/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/010_templates/playbook/loadbalancer-default-nginx.yml b/examples/010_templates/playbook/loadbalancer-default-nginx.yml new file mode 100644 index 0000000..d5d037c --- /dev/null +++ b/examples/010_templates/playbook/loadbalancer-default-nginx.yml @@ -0,0 +1,18 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: ensure nginx started + service: name=nginx state=started enabled=yes + + - name: de-activate demo nginx site + file: path=/etc/nginx/sites-enabled/demo state=absent + notify: restart nginx + + - name: activate default nginx site + file: src=/etc/nginx/sites-available/default dest=/etc/nginx/sites-enabled/default state=link + notify: restart nginx + + handlers: + - name: restart nginx + service: name=nginx state=restarted diff --git a/examples/010_templates/playbook/nginx-default.conf b/examples/010_templates/playbook/nginx-default.conf new file mode 100644 index 0000000..4d4c865 --- /dev/null +++ b/examples/010_templates/playbook/nginx-default.conf @@ -0,0 +1,137 @@ + +#user nobody; +#Defines which Linux system user will own and run the Nginx server + +worker_processes 1; +#Referes to single threaded process. Generally set to be equal to the number of CPUs or cores. + +#error_log logs/error.log; #error_log logs/error.log notice; +#Specifies the file where server logs. + +#pid logs/nginx.pid; +#nginx will write its master process ID(PID). + +events { + worker_connections 1024; + # worker_processes and worker_connections allows you to calculate maxclients value: + # max_clients = worker_processes * worker_connections +} + + +http { + include mime.types; + # anything written in /opt/nginx/conf/mime.types is interpreted as if written inside the http { } block + + default_type application/octet-stream; + # + + #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + # '$status $body_bytes_sent "$http_referer" ' + # '"$http_user_agent" "$http_x_forwarded_for"'; + + #access_log logs/access.log main; + + sendfile on; + # If serving locally stored static files, sendfile is essential to speed up the server, + # But if using as reverse proxy one can deactivate it + + #tcp_nopush on; + # works opposite to tcp_nodelay. Instead of optimizing delays, it optimizes the amount of data sent at once. + + #keepalive_timeout 0; + keepalive_timeout 65; + # timeout during which a keep-alive client connection will stay open. + + #gzip on; + # tells the server to use on-the-fly gzip compression. + + server { + # You would want to make a separate file with its own server block for each virtual domain + # on your server and then include them. + listen 80; + #tells Nginx the hostname and the TCP port where it should listen for HTTP connections. + # listen 80; is equivalent to listen *:80; + + server_name localhost; + # lets you doname-based virtual hosting + + #charset koi8-r; + + #access_log logs/host.access.log main; + + location / { + #The location setting lets you configure how nginx responds to requests for resources within the server. + root html; + index index.html index.htm; + } + + #error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root html; + } + + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} + } + + + # another virtual host using mix of IP-, name-, and port-based configuration + # + #server { + # listen 8000; + # listen somename:8080; + # server_name somename alias another.alias; + + # location / { + # root html; + # index index.html index.htm; + # } + #} + + + # HTTPS server + # + #server { + # listen 443 ssl; + # server_name localhost; + + # ssl_certificate cert.pem; + # ssl_certificate_key cert.key; + + # ssl_session_cache shared:SSL:1m; + # ssl_session_timeout 5m; + + # ssl_ciphers HIGH:!aNULL:!MD5; + # ssl_prefer_server_ciphers on; + + # location / { + # root html; + # index index.html index.htm; + # } + #} + +} diff --git a/examples/010_templates/playbook/nginx-default.html b/examples/010_templates/playbook/nginx-default.html new file mode 100644 index 0000000..10e3638 --- /dev/null +++ b/examples/010_templates/playbook/nginx-default.html @@ -0,0 +1,36 @@ + + + +Welcome to nginx on Debian! + + + +

Welcome to nginx on Debian!

+

If you see this page, the nginx web server is successfully installed and +working on Debian. Further configuration is required.

+ +

For online documentation and support please refer to +nginx.org

+ +

+ Please use the reportbug tool to report bugs in the + nginx package with Debian. However, check existing + bug reports before reporting a new bug. +

+ +

Thank you for using debian and nginx.

+ +

BackupPi_2

+

monitor

+

say

+

Set DateTime

+ + + diff --git a/examples/010_templates/playbook/stack_restart.yml b/examples/010_templates/playbook/stack_restart.yml new file mode 100644 index 0000000..a78d1b2 --- /dev/null +++ b/examples/010_templates/playbook/stack_restart.yml @@ -0,0 +1,28 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started diff --git a/examples/010_templates/templates/nginx.conf.j2 b/examples/010_templates/templates/nginx.conf.j2 new file mode 100644 index 0000000..4b477b6 --- /dev/null +++ b/examples/010_templates/templates/nginx.conf.j2 @@ -0,0 +1,13 @@ +upstream demo { +{% for server in groups.webserver %} + server {{ server }}; +{% endfor %} +} + +server { + listen 80; + + location / { + proxy_pass http://demo; + } +} diff --git a/examples/010_templates/webserver.yml b/examples/010_templates/webserver.yml new file mode 100644 index 0000000..c73bf4f --- /dev/null +++ b/examples/010_templates/webserver.yml @@ -0,0 +1,42 @@ +--- +- hosts: webserver + become: true + tasks: + - name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi-py3 + - python-pip-whl + - python3-virtualenv + + - name: ensure apache2 started + service: name=apache2 state=started enabled=yes + + - name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + + - name: copy demo app source + copy: src=demo/app/ dest=/var/www/demo mode=0755 + notify: restart apache2 + + - name: copy apache virtual host config + copy: src=demo/demo.conf dest=/etc/apache2/sites-available mode=0755 + notify: restart apache2 + + - name: setup python virtualenv + pip: requirements=/var/www/demo/requirements.txt virtualenv=/var/www/demo/.venv + notify: restart apache2 + + - name: de-activate default apache site + file: path=/etc/apache2/sites-enabled/000-default.conf state=absent + notify: restart apache2 + + - name: activate demo apache site + file: src=/etc/apache2/sites-available/demo.conf dest=/etc/apache2/sites-enabled/demo.conf state=link + notify: restart apache2 + + handlers: + - name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/011_lineinfile/control.yml b/examples/011_lineinfile/control.yml new file mode 100644 index 0000000..cab13d4 --- /dev/null +++ b/examples/011_lineinfile/control.yml @@ -0,0 +1,8 @@ +--- +- hosts: control + become: true + tasks: + - name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - curl diff --git a/examples/011_lineinfile/database.yml b/examples/011_lineinfile/database.yml new file mode 100644 index 0000000..4650513 --- /dev/null +++ b/examples/011_lineinfile/database.yml @@ -0,0 +1,15 @@ +--- +- hosts: database + become: true + tasks: + - name: Remove packages for a VM problem using mysql + command: apt-get -y purge mysql-server mysql-client mysql-common + + - name: install mysql-server + apt: name=mysql-server state=present update_cache=yes + + - name: ensure mysql started + service: name=mysql state=started enabled=yes + + - name: ensure mysql listening on all ports + lineinfile: dest=/etc/mysql/my.cnf regexp=^bind-address line="bind-address = 0.0.0.0" \ No newline at end of file diff --git a/examples/011_lineinfile/demo/app/demo.py b/examples/011_lineinfile/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/011_lineinfile/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/011_lineinfile/demo/app/demo.wsgi b/examples/011_lineinfile/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/011_lineinfile/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/011_lineinfile/demo/app/requirements.txt b/examples/011_lineinfile/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/011_lineinfile/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/011_lineinfile/demo/demo.conf b/examples/011_lineinfile/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/011_lineinfile/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/011_lineinfile/loadbalancer.yml b/examples/011_lineinfile/loadbalancer.yml new file mode 100644 index 0000000..835a4bc --- /dev/null +++ b/examples/011_lineinfile/loadbalancer.yml @@ -0,0 +1,25 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: install nginx + apt: name=nginx state=present update_cache=yes + + - name: ensure nginx started + service: name=nginx state=started enabled=yes + + - name: configure nginx site + template: src=templates/nginx.conf.j2 dest=/etc/nginx/sites-available/demo mode=0644 + notify: restart nginx + + - name: de-activate default nginx site + file: path=/etc/nginx/sites-enabled/default state=absent + notify: restart nginx + + - name: activate demo nginx site + file: src=/etc/nginx/sites-available/demo dest=/etc/nginx/sites-enabled/demo state=link + notify: restart nginx + + handlers: + - name: restart nginx + service: name=nginx state=restarted diff --git a/examples/011_lineinfile/playbook/hostname.yml b/examples/011_lineinfile/playbook/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/011_lineinfile/playbook/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/011_lineinfile/playbook/stack_restart.yml b/examples/011_lineinfile/playbook/stack_restart.yml new file mode 100644 index 0000000..a78d1b2 --- /dev/null +++ b/examples/011_lineinfile/playbook/stack_restart.yml @@ -0,0 +1,28 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started diff --git a/examples/011_lineinfile/templates/nginx.conf.j2 b/examples/011_lineinfile/templates/nginx.conf.j2 new file mode 100644 index 0000000..4b477b6 --- /dev/null +++ b/examples/011_lineinfile/templates/nginx.conf.j2 @@ -0,0 +1,13 @@ +upstream demo { +{% for server in groups.webserver %} + server {{ server }}; +{% endfor %} +} + +server { + listen 80; + + location / { + proxy_pass http://demo; + } +} diff --git a/examples/011_lineinfile/webserver.yml b/examples/011_lineinfile/webserver.yml new file mode 100644 index 0000000..c73bf4f --- /dev/null +++ b/examples/011_lineinfile/webserver.yml @@ -0,0 +1,42 @@ +--- +- hosts: webserver + become: true + tasks: + - name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi-py3 + - python-pip-whl + - python3-virtualenv + + - name: ensure apache2 started + service: name=apache2 state=started enabled=yes + + - name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + + - name: copy demo app source + copy: src=demo/app/ dest=/var/www/demo mode=0755 + notify: restart apache2 + + - name: copy apache virtual host config + copy: src=demo/demo.conf dest=/etc/apache2/sites-available mode=0755 + notify: restart apache2 + + - name: setup python virtualenv + pip: requirements=/var/www/demo/requirements.txt virtualenv=/var/www/demo/.venv + notify: restart apache2 + + - name: de-activate default apache site + file: path=/etc/apache2/sites-enabled/000-default.conf state=absent + notify: restart apache2 + + - name: activate demo apache site + file: src=/etc/apache2/sites-available/demo.conf dest=/etc/apache2/sites-enabled/demo.conf state=link + notify: restart apache2 + + handlers: + - name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/012_mysql_management/.clean-database.yml.swp b/examples/012_mysql_management/.clean-database.yml.swp new file mode 100644 index 0000000000000000000000000000000000000000..af4f0fd9f3d1e54fec4defae7b9e08ea1e336396 GIT binary patch literal 1024 zcmYc?$V<%2S1{4DU_b%8L>U;$64Q$k^GZ;}v2hafiZhdPQn5*)h$ZKwCg$m;B$gy5 XB^IaZRp#cPNRM(xLtr!n=o|t7k-HFn literal 0 HcmV?d00001 diff --git a/examples/012_mysql_management/control.yml b/examples/012_mysql_management/control.yml new file mode 100644 index 0000000..cab13d4 --- /dev/null +++ b/examples/012_mysql_management/control.yml @@ -0,0 +1,8 @@ +--- +- hosts: control + become: true + tasks: + - name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - curl diff --git a/examples/012_mysql_management/database.yml b/examples/012_mysql_management/database.yml new file mode 100644 index 0000000..87ef6cf --- /dev/null +++ b/examples/012_mysql_management/database.yml @@ -0,0 +1,21 @@ +--- +- hosts: database + become: true + tasks: + - name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python3-mysqldb + - mysql-server + + - name: ensure mysql started + service: name=mysql state=started enabled=yes + + - name: ensure mysql listening on all ports + lineinfile: dest=/etc/mysql/my.cnf regexp=^bind-address line="bind-address = 0.0.0.0" + + - name: create demo database + mysql_db: name=demo state=present + + - name: create demo user + mysql_user: name=demo password=demo priv=demo.*:ALL host='%' state=present diff --git a/examples/012_mysql_management/demo/app/demo.py b/examples/012_mysql_management/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/012_mysql_management/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/012_mysql_management/demo/app/demo.wsgi b/examples/012_mysql_management/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/012_mysql_management/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/012_mysql_management/demo/app/requirements.txt b/examples/012_mysql_management/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/012_mysql_management/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/012_mysql_management/demo/demo.conf b/examples/012_mysql_management/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/012_mysql_management/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/012_mysql_management/loadbalancer.yml b/examples/012_mysql_management/loadbalancer.yml new file mode 100644 index 0000000..835a4bc --- /dev/null +++ b/examples/012_mysql_management/loadbalancer.yml @@ -0,0 +1,25 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: install nginx + apt: name=nginx state=present update_cache=yes + + - name: ensure nginx started + service: name=nginx state=started enabled=yes + + - name: configure nginx site + template: src=templates/nginx.conf.j2 dest=/etc/nginx/sites-available/demo mode=0644 + notify: restart nginx + + - name: de-activate default nginx site + file: path=/etc/nginx/sites-enabled/default state=absent + notify: restart nginx + + - name: activate demo nginx site + file: src=/etc/nginx/sites-available/demo dest=/etc/nginx/sites-enabled/demo state=link + notify: restart nginx + + handlers: + - name: restart nginx + service: name=nginx state=restarted diff --git a/examples/012_mysql_management/playbook/clean-database.yml b/examples/012_mysql_management/playbook/clean-database.yml new file mode 100644 index 0000000..189e817 --- /dev/null +++ b/examples/012_mysql_management/playbook/clean-database.yml @@ -0,0 +1,9 @@ +--- +- hosts: database + become: true + tasks: + - name: create demo database + mysql_db: name=demo state=absent + + - name: create demo user + mysql_user: name=demo password=demo priv=demo.*:ALL host='%' state=absent diff --git a/examples/012_mysql_management/playbook/hostname.yml b/examples/012_mysql_management/playbook/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/012_mysql_management/playbook/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/012_mysql_management/playbook/stack_restart.yml b/examples/012_mysql_management/playbook/stack_restart.yml new file mode 100644 index 0000000..f7ddec8 --- /dev/null +++ b/examples/012_mysql_management/playbook/stack_restart.yml @@ -0,0 +1,28 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + +# Restart mysql - commented problem with the VMs +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started diff --git a/examples/012_mysql_management/templates/nginx.conf.j2 b/examples/012_mysql_management/templates/nginx.conf.j2 new file mode 100644 index 0000000..4b477b6 --- /dev/null +++ b/examples/012_mysql_management/templates/nginx.conf.j2 @@ -0,0 +1,13 @@ +upstream demo { +{% for server in groups.webserver %} + server {{ server }}; +{% endfor %} +} + +server { + listen 80; + + location / { + proxy_pass http://demo; + } +} diff --git a/examples/012_mysql_management/webserver.yml b/examples/012_mysql_management/webserver.yml new file mode 100644 index 0000000..c73bf4f --- /dev/null +++ b/examples/012_mysql_management/webserver.yml @@ -0,0 +1,42 @@ +--- +- hosts: webserver + become: true + tasks: + - name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi-py3 + - python-pip-whl + - python3-virtualenv + + - name: ensure apache2 started + service: name=apache2 state=started enabled=yes + + - name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + + - name: copy demo app source + copy: src=demo/app/ dest=/var/www/demo mode=0755 + notify: restart apache2 + + - name: copy apache virtual host config + copy: src=demo/demo.conf dest=/etc/apache2/sites-available mode=0755 + notify: restart apache2 + + - name: setup python virtualenv + pip: requirements=/var/www/demo/requirements.txt virtualenv=/var/www/demo/.venv + notify: restart apache2 + + - name: de-activate default apache site + file: path=/etc/apache2/sites-enabled/000-default.conf state=absent + notify: restart apache2 + + - name: activate demo apache site + file: src=/etc/apache2/sites-available/demo.conf dest=/etc/apache2/sites-enabled/demo.conf state=link + notify: restart apache2 + + handlers: + - name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/013_wait_for/control.yml b/examples/013_wait_for/control.yml new file mode 100644 index 0000000..cab13d4 --- /dev/null +++ b/examples/013_wait_for/control.yml @@ -0,0 +1,8 @@ +--- +- hosts: control + become: true + tasks: + - name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - curl diff --git a/examples/013_wait_for/database.yml b/examples/013_wait_for/database.yml new file mode 100644 index 0000000..bf89f49 --- /dev/null +++ b/examples/013_wait_for/database.yml @@ -0,0 +1,28 @@ +--- +- hosts: database + become: true + tasks: + - name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python3-mysqldb + + - name: install mysql-server + apt: name=mysql-server state=present update_cache=yes + + - name: ensure mysql started + service: name=mysql state=started enabled=yes + + - name: ensure mysql listening on all ports + lineinfile: dest=/etc/mysql/my.cnf regexp=^bind-address line="bind-address = 0.0.0.0" + notify: restart mysql + + - name: create demo database + mysql_db: name=demo state=present + + - name: create demo user + mysql_user: name=demo password=demo priv=demo.*:ALL host='%' state=present + + handlers: + - name: restart mysql + service: name=mysql state=restarted diff --git a/examples/013_wait_for/demo/app/demo.py b/examples/013_wait_for/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/013_wait_for/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/013_wait_for/demo/app/demo.wsgi b/examples/013_wait_for/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/013_wait_for/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/013_wait_for/demo/app/requirements.txt b/examples/013_wait_for/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/013_wait_for/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/013_wait_for/demo/demo.conf b/examples/013_wait_for/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/013_wait_for/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/013_wait_for/loadbalancer.yml b/examples/013_wait_for/loadbalancer.yml new file mode 100644 index 0000000..835a4bc --- /dev/null +++ b/examples/013_wait_for/loadbalancer.yml @@ -0,0 +1,25 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: install nginx + apt: name=nginx state=present update_cache=yes + + - name: ensure nginx started + service: name=nginx state=started enabled=yes + + - name: configure nginx site + template: src=templates/nginx.conf.j2 dest=/etc/nginx/sites-available/demo mode=0644 + notify: restart nginx + + - name: de-activate default nginx site + file: path=/etc/nginx/sites-enabled/default state=absent + notify: restart nginx + + - name: activate demo nginx site + file: src=/etc/nginx/sites-available/demo dest=/etc/nginx/sites-enabled/demo state=link + notify: restart nginx + + handlers: + - name: restart nginx + service: name=nginx state=restarted diff --git a/examples/013_wait_for/playbook/hostname.yml b/examples/013_wait_for/playbook/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/013_wait_for/playbook/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/013_wait_for/playbook/stack_restart.yml b/examples/013_wait_for/playbook/stack_restart.yml new file mode 100644 index 0000000..b55de3d --- /dev/null +++ b/examples/013_wait_for/playbook/stack_restart.yml @@ -0,0 +1,33 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + - wait_for: port=80 state=drained + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + - wait_for: port=80 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + - wait_for: port=3306 state=started + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + - wait_for: port=80 + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started + - wait_for: port=80 diff --git a/examples/013_wait_for/playbook/stack_status.yml b/examples/013_wait_for/playbook/stack_status.yml new file mode 100644 index 0000000..01df995 --- /dev/null +++ b/examples/013_wait_for/playbook/stack_status.yml @@ -0,0 +1,27 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: verify nginx service + command: service nginx status + + - name: verify nginx is listening on 80 + wait_for: port=80 timeout=3 + +- hosts: webserver + become: true + tasks: + - name: verify apache2 service + command: service apache2 status + + - name: verify apache2 is listening on 80 + wait_for: port=80 timeout=3 + +- hosts: database + become: true + tasks: + - name: verify mysql service + command: service mysql status + + - name: verify mysql is listening on 3306 + wait_for: port=3306 timeout=3 diff --git a/examples/013_wait_for/templates/nginx.conf.j2 b/examples/013_wait_for/templates/nginx.conf.j2 new file mode 100644 index 0000000..4b477b6 --- /dev/null +++ b/examples/013_wait_for/templates/nginx.conf.j2 @@ -0,0 +1,13 @@ +upstream demo { +{% for server in groups.webserver %} + server {{ server }}; +{% endfor %} +} + +server { + listen 80; + + location / { + proxy_pass http://demo; + } +} diff --git a/examples/013_wait_for/webserver.yml b/examples/013_wait_for/webserver.yml new file mode 100644 index 0000000..ac133bf --- /dev/null +++ b/examples/013_wait_for/webserver.yml @@ -0,0 +1,43 @@ +--- +- hosts: webserver + become: true + tasks: + - name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi-py3 + - python-pip-whl + - python3-virtualenv + - python3-mysqldb + + - name: ensure apache2 started + service: name=apache2 state=started enabled=yes + + - name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + + - name: copy demo app source + copy: src=demo/app/ dest=/var/www/demo mode=0755 + notify: restart apache2 + + - name: copy apache virtual host config + copy: src=demo/demo.conf dest=/etc/apache2/sites-available mode=0755 + notify: restart apache2 + + - name: setup python virtualenv + pip: requirements=/var/www/demo/requirements.txt virtualenv=/var/www/demo/.venv + notify: restart apache2 + + - name: de-activate default apache site + file: path=/etc/apache2/sites-enabled/000-default.conf state=absent + notify: restart apache2 + + - name: activate demo apache site + file: src=/etc/apache2/sites-available/demo.conf dest=/etc/apache2/sites-enabled/demo.conf state=link + notify: restart apache2 + + handlers: + - name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/014_stack_status/control.yml b/examples/014_stack_status/control.yml new file mode 100644 index 0000000..8330bc1 --- /dev/null +++ b/examples/014_stack_status/control.yml @@ -0,0 +1,9 @@ +--- +- hosts: control + become: true + tasks: + - name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - curl + - python-httplib2 diff --git a/examples/014_stack_status/database.yml b/examples/014_stack_status/database.yml new file mode 100644 index 0000000..bf89f49 --- /dev/null +++ b/examples/014_stack_status/database.yml @@ -0,0 +1,28 @@ +--- +- hosts: database + become: true + tasks: + - name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python3-mysqldb + + - name: install mysql-server + apt: name=mysql-server state=present update_cache=yes + + - name: ensure mysql started + service: name=mysql state=started enabled=yes + + - name: ensure mysql listening on all ports + lineinfile: dest=/etc/mysql/my.cnf regexp=^bind-address line="bind-address = 0.0.0.0" + notify: restart mysql + + - name: create demo database + mysql_db: name=demo state=present + + - name: create demo user + mysql_user: name=demo password=demo priv=demo.*:ALL host='%' state=present + + handlers: + - name: restart mysql + service: name=mysql state=restarted diff --git a/examples/014_stack_status/demo/app/demo.py b/examples/014_stack_status/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/014_stack_status/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/014_stack_status/demo/app/demo.wsgi b/examples/014_stack_status/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/014_stack_status/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/014_stack_status/demo/app/requirements.txt b/examples/014_stack_status/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/014_stack_status/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/014_stack_status/demo/demo.conf b/examples/014_stack_status/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/014_stack_status/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/014_stack_status/loadbalancer.yml b/examples/014_stack_status/loadbalancer.yml new file mode 100644 index 0000000..8063643 --- /dev/null +++ b/examples/014_stack_status/loadbalancer.yml @@ -0,0 +1,30 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python-httplib2 + + - name: install nginx + apt: name=nginx state=present update_cache=yes + + - name: ensure nginx started + service: name=nginx state=started enabled=yes + + - name: configure nginx site + template: src=templates/nginx.conf.j2 dest=/etc/nginx/sites-available/demo mode=0644 + notify: restart nginx + + - name: de-activate default nginx site + file: path=/etc/nginx/sites-enabled/default state=absent + notify: restart nginx + + - name: activate demo nginx site + file: src=/etc/nginx/sites-available/demo dest=/etc/nginx/sites-enabled/demo state=link + notify: restart nginx + + handlers: + - name: restart nginx + service: name=nginx state=restarted diff --git a/examples/014_stack_status/playbooks/hostname.yml b/examples/014_stack_status/playbooks/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/014_stack_status/playbooks/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/014_stack_status/playbooks/stack_restart.yml b/examples/014_stack_status/playbooks/stack_restart.yml new file mode 100644 index 0000000..b55de3d --- /dev/null +++ b/examples/014_stack_status/playbooks/stack_restart.yml @@ -0,0 +1,33 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + - wait_for: port=80 state=drained + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + - wait_for: port=80 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + - wait_for: port=3306 state=started + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + - wait_for: port=80 + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started + - wait_for: port=80 diff --git a/examples/014_stack_status/playbooks/stack_status.yml b/examples/014_stack_status/playbooks/stack_status.yml new file mode 100644 index 0000000..451221d --- /dev/null +++ b/examples/014_stack_status/playbooks/stack_status.yml @@ -0,0 +1,67 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: verify nginx service + command: service nginx status + + - name: verify nginx is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: webserver + become: true + tasks: + - name: verify apache2 service + command: service apache2 status + + - name: verify apache2 is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: database + become: true + tasks: + - name: verify mysql service + command: service mysql status + + - name: verify mysql is listening on 3306 + wait_for: port=3306 timeout=1 + +- hosts: control + tasks: + - name: verify end-to-end index response + uri: url=http://{{item}} return_content=yes + with_items: "{{ groups.loadbalancer }}" + register: lb_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny' not in item.content" + with_items: "{{lb_index.results}}" + + - name: verify end-to-end db response + uri: url=http://{{item}}/db return_content=yes + with_items: "{{ groups.loadbalancer }}" + register: lb_db + + - fail: msg="db failed to return content" + when: "'Database Connected from' not in item.content" + with_items: "{{lb_db.results}}" + +- hosts: loadbalancer + tasks: + - name: verify backend index response + uri: url=http://{{item}} return_content=yes + with_items: "{{ groups.webserver }}" + register: app_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny' not in item.content" + with_items: "{{app_index.results}}" + + - name: verify backend db response + uri: url=http://{{item}}/db return_content=yes + with_items: "{{ groups.webserver }}" + register: app_db + + - fail: msg="db failed to return content" + when: "'Database Connected from' not in item.content" + with_items: "{{app_db.results}}" diff --git a/examples/014_stack_status/templates/nginx.conf.j2 b/examples/014_stack_status/templates/nginx.conf.j2 new file mode 100644 index 0000000..4b477b6 --- /dev/null +++ b/examples/014_stack_status/templates/nginx.conf.j2 @@ -0,0 +1,13 @@ +upstream demo { +{% for server in groups.webserver %} + server {{ server }}; +{% endfor %} +} + +server { + listen 80; + + location / { + proxy_pass http://demo; + } +} diff --git a/examples/014_stack_status/webserver.yml b/examples/014_stack_status/webserver.yml new file mode 100644 index 0000000..ac133bf --- /dev/null +++ b/examples/014_stack_status/webserver.yml @@ -0,0 +1,43 @@ +--- +- hosts: webserver + become: true + tasks: + - name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi-py3 + - python-pip-whl + - python3-virtualenv + - python3-mysqldb + + - name: ensure apache2 started + service: name=apache2 state=started enabled=yes + + - name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + + - name: copy demo app source + copy: src=demo/app/ dest=/var/www/demo mode=0755 + notify: restart apache2 + + - name: copy apache virtual host config + copy: src=demo/demo.conf dest=/etc/apache2/sites-available mode=0755 + notify: restart apache2 + + - name: setup python virtualenv + pip: requirements=/var/www/demo/requirements.txt virtualenv=/var/www/demo/.venv + notify: restart apache2 + + - name: de-activate default apache site + file: path=/etc/apache2/sites-enabled/000-default.conf state=absent + notify: restart apache2 + + - name: activate demo apache site + file: src=/etc/apache2/sites-available/demo.conf dest=/etc/apache2/sites-enabled/demo.conf state=link + notify: restart apache2 + + handlers: + - name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/015_roles/playbooks/hostname.yml b/examples/015_roles/playbooks/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/015_roles/playbooks/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/015_roles/playbooks/stack_restart.yml b/examples/015_roles/playbooks/stack_restart.yml new file mode 100644 index 0000000..b55de3d --- /dev/null +++ b/examples/015_roles/playbooks/stack_restart.yml @@ -0,0 +1,33 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + - wait_for: port=80 state=drained + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + - wait_for: port=80 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + - wait_for: port=3306 state=started + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + - wait_for: port=80 + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started + - wait_for: port=80 diff --git a/examples/015_roles/roles/apache2/.travis.yml b/examples/015_roles/roles/apache2/.travis.yml new file mode 100644 index 0000000..36bbf62 --- /dev/null +++ b/examples/015_roles/roles/apache2/.travis.yml @@ -0,0 +1,29 @@ +--- +language: python +python: "2.7" + +# Use the new container infrastructure +sudo: false + +# Install ansible +addons: + apt: + packages: + - python-pip + +install: + # Install ansible + - pip install ansible + + # Check ansible version + - ansible --version + + # Create ansible.cfg with correct roles_path + - printf '[defaults]\nroles_path=../' >ansible.cfg + +script: + # Basic role syntax check + - ansible-playbook tests/test.yml -i tests/inventory --syntax-check + +notifications: + webhooks: https://galaxy.ansible.com/api/v1/notifications/ \ No newline at end of file diff --git a/examples/015_roles/roles/apache2/README.md b/examples/015_roles/roles/apache2/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/015_roles/roles/apache2/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/015_roles/roles/apache2/defaults/main.yml b/examples/015_roles/roles/apache2/defaults/main.yml new file mode 100644 index 0000000..0381169 --- /dev/null +++ b/examples/015_roles/roles/apache2/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for apache2 diff --git a/examples/015_roles/roles/apache2/handlers/main.yml b/examples/015_roles/roles/apache2/handlers/main.yml new file mode 100644 index 0000000..faa75e1 --- /dev/null +++ b/examples/015_roles/roles/apache2/handlers/main.yml @@ -0,0 +1,4 @@ +# handlers file for apache2 +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/015_roles/roles/apache2/meta/main.yml b/examples/015_roles/roles/apache2/meta/main.yml new file mode 100644 index 0000000..c572acc --- /dev/null +++ b/examples/015_roles/roles/apache2/meta/main.yml @@ -0,0 +1,52 @@ +galaxy_info: + author: your name + description: your role description + company: your company (optional) + + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + + # Choose a valid license ID from https://spdx.org - some suggested licenses: + # - BSD-3-Clause (default) + # - MIT + # - GPL-2.0-or-later + # - GPL-3.0-only + # - Apache-2.0 + # - CC-BY-4.0 + license: license (GPL-2.0-or-later, MIT, etc) + + min_ansible_version: 2.1 + + # If this a Container Enabled role, provide the minimum Ansible Container version. + # min_ansible_container_version: + + # + # Provide a list of supported platforms, and for each platform a list of versions. + # If you don't wish to enumerate all versions for a particular platform, use 'all'. + # To view available platforms and versions (or releases), visit: + # https://galaxy.ansible.com/api/v1/platforms/ + # + # platforms: + # - name: Fedora + # versions: + # - all + # - 25 + # - name: SomePlatform + # versions: + # - all + # - 1.0 + # - 7 + # - 99.99 + + galaxy_tags: [] + # List tags for your role here, one per line. A tag is a keyword that describes + # and categorizes the role. Users find roles by searching for tags. Be sure to + # remove the '[]' above, if you add tags to this list. + # + # NOTE: A tag is limited to a single word comprised of alphanumeric characters. + # Maximum 20 tags per role. + +dependencies: [] + # List your role dependencies here, one per line. Be sure to remove the '[]' above, + # if you add dependencies to this list. diff --git a/examples/015_roles/roles/apache2/tasks/main.yml b/examples/015_roles/roles/apache2/tasks/main.yml new file mode 100644 index 0000000..f06f2c1 --- /dev/null +++ b/examples/015_roles/roles/apache2/tasks/main.yml @@ -0,0 +1,21 @@ +# tasks file for apache2 +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi-py3 + - python-pip-whl + - python3-virtualenv + - python3-mysqldb + +- name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + +- name: de-activate default apache site + file: path=/etc/apache2/sites-enabled/000-default.conf state=absent + notify: restart apache2 + +- name: ensure apache2 started + service: name=apache2 state=started enabled=yes diff --git a/examples/015_roles/roles/apache2/tests/inventory b/examples/015_roles/roles/apache2/tests/inventory new file mode 100644 index 0000000..878877b --- /dev/null +++ b/examples/015_roles/roles/apache2/tests/inventory @@ -0,0 +1,2 @@ +localhost + diff --git a/examples/015_roles/roles/apache2/tests/test.yml b/examples/015_roles/roles/apache2/tests/test.yml new file mode 100644 index 0000000..7d2d6da --- /dev/null +++ b/examples/015_roles/roles/apache2/tests/test.yml @@ -0,0 +1,5 @@ +--- +- hosts: localhost + remote_user: root + roles: + - apache2 diff --git a/examples/015_roles/roles/apache2/vars/main.yml b/examples/015_roles/roles/apache2/vars/main.yml new file mode 100644 index 0000000..5d23ceb --- /dev/null +++ b/examples/015_roles/roles/apache2/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for apache2 diff --git a/examples/015_roles/roles/control/.travis.yml b/examples/015_roles/roles/control/.travis.yml new file mode 100644 index 0000000..36bbf62 --- /dev/null +++ b/examples/015_roles/roles/control/.travis.yml @@ -0,0 +1,29 @@ +--- +language: python +python: "2.7" + +# Use the new container infrastructure +sudo: false + +# Install ansible +addons: + apt: + packages: + - python-pip + +install: + # Install ansible + - pip install ansible + + # Check ansible version + - ansible --version + + # Create ansible.cfg with correct roles_path + - printf '[defaults]\nroles_path=../' >ansible.cfg + +script: + # Basic role syntax check + - ansible-playbook tests/test.yml -i tests/inventory --syntax-check + +notifications: + webhooks: https://galaxy.ansible.com/api/v1/notifications/ \ No newline at end of file diff --git a/examples/015_roles/roles/control/README.md b/examples/015_roles/roles/control/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/015_roles/roles/control/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/015_roles/roles/control/defaults/main.yml b/examples/015_roles/roles/control/defaults/main.yml new file mode 100644 index 0000000..9fe52bd --- /dev/null +++ b/examples/015_roles/roles/control/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for control diff --git a/examples/015_roles/roles/control/handlers/main.yml b/examples/015_roles/roles/control/handlers/main.yml new file mode 100644 index 0000000..4136893 --- /dev/null +++ b/examples/015_roles/roles/control/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for control diff --git a/examples/015_roles/roles/control/meta/main.yml b/examples/015_roles/roles/control/meta/main.yml new file mode 100644 index 0000000..c572acc --- /dev/null +++ b/examples/015_roles/roles/control/meta/main.yml @@ -0,0 +1,52 @@ +galaxy_info: + author: your name + description: your role description + company: your company (optional) + + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + + # Choose a valid license ID from https://spdx.org - some suggested licenses: + # - BSD-3-Clause (default) + # - MIT + # - GPL-2.0-or-later + # - GPL-3.0-only + # - Apache-2.0 + # - CC-BY-4.0 + license: license (GPL-2.0-or-later, MIT, etc) + + min_ansible_version: 2.1 + + # If this a Container Enabled role, provide the minimum Ansible Container version. + # min_ansible_container_version: + + # + # Provide a list of supported platforms, and for each platform a list of versions. + # If you don't wish to enumerate all versions for a particular platform, use 'all'. + # To view available platforms and versions (or releases), visit: + # https://galaxy.ansible.com/api/v1/platforms/ + # + # platforms: + # - name: Fedora + # versions: + # - all + # - 25 + # - name: SomePlatform + # versions: + # - all + # - 1.0 + # - 7 + # - 99.99 + + galaxy_tags: [] + # List tags for your role here, one per line. A tag is a keyword that describes + # and categorizes the role. Users find roles by searching for tags. Be sure to + # remove the '[]' above, if you add tags to this list. + # + # NOTE: A tag is limited to a single word comprised of alphanumeric characters. + # Maximum 20 tags per role. + +dependencies: [] + # List your role dependencies here, one per line. Be sure to remove the '[]' above, + # if you add dependencies to this list. diff --git a/examples/015_roles/roles/control/tasks/main.yml b/examples/015_roles/roles/control/tasks/main.yml new file mode 100644 index 0000000..93318e3 --- /dev/null +++ b/examples/015_roles/roles/control/tasks/main.yml @@ -0,0 +1,7 @@ +# tasks file for control +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - curl + - python-httplib2 diff --git a/examples/015_roles/roles/control/tests/inventory b/examples/015_roles/roles/control/tests/inventory new file mode 100644 index 0000000..878877b --- /dev/null +++ b/examples/015_roles/roles/control/tests/inventory @@ -0,0 +1,2 @@ +localhost + diff --git a/examples/015_roles/roles/control/tests/test.yml b/examples/015_roles/roles/control/tests/test.yml new file mode 100644 index 0000000..1a668ab --- /dev/null +++ b/examples/015_roles/roles/control/tests/test.yml @@ -0,0 +1,5 @@ +--- +- hosts: localhost + remote_user: root + roles: + - control diff --git a/examples/015_roles/roles/control/vars/main.yml b/examples/015_roles/roles/control/vars/main.yml new file mode 100644 index 0000000..eadc8b6 --- /dev/null +++ b/examples/015_roles/roles/control/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for control diff --git a/examples/015_roles/roles/demo_app/.travis.yml b/examples/015_roles/roles/demo_app/.travis.yml new file mode 100644 index 0000000..36bbf62 --- /dev/null +++ b/examples/015_roles/roles/demo_app/.travis.yml @@ -0,0 +1,29 @@ +--- +language: python +python: "2.7" + +# Use the new container infrastructure +sudo: false + +# Install ansible +addons: + apt: + packages: + - python-pip + +install: + # Install ansible + - pip install ansible + + # Check ansible version + - ansible --version + + # Create ansible.cfg with correct roles_path + - printf '[defaults]\nroles_path=../' >ansible.cfg + +script: + # Basic role syntax check + - ansible-playbook tests/test.yml -i tests/inventory --syntax-check + +notifications: + webhooks: https://galaxy.ansible.com/api/v1/notifications/ \ No newline at end of file diff --git a/examples/015_roles/roles/demo_app/README.md b/examples/015_roles/roles/demo_app/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/015_roles/roles/demo_app/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/015_roles/roles/demo_app/defaults/main.yml b/examples/015_roles/roles/demo_app/defaults/main.yml new file mode 100644 index 0000000..914e957 --- /dev/null +++ b/examples/015_roles/roles/demo_app/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for demo_app diff --git a/examples/015_roles/roles/demo_app/files/demo/app/demo.py b/examples/015_roles/roles/demo_app/files/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/015_roles/roles/demo_app/files/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/015_roles/roles/demo_app/files/demo/app/demo.wsgi b/examples/015_roles/roles/demo_app/files/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/015_roles/roles/demo_app/files/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/015_roles/roles/demo_app/files/demo/app/requirements.txt b/examples/015_roles/roles/demo_app/files/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/015_roles/roles/demo_app/files/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/015_roles/roles/demo_app/files/demo/demo.conf b/examples/015_roles/roles/demo_app/files/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/015_roles/roles/demo_app/files/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/015_roles/roles/demo_app/handlers/main.yml b/examples/015_roles/roles/demo_app/handlers/main.yml new file mode 100644 index 0000000..0ff1f25 --- /dev/null +++ b/examples/015_roles/roles/demo_app/handlers/main.yml @@ -0,0 +1,4 @@ +# handlers file for demo_app +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/015_roles/roles/demo_app/meta/main.yml b/examples/015_roles/roles/demo_app/meta/main.yml new file mode 100644 index 0000000..c572acc --- /dev/null +++ b/examples/015_roles/roles/demo_app/meta/main.yml @@ -0,0 +1,52 @@ +galaxy_info: + author: your name + description: your role description + company: your company (optional) + + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + + # Choose a valid license ID from https://spdx.org - some suggested licenses: + # - BSD-3-Clause (default) + # - MIT + # - GPL-2.0-or-later + # - GPL-3.0-only + # - Apache-2.0 + # - CC-BY-4.0 + license: license (GPL-2.0-or-later, MIT, etc) + + min_ansible_version: 2.1 + + # If this a Container Enabled role, provide the minimum Ansible Container version. + # min_ansible_container_version: + + # + # Provide a list of supported platforms, and for each platform a list of versions. + # If you don't wish to enumerate all versions for a particular platform, use 'all'. + # To view available platforms and versions (or releases), visit: + # https://galaxy.ansible.com/api/v1/platforms/ + # + # platforms: + # - name: Fedora + # versions: + # - all + # - 25 + # - name: SomePlatform + # versions: + # - all + # - 1.0 + # - 7 + # - 99.99 + + galaxy_tags: [] + # List tags for your role here, one per line. A tag is a keyword that describes + # and categorizes the role. Users find roles by searching for tags. Be sure to + # remove the '[]' above, if you add tags to this list. + # + # NOTE: A tag is limited to a single word comprised of alphanumeric characters. + # Maximum 20 tags per role. + +dependencies: [] + # List your role dependencies here, one per line. Be sure to remove the '[]' above, + # if you add dependencies to this list. diff --git a/examples/015_roles/roles/demo_app/tasks/main.yml b/examples/015_roles/roles/demo_app/tasks/main.yml new file mode 100644 index 0000000..e1dcc64 --- /dev/null +++ b/examples/015_roles/roles/demo_app/tasks/main.yml @@ -0,0 +1,24 @@ +# tasks file for demo_app +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - python-pip-whl + - python3-virtualenv + - python3-mysqldb + +- name: copy demo app source + copy: src=files/demo/app/ dest=/var/www/demo mode=0755 + notify: restart apache2 + +- name: copy apache virtual host config + copy: src=files/demo/demo.conf dest=/etc/apache2/sites-available mode=0755 + notify: restart apache2 + +- name: setup python virtualenv + pip: requirements=/var/www/demo/requirements.txt virtualenv=/var/www/demo/.venv + notify: restart apache2 + +- name: activate demo apache site + file: src=/etc/apache2/sites-available/demo.conf dest=/etc/apache2/sites-enabled/demo.conf state=link + notify: restart apache2 diff --git a/examples/015_roles/roles/demo_app/tests/inventory b/examples/015_roles/roles/demo_app/tests/inventory new file mode 100644 index 0000000..878877b --- /dev/null +++ b/examples/015_roles/roles/demo_app/tests/inventory @@ -0,0 +1,2 @@ +localhost + diff --git a/examples/015_roles/roles/demo_app/tests/test.yml b/examples/015_roles/roles/demo_app/tests/test.yml new file mode 100644 index 0000000..2b0cbd9 --- /dev/null +++ b/examples/015_roles/roles/demo_app/tests/test.yml @@ -0,0 +1,5 @@ +--- +- hosts: localhost + remote_user: root + roles: + - demo_app diff --git a/examples/015_roles/roles/demo_app/vars/main.yml b/examples/015_roles/roles/demo_app/vars/main.yml new file mode 100644 index 0000000..52fb613 --- /dev/null +++ b/examples/015_roles/roles/demo_app/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for demo_app diff --git a/examples/015_roles/roles/mysql/.travis.yml b/examples/015_roles/roles/mysql/.travis.yml new file mode 100644 index 0000000..36bbf62 --- /dev/null +++ b/examples/015_roles/roles/mysql/.travis.yml @@ -0,0 +1,29 @@ +--- +language: python +python: "2.7" + +# Use the new container infrastructure +sudo: false + +# Install ansible +addons: + apt: + packages: + - python-pip + +install: + # Install ansible + - pip install ansible + + # Check ansible version + - ansible --version + + # Create ansible.cfg with correct roles_path + - printf '[defaults]\nroles_path=../' >ansible.cfg + +script: + # Basic role syntax check + - ansible-playbook tests/test.yml -i tests/inventory --syntax-check + +notifications: + webhooks: https://galaxy.ansible.com/api/v1/notifications/ \ No newline at end of file diff --git a/examples/015_roles/roles/mysql/README.md b/examples/015_roles/roles/mysql/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/015_roles/roles/mysql/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/015_roles/roles/mysql/defaults/main.yml b/examples/015_roles/roles/mysql/defaults/main.yml new file mode 100644 index 0000000..e9ebcba --- /dev/null +++ b/examples/015_roles/roles/mysql/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for mysql diff --git a/examples/015_roles/roles/mysql/handlers/main.yml b/examples/015_roles/roles/mysql/handlers/main.yml new file mode 100644 index 0000000..68cccce --- /dev/null +++ b/examples/015_roles/roles/mysql/handlers/main.yml @@ -0,0 +1,4 @@ +# handlers file for mysql +--- +- name: restart mysql + service: name=mysql state=restarted diff --git a/examples/015_roles/roles/mysql/meta/main.yml b/examples/015_roles/roles/mysql/meta/main.yml new file mode 100644 index 0000000..c572acc --- /dev/null +++ b/examples/015_roles/roles/mysql/meta/main.yml @@ -0,0 +1,52 @@ +galaxy_info: + author: your name + description: your role description + company: your company (optional) + + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + + # Choose a valid license ID from https://spdx.org - some suggested licenses: + # - BSD-3-Clause (default) + # - MIT + # - GPL-2.0-or-later + # - GPL-3.0-only + # - Apache-2.0 + # - CC-BY-4.0 + license: license (GPL-2.0-or-later, MIT, etc) + + min_ansible_version: 2.1 + + # If this a Container Enabled role, provide the minimum Ansible Container version. + # min_ansible_container_version: + + # + # Provide a list of supported platforms, and for each platform a list of versions. + # If you don't wish to enumerate all versions for a particular platform, use 'all'. + # To view available platforms and versions (or releases), visit: + # https://galaxy.ansible.com/api/v1/platforms/ + # + # platforms: + # - name: Fedora + # versions: + # - all + # - 25 + # - name: SomePlatform + # versions: + # - all + # - 1.0 + # - 7 + # - 99.99 + + galaxy_tags: [] + # List tags for your role here, one per line. A tag is a keyword that describes + # and categorizes the role. Users find roles by searching for tags. Be sure to + # remove the '[]' above, if you add tags to this list. + # + # NOTE: A tag is limited to a single word comprised of alphanumeric characters. + # Maximum 20 tags per role. + +dependencies: [] + # List your role dependencies here, one per line. Be sure to remove the '[]' above, + # if you add dependencies to this list. diff --git a/examples/015_roles/roles/mysql/tasks/main.yml b/examples/015_roles/roles/mysql/tasks/main.yml new file mode 100644 index 0000000..c6e1e59 --- /dev/null +++ b/examples/015_roles/roles/mysql/tasks/main.yml @@ -0,0 +1,25 @@ +# tasks file for mysql +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python3-mysqldb + +- name: install mysql-server + apt: name=mysql-server state=present update_cache=yes + +- name: chmod cnf + command: chmod 777 /etc/mysql/my.cnf + +- name: ensure mysql listening on all ports + lineinfile: dest=/etc/mysql/my.cnf regexp=^bind-address line="bind-address = 0.0.0.0" + notify: restart mysql + +- name: ensure mysql started + service: name=mysql state=started enabled=yes + +- name: create demo database + mysql_db: name=demo state=present + +- name: create demo user + mysql_user: name=demo password=demo priv=demo.*:ALL host='%' state=present diff --git a/examples/015_roles/roles/mysql/tests/inventory b/examples/015_roles/roles/mysql/tests/inventory new file mode 100644 index 0000000..878877b --- /dev/null +++ b/examples/015_roles/roles/mysql/tests/inventory @@ -0,0 +1,2 @@ +localhost + diff --git a/examples/015_roles/roles/mysql/tests/test.yml b/examples/015_roles/roles/mysql/tests/test.yml new file mode 100644 index 0000000..15feaa1 --- /dev/null +++ b/examples/015_roles/roles/mysql/tests/test.yml @@ -0,0 +1,5 @@ +--- +- hosts: localhost + remote_user: root + roles: + - mysql diff --git a/examples/015_roles/roles/mysql/vars/main.yml b/examples/015_roles/roles/mysql/vars/main.yml new file mode 100644 index 0000000..a79bfed --- /dev/null +++ b/examples/015_roles/roles/mysql/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for mysql diff --git a/examples/015_roles/roles/nginx/.travis.yml b/examples/015_roles/roles/nginx/.travis.yml new file mode 100644 index 0000000..36bbf62 --- /dev/null +++ b/examples/015_roles/roles/nginx/.travis.yml @@ -0,0 +1,29 @@ +--- +language: python +python: "2.7" + +# Use the new container infrastructure +sudo: false + +# Install ansible +addons: + apt: + packages: + - python-pip + +install: + # Install ansible + - pip install ansible + + # Check ansible version + - ansible --version + + # Create ansible.cfg with correct roles_path + - printf '[defaults]\nroles_path=../' >ansible.cfg + +script: + # Basic role syntax check + - ansible-playbook tests/test.yml -i tests/inventory --syntax-check + +notifications: + webhooks: https://galaxy.ansible.com/api/v1/notifications/ \ No newline at end of file diff --git a/examples/015_roles/roles/nginx/README.md b/examples/015_roles/roles/nginx/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/015_roles/roles/nginx/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/015_roles/roles/nginx/defaults/main.yml b/examples/015_roles/roles/nginx/defaults/main.yml new file mode 100644 index 0000000..78c8c76 --- /dev/null +++ b/examples/015_roles/roles/nginx/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for nginx diff --git a/examples/015_roles/roles/nginx/handlers/main.yml b/examples/015_roles/roles/nginx/handlers/main.yml new file mode 100644 index 0000000..09669a2 --- /dev/null +++ b/examples/015_roles/roles/nginx/handlers/main.yml @@ -0,0 +1,4 @@ +# handlers file for nginx +--- +- name: restart nginx + service: name=nginx state=restarted diff --git a/examples/015_roles/roles/nginx/meta/main.yml b/examples/015_roles/roles/nginx/meta/main.yml new file mode 100644 index 0000000..c572acc --- /dev/null +++ b/examples/015_roles/roles/nginx/meta/main.yml @@ -0,0 +1,52 @@ +galaxy_info: + author: your name + description: your role description + company: your company (optional) + + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + + # Choose a valid license ID from https://spdx.org - some suggested licenses: + # - BSD-3-Clause (default) + # - MIT + # - GPL-2.0-or-later + # - GPL-3.0-only + # - Apache-2.0 + # - CC-BY-4.0 + license: license (GPL-2.0-or-later, MIT, etc) + + min_ansible_version: 2.1 + + # If this a Container Enabled role, provide the minimum Ansible Container version. + # min_ansible_container_version: + + # + # Provide a list of supported platforms, and for each platform a list of versions. + # If you don't wish to enumerate all versions for a particular platform, use 'all'. + # To view available platforms and versions (or releases), visit: + # https://galaxy.ansible.com/api/v1/platforms/ + # + # platforms: + # - name: Fedora + # versions: + # - all + # - 25 + # - name: SomePlatform + # versions: + # - all + # - 1.0 + # - 7 + # - 99.99 + + galaxy_tags: [] + # List tags for your role here, one per line. A tag is a keyword that describes + # and categorizes the role. Users find roles by searching for tags. Be sure to + # remove the '[]' above, if you add tags to this list. + # + # NOTE: A tag is limited to a single word comprised of alphanumeric characters. + # Maximum 20 tags per role. + +dependencies: [] + # List your role dependencies here, one per line. Be sure to remove the '[]' above, + # if you add dependencies to this list. diff --git a/examples/015_roles/roles/nginx/tasks/main.yml b/examples/015_roles/roles/nginx/tasks/main.yml new file mode 100644 index 0000000..620a0dc --- /dev/null +++ b/examples/015_roles/roles/nginx/tasks/main.yml @@ -0,0 +1,24 @@ +# tasks file for nginx +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python-httplib2 + +- name: install nginx + apt: name=nginx state=present update_cache=yes + +- name: configure nginx site + template: src=nginx.conf.j2 dest=/etc/nginx/sites-available/demo mode=0644 + notify: restart nginx + +- name: de-activate default nginx site + file: path=/etc/nginx/sites-enabled/default state=absent + notify: restart nginx + +- name: activate demo nginx site + file: src=/etc/nginx/sites-available/demo dest=/etc/nginx/sites-enabled/demo state=link + notify: restart nginx + +- name: ensure nginx started + service: name=nginx state=started enabled=yes diff --git a/examples/015_roles/roles/nginx/templates/nginx.conf.j2 b/examples/015_roles/roles/nginx/templates/nginx.conf.j2 new file mode 100644 index 0000000..4b477b6 --- /dev/null +++ b/examples/015_roles/roles/nginx/templates/nginx.conf.j2 @@ -0,0 +1,13 @@ +upstream demo { +{% for server in groups.webserver %} + server {{ server }}; +{% endfor %} +} + +server { + listen 80; + + location / { + proxy_pass http://demo; + } +} diff --git a/examples/015_roles/roles/nginx/tests/inventory b/examples/015_roles/roles/nginx/tests/inventory new file mode 100644 index 0000000..878877b --- /dev/null +++ b/examples/015_roles/roles/nginx/tests/inventory @@ -0,0 +1,2 @@ +localhost + diff --git a/examples/015_roles/roles/nginx/tests/test.yml b/examples/015_roles/roles/nginx/tests/test.yml new file mode 100644 index 0000000..261c779 --- /dev/null +++ b/examples/015_roles/roles/nginx/tests/test.yml @@ -0,0 +1,5 @@ +--- +- hosts: localhost + remote_user: root + roles: + - nginx diff --git a/examples/015_roles/roles/nginx/vars/main.yml b/examples/015_roles/roles/nginx/vars/main.yml new file mode 100644 index 0000000..d45faf6 --- /dev/null +++ b/examples/015_roles/roles/nginx/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for nginx diff --git a/examples/015_roles/roles/status/.travis.yml b/examples/015_roles/roles/status/.travis.yml new file mode 100644 index 0000000..36bbf62 --- /dev/null +++ b/examples/015_roles/roles/status/.travis.yml @@ -0,0 +1,29 @@ +--- +language: python +python: "2.7" + +# Use the new container infrastructure +sudo: false + +# Install ansible +addons: + apt: + packages: + - python-pip + +install: + # Install ansible + - pip install ansible + + # Check ansible version + - ansible --version + + # Create ansible.cfg with correct roles_path + - printf '[defaults]\nroles_path=../' >ansible.cfg + +script: + # Basic role syntax check + - ansible-playbook tests/test.yml -i tests/inventory --syntax-check + +notifications: + webhooks: https://galaxy.ansible.com/api/v1/notifications/ \ No newline at end of file diff --git a/examples/015_roles/roles/status/README.md b/examples/015_roles/roles/status/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/015_roles/roles/status/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/015_roles/roles/status/defaults/main.yml b/examples/015_roles/roles/status/defaults/main.yml new file mode 100644 index 0000000..af48236 --- /dev/null +++ b/examples/015_roles/roles/status/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for status diff --git a/examples/015_roles/roles/status/handlers/main.yml b/examples/015_roles/roles/status/handlers/main.yml new file mode 100644 index 0000000..ca3a957 --- /dev/null +++ b/examples/015_roles/roles/status/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for status diff --git a/examples/015_roles/roles/status/meta/main.yml b/examples/015_roles/roles/status/meta/main.yml new file mode 100644 index 0000000..c572acc --- /dev/null +++ b/examples/015_roles/roles/status/meta/main.yml @@ -0,0 +1,52 @@ +galaxy_info: + author: your name + description: your role description + company: your company (optional) + + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + + # Choose a valid license ID from https://spdx.org - some suggested licenses: + # - BSD-3-Clause (default) + # - MIT + # - GPL-2.0-or-later + # - GPL-3.0-only + # - Apache-2.0 + # - CC-BY-4.0 + license: license (GPL-2.0-or-later, MIT, etc) + + min_ansible_version: 2.1 + + # If this a Container Enabled role, provide the minimum Ansible Container version. + # min_ansible_container_version: + + # + # Provide a list of supported platforms, and for each platform a list of versions. + # If you don't wish to enumerate all versions for a particular platform, use 'all'. + # To view available platforms and versions (or releases), visit: + # https://galaxy.ansible.com/api/v1/platforms/ + # + # platforms: + # - name: Fedora + # versions: + # - all + # - 25 + # - name: SomePlatform + # versions: + # - all + # - 1.0 + # - 7 + # - 99.99 + + galaxy_tags: [] + # List tags for your role here, one per line. A tag is a keyword that describes + # and categorizes the role. Users find roles by searching for tags. Be sure to + # remove the '[]' above, if you add tags to this list. + # + # NOTE: A tag is limited to a single word comprised of alphanumeric characters. + # Maximum 20 tags per role. + +dependencies: [] + # List your role dependencies here, one per line. Be sure to remove the '[]' above, + # if you add dependencies to this list. diff --git a/examples/015_roles/roles/status/tests/inventory b/examples/015_roles/roles/status/tests/inventory new file mode 100644 index 0000000..878877b --- /dev/null +++ b/examples/015_roles/roles/status/tests/inventory @@ -0,0 +1,2 @@ +localhost + diff --git a/examples/015_roles/roles/status/tests/test.yml b/examples/015_roles/roles/status/tests/test.yml new file mode 100644 index 0000000..e6b10b3 --- /dev/null +++ b/examples/015_roles/roles/status/tests/test.yml @@ -0,0 +1,5 @@ +--- +- hosts: localhost + remote_user: root + roles: + - status diff --git a/examples/015_roles/roles/status/vars/main.yml b/examples/015_roles/roles/status/vars/main.yml new file mode 100644 index 0000000..7751cdd --- /dev/null +++ b/examples/015_roles/roles/status/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for status diff --git a/examples/015_roles/site.yml b/examples/015_roles/site.yml new file mode 100644 index 0000000..f596f9f --- /dev/null +++ b/examples/015_roles/site.yml @@ -0,0 +1,88 @@ +--- +- hosts: control + become: true + roles: + - control + +- hosts: database + become: true + roles: + - mysql + +- hosts: loadbalancer + become: true + roles: + - nginx + +- hosts: webserver + become: true + roles: + - apache2 + - demo_app + +- hosts: loadbalancer + become: true + tasks: + - name: verify nginx service + command: service nginx status + + - name: verify nginx is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: webserver + become: true + tasks: + - name: verify apache2 service + command: service apache2 status + + - name: verify apache2 is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: database + become: true + tasks: + - name: verify mysql service + command: service mysql status + + - name: verify mysql is listening on 3306 + wait_for: port=3306 timeout=1 + +- hosts: control + tasks: + - name: verify end-to-end index response + uri: url=http://{{item}} return_content=yes + with_items: "{{ groups.loadbalancer }}" + register: lb_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny' not in item.content" + with_items: "{{lb_index.results}}" + + - name: verify end-to-end db response + uri: url=http://{{item}}/db return_content=yes + with_items: "{{ groups.loadbalancer }}" + register: lb_db + + - fail: msg="db failed to return content" + when: "'Database Connected from' not in item.content" + with_items: "{{lb_db.results}}" + +- hosts: loadbalancer + tasks: + - name: verify backend index response + uri: url=http://{{item}} return_content=yes + with_items: "{{ groups.webserver }}" + register: app_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny' not in item.content" + with_items: "{{app_index.results}}" + + - name: verify backend db response + uri: url=http://{{item}}/db return_content=yes + with_items: "{{ groups.webserver }}" + register: app_db + + - fail: msg="db failed to return content" + when: "'Database Connected from' not in item.content" + with_items: "{{app_db.results}}" diff --git a/examples/015_roles/stack_status.yml b/examples/015_roles/stack_status.yml new file mode 100644 index 0000000..451221d --- /dev/null +++ b/examples/015_roles/stack_status.yml @@ -0,0 +1,67 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: verify nginx service + command: service nginx status + + - name: verify nginx is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: webserver + become: true + tasks: + - name: verify apache2 service + command: service apache2 status + + - name: verify apache2 is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: database + become: true + tasks: + - name: verify mysql service + command: service mysql status + + - name: verify mysql is listening on 3306 + wait_for: port=3306 timeout=1 + +- hosts: control + tasks: + - name: verify end-to-end index response + uri: url=http://{{item}} return_content=yes + with_items: "{{ groups.loadbalancer }}" + register: lb_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny' not in item.content" + with_items: "{{lb_index.results}}" + + - name: verify end-to-end db response + uri: url=http://{{item}}/db return_content=yes + with_items: "{{ groups.loadbalancer }}" + register: lb_db + + - fail: msg="db failed to return content" + when: "'Database Connected from' not in item.content" + with_items: "{{lb_db.results}}" + +- hosts: loadbalancer + tasks: + - name: verify backend index response + uri: url=http://{{item}} return_content=yes + with_items: "{{ groups.webserver }}" + register: app_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny' not in item.content" + with_items: "{{app_index.results}}" + + - name: verify backend db response + uri: url=http://{{item}}/db return_content=yes + with_items: "{{ groups.webserver }}" + register: app_db + + - fail: msg="db failed to return content" + when: "'Database Connected from' not in item.content" + with_items: "{{app_db.results}}" diff --git a/examples/015_roles/templates/nginx.conf.j2 b/examples/015_roles/templates/nginx.conf.j2 new file mode 100644 index 0000000..4b477b6 --- /dev/null +++ b/examples/015_roles/templates/nginx.conf.j2 @@ -0,0 +1,13 @@ +upstream demo { +{% for server in groups.webserver %} + server {{ server }}; +{% endfor %} +} + +server { + listen 80; + + location / { + proxy_pass http://demo; + } +} diff --git a/examples/016_tasks_handlers/control.yml b/examples/016_tasks_handlers/control.yml new file mode 100644 index 0000000..c6a8d81 --- /dev/null +++ b/examples/016_tasks_handlers/control.yml @@ -0,0 +1,5 @@ +--- +- hosts: control + become: true + roles: + - control diff --git a/examples/016_tasks_handlers/database.yml b/examples/016_tasks_handlers/database.yml new file mode 100644 index 0000000..e22020d --- /dev/null +++ b/examples/016_tasks_handlers/database.yml @@ -0,0 +1,5 @@ +--- +- hosts: database + become: true + roles: + - mysql diff --git a/examples/016_tasks_handlers/demo/app/demo.py b/examples/016_tasks_handlers/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/016_tasks_handlers/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/016_tasks_handlers/demo/app/demo.wsgi b/examples/016_tasks_handlers/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/016_tasks_handlers/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/016_tasks_handlers/demo/app/requirements.txt b/examples/016_tasks_handlers/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/016_tasks_handlers/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/016_tasks_handlers/demo/demo.conf b/examples/016_tasks_handlers/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/016_tasks_handlers/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/016_tasks_handlers/loadbalancer.yml b/examples/016_tasks_handlers/loadbalancer.yml new file mode 100644 index 0000000..8063643 --- /dev/null +++ b/examples/016_tasks_handlers/loadbalancer.yml @@ -0,0 +1,30 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python-httplib2 + + - name: install nginx + apt: name=nginx state=present update_cache=yes + + - name: ensure nginx started + service: name=nginx state=started enabled=yes + + - name: configure nginx site + template: src=templates/nginx.conf.j2 dest=/etc/nginx/sites-available/demo mode=0644 + notify: restart nginx + + - name: de-activate default nginx site + file: path=/etc/nginx/sites-enabled/default state=absent + notify: restart nginx + + - name: activate demo nginx site + file: src=/etc/nginx/sites-available/demo dest=/etc/nginx/sites-enabled/demo state=link + notify: restart nginx + + handlers: + - name: restart nginx + service: name=nginx state=restarted diff --git a/examples/016_tasks_handlers/playbooks/hostname.yml b/examples/016_tasks_handlers/playbooks/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/016_tasks_handlers/playbooks/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/016_tasks_handlers/playbooks/stack_restart.yml b/examples/016_tasks_handlers/playbooks/stack_restart.yml new file mode 100644 index 0000000..b55de3d --- /dev/null +++ b/examples/016_tasks_handlers/playbooks/stack_restart.yml @@ -0,0 +1,33 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + - wait_for: port=80 state=drained + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + - wait_for: port=80 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + - wait_for: port=3306 state=started + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + - wait_for: port=80 + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started + - wait_for: port=80 diff --git a/examples/016_tasks_handlers/playbooks/stack_status.yml b/examples/016_tasks_handlers/playbooks/stack_status.yml new file mode 100644 index 0000000..0676295 --- /dev/null +++ b/examples/016_tasks_handlers/playbooks/stack_status.yml @@ -0,0 +1,67 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: verify nginx service + command: service nginx status + + - name: verify nginx is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: webserver + become: true + tasks: + - name: verify apache2 service + command: service apache2 status + + - name: verify apache2 is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: database + become: true + tasks: + - name: verify mysql service + command: service mysql status + + - name: verify mysql is listening on 3306 + wait_for: port=3306 timeout=1 + +- hosts: control + tasks: + - name: verify end-to-end index response + uri: url=http://{{item}} return_content=yes + with_items: groups.loadbalancer + register: lb_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny' not in item.content" + with_items: "{{lb_index.results}}" + + - name: verify end-to-end db response + uri: url=http://{{item}}/db return_content=yes + with_items: groups.loadbalancer + register: lb_db + + - fail: msg="db failed to return content" + when: "'Database Connected from' not in item.content" + with_items: "{{lb_db.results}}" + +- hosts: loadbalancer + tasks: + - name: verify backend index response + uri: url=http://{{item}} return_content=yes + with_items: groups.webserver + register: app_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny {{item.item}}!' not in item.content" + with_items: "{{app_index.results}}" + + - name: verify backend db response + uri: url=http://{{item}}/db return_content=yes + with_items: groups.webserver + register: app_db + + - fail: msg="db failed to return content" + when: "'Database Connected from {{item.item}}!' not in item.content" + with_items: "{{app_db.results}}" diff --git a/examples/016_tasks_handlers/roles/apache2/README.md b/examples/016_tasks_handlers/roles/apache2/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/016_tasks_handlers/roles/apache2/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/016_tasks_handlers/roles/apache2/defaults/main.yml b/examples/016_tasks_handlers/roles/apache2/defaults/main.yml new file mode 100644 index 0000000..0381169 --- /dev/null +++ b/examples/016_tasks_handlers/roles/apache2/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for apache2 diff --git a/examples/016_tasks_handlers/roles/apache2/handlers/main.yml b/examples/016_tasks_handlers/roles/apache2/handlers/main.yml new file mode 100644 index 0000000..76add52 --- /dev/null +++ b/examples/016_tasks_handlers/roles/apache2/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for apache2 diff --git a/examples/016_tasks_handlers/roles/apache2/meta/main.yml b/examples/016_tasks_handlers/roles/apache2/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/016_tasks_handlers/roles/apache2/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/016_tasks_handlers/roles/apache2/tasks/main.yml b/examples/016_tasks_handlers/roles/apache2/tasks/main.yml new file mode 100644 index 0000000..2e2af7a --- /dev/null +++ b/examples/016_tasks_handlers/roles/apache2/tasks/main.yml @@ -0,0 +1,2 @@ +--- +# tasks file for apache2 diff --git a/examples/016_tasks_handlers/roles/apache2/vars/main.yml b/examples/016_tasks_handlers/roles/apache2/vars/main.yml new file mode 100644 index 0000000..5d23ceb --- /dev/null +++ b/examples/016_tasks_handlers/roles/apache2/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for apache2 diff --git a/examples/016_tasks_handlers/roles/control/README.md b/examples/016_tasks_handlers/roles/control/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/016_tasks_handlers/roles/control/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/016_tasks_handlers/roles/control/defaults/main.yml b/examples/016_tasks_handlers/roles/control/defaults/main.yml new file mode 100644 index 0000000..9fe52bd --- /dev/null +++ b/examples/016_tasks_handlers/roles/control/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for control diff --git a/examples/016_tasks_handlers/roles/control/handlers/main.yml b/examples/016_tasks_handlers/roles/control/handlers/main.yml new file mode 100644 index 0000000..4136893 --- /dev/null +++ b/examples/016_tasks_handlers/roles/control/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for control diff --git a/examples/016_tasks_handlers/roles/control/meta/main.yml b/examples/016_tasks_handlers/roles/control/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/016_tasks_handlers/roles/control/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/016_tasks_handlers/roles/control/tasks/main.yml b/examples/016_tasks_handlers/roles/control/tasks/main.yml new file mode 100644 index 0000000..330e91c --- /dev/null +++ b/examples/016_tasks_handlers/roles/control/tasks/main.yml @@ -0,0 +1,6 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - curl + - python-httplib2 diff --git a/examples/016_tasks_handlers/roles/control/vars/main.yml b/examples/016_tasks_handlers/roles/control/vars/main.yml new file mode 100644 index 0000000..eadc8b6 --- /dev/null +++ b/examples/016_tasks_handlers/roles/control/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for control diff --git a/examples/016_tasks_handlers/roles/demo_app/README.md b/examples/016_tasks_handlers/roles/demo_app/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/016_tasks_handlers/roles/demo_app/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/016_tasks_handlers/roles/demo_app/defaults/main.yml b/examples/016_tasks_handlers/roles/demo_app/defaults/main.yml new file mode 100644 index 0000000..914e957 --- /dev/null +++ b/examples/016_tasks_handlers/roles/demo_app/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for demo_app diff --git a/examples/016_tasks_handlers/roles/demo_app/handlers/main.yml b/examples/016_tasks_handlers/roles/demo_app/handlers/main.yml new file mode 100644 index 0000000..c7a9311 --- /dev/null +++ b/examples/016_tasks_handlers/roles/demo_app/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for demo_app diff --git a/examples/016_tasks_handlers/roles/demo_app/meta/main.yml b/examples/016_tasks_handlers/roles/demo_app/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/016_tasks_handlers/roles/demo_app/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/016_tasks_handlers/roles/demo_app/tasks/main.yml b/examples/016_tasks_handlers/roles/demo_app/tasks/main.yml new file mode 100644 index 0000000..ede66b7 --- /dev/null +++ b/examples/016_tasks_handlers/roles/demo_app/tasks/main.yml @@ -0,0 +1,2 @@ +--- +# tasks file for demo_app diff --git a/examples/016_tasks_handlers/roles/demo_app/vars/main.yml b/examples/016_tasks_handlers/roles/demo_app/vars/main.yml new file mode 100644 index 0000000..52fb613 --- /dev/null +++ b/examples/016_tasks_handlers/roles/demo_app/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for demo_app diff --git a/examples/016_tasks_handlers/roles/mysql/README.md b/examples/016_tasks_handlers/roles/mysql/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/016_tasks_handlers/roles/mysql/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/016_tasks_handlers/roles/mysql/defaults/main.yml b/examples/016_tasks_handlers/roles/mysql/defaults/main.yml new file mode 100644 index 0000000..e9ebcba --- /dev/null +++ b/examples/016_tasks_handlers/roles/mysql/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for mysql diff --git a/examples/016_tasks_handlers/roles/mysql/handlers/main.yml b/examples/016_tasks_handlers/roles/mysql/handlers/main.yml new file mode 100644 index 0000000..3755d8c --- /dev/null +++ b/examples/016_tasks_handlers/roles/mysql/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart mysql + service: name=mysql state=restarted diff --git a/examples/016_tasks_handlers/roles/mysql/meta/main.yml b/examples/016_tasks_handlers/roles/mysql/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/016_tasks_handlers/roles/mysql/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/016_tasks_handlers/roles/mysql/tasks/main.yml b/examples/016_tasks_handlers/roles/mysql/tasks/main.yml new file mode 100644 index 0000000..db06b1c --- /dev/null +++ b/examples/016_tasks_handlers/roles/mysql/tasks/main.yml @@ -0,0 +1,21 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python3-mysqldb + +- name: install mysql-server + apt: name=mysql-server state=present update_cache=yes + +- name: ensure mysql started + service: name=mysql state=started enabled=yes + +- name: ensure mysql listening on all ports + lineinfile: dest=/etc/mysql/my.cnf regexp=^bind-address line="bind-address = 0.0.0.0" + notify: restart mysql + +- name: create demo database + mysql_db: name=demo state=present + +- name: create demo user + mysql_user: name=demo password=demo priv=demo.*:ALL host='%' state=present diff --git a/examples/016_tasks_handlers/roles/mysql/vars/main.yml b/examples/016_tasks_handlers/roles/mysql/vars/main.yml new file mode 100644 index 0000000..a79bfed --- /dev/null +++ b/examples/016_tasks_handlers/roles/mysql/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for mysql diff --git a/examples/016_tasks_handlers/roles/nginx/README.md b/examples/016_tasks_handlers/roles/nginx/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/016_tasks_handlers/roles/nginx/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/016_tasks_handlers/roles/nginx/defaults/main.yml b/examples/016_tasks_handlers/roles/nginx/defaults/main.yml new file mode 100644 index 0000000..78c8c76 --- /dev/null +++ b/examples/016_tasks_handlers/roles/nginx/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for nginx diff --git a/examples/016_tasks_handlers/roles/nginx/handlers/main.yml b/examples/016_tasks_handlers/roles/nginx/handlers/main.yml new file mode 100644 index 0000000..ad79151 --- /dev/null +++ b/examples/016_tasks_handlers/roles/nginx/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for nginx diff --git a/examples/016_tasks_handlers/roles/nginx/meta/main.yml b/examples/016_tasks_handlers/roles/nginx/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/016_tasks_handlers/roles/nginx/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/016_tasks_handlers/roles/nginx/tasks/main.yml b/examples/016_tasks_handlers/roles/nginx/tasks/main.yml new file mode 100644 index 0000000..7034178 --- /dev/null +++ b/examples/016_tasks_handlers/roles/nginx/tasks/main.yml @@ -0,0 +1,2 @@ +--- +# tasks file for nginx diff --git a/examples/016_tasks_handlers/roles/nginx/vars/main.yml b/examples/016_tasks_handlers/roles/nginx/vars/main.yml new file mode 100644 index 0000000..d45faf6 --- /dev/null +++ b/examples/016_tasks_handlers/roles/nginx/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for nginx diff --git a/examples/016_tasks_handlers/templates/nginx.conf.j2 b/examples/016_tasks_handlers/templates/nginx.conf.j2 new file mode 100644 index 0000000..4b477b6 --- /dev/null +++ b/examples/016_tasks_handlers/templates/nginx.conf.j2 @@ -0,0 +1,13 @@ +upstream demo { +{% for server in groups.webserver %} + server {{ server }}; +{% endfor %} +} + +server { + listen 80; + + location / { + proxy_pass http://demo; + } +} diff --git a/examples/016_tasks_handlers/webserver.yml b/examples/016_tasks_handlers/webserver.yml new file mode 100644 index 0000000..1417614 --- /dev/null +++ b/examples/016_tasks_handlers/webserver.yml @@ -0,0 +1,43 @@ +--- +- hosts: webserver + become: true + tasks: + - name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi + - python-pip + - python-virtualenv + - python-mysqldb + + - name: ensure apache2 started + service: name=apache2 state=started enabled=yes + + - name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + + - name: copy demo app source + copy: src=demo/app/ dest=/var/www/demo mode=0755 + notify: restart apache2 + + - name: copy apache virtual host config + copy: src=demo/demo.conf dest=/etc/apache2/sites-available mode=0755 + notify: restart apache2 + + - name: setup python virtualenv + pip: requirements=/var/www/demo/requirements.txt virtualenv=/var/www/demo/.venv + notify: restart apache2 + + - name: de-activate default apache site + file: path=/etc/apache2/sites-enabled/000-default.conf state=absent + notify: restart apache2 + + - name: activate demo apache site + file: src=/etc/apache2/sites-available/demo.conf dest=/etc/apache2/sites-enabled/demo.conf state=link + notify: restart apache2 + + handlers: + - name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/017_files_templates/control.yml b/examples/017_files_templates/control.yml new file mode 100644 index 0000000..c6a8d81 --- /dev/null +++ b/examples/017_files_templates/control.yml @@ -0,0 +1,5 @@ +--- +- hosts: control + become: true + roles: + - control diff --git a/examples/017_files_templates/database.yml b/examples/017_files_templates/database.yml new file mode 100644 index 0000000..e22020d --- /dev/null +++ b/examples/017_files_templates/database.yml @@ -0,0 +1,5 @@ +--- +- hosts: database + become: true + roles: + - mysql diff --git a/examples/017_files_templates/demo/app/demo.py b/examples/017_files_templates/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/017_files_templates/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/017_files_templates/demo/app/demo.wsgi b/examples/017_files_templates/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/017_files_templates/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/017_files_templates/demo/app/requirements.txt b/examples/017_files_templates/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/017_files_templates/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/017_files_templates/demo/demo.conf b/examples/017_files_templates/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/017_files_templates/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/017_files_templates/loadbalancer.yml b/examples/017_files_templates/loadbalancer.yml new file mode 100644 index 0000000..651bc7d --- /dev/null +++ b/examples/017_files_templates/loadbalancer.yml @@ -0,0 +1,5 @@ +--- +- hosts: loadbalancer + become: true + roles: + - nginx diff --git a/examples/017_files_templates/playbooks/hostname.yml b/examples/017_files_templates/playbooks/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/017_files_templates/playbooks/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/017_files_templates/playbooks/stack_restart.yml b/examples/017_files_templates/playbooks/stack_restart.yml new file mode 100644 index 0000000..b55de3d --- /dev/null +++ b/examples/017_files_templates/playbooks/stack_restart.yml @@ -0,0 +1,33 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + - wait_for: port=80 state=drained + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + - wait_for: port=80 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + - wait_for: port=3306 state=started + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + - wait_for: port=80 + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started + - wait_for: port=80 diff --git a/examples/017_files_templates/playbooks/stack_status.yml b/examples/017_files_templates/playbooks/stack_status.yml new file mode 100644 index 0000000..0676295 --- /dev/null +++ b/examples/017_files_templates/playbooks/stack_status.yml @@ -0,0 +1,67 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: verify nginx service + command: service nginx status + + - name: verify nginx is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: webserver + become: true + tasks: + - name: verify apache2 service + command: service apache2 status + + - name: verify apache2 is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: database + become: true + tasks: + - name: verify mysql service + command: service mysql status + + - name: verify mysql is listening on 3306 + wait_for: port=3306 timeout=1 + +- hosts: control + tasks: + - name: verify end-to-end index response + uri: url=http://{{item}} return_content=yes + with_items: groups.loadbalancer + register: lb_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny' not in item.content" + with_items: "{{lb_index.results}}" + + - name: verify end-to-end db response + uri: url=http://{{item}}/db return_content=yes + with_items: groups.loadbalancer + register: lb_db + + - fail: msg="db failed to return content" + when: "'Database Connected from' not in item.content" + with_items: "{{lb_db.results}}" + +- hosts: loadbalancer + tasks: + - name: verify backend index response + uri: url=http://{{item}} return_content=yes + with_items: groups.webserver + register: app_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny {{item.item}}!' not in item.content" + with_items: "{{app_index.results}}" + + - name: verify backend db response + uri: url=http://{{item}}/db return_content=yes + with_items: groups.webserver + register: app_db + + - fail: msg="db failed to return content" + when: "'Database Connected from {{item.item}}!' not in item.content" + with_items: "{{app_db.results}}" diff --git a/examples/017_files_templates/roles/apache2/README.md b/examples/017_files_templates/roles/apache2/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/017_files_templates/roles/apache2/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/017_files_templates/roles/apache2/defaults/main.yml b/examples/017_files_templates/roles/apache2/defaults/main.yml new file mode 100644 index 0000000..0381169 --- /dev/null +++ b/examples/017_files_templates/roles/apache2/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for apache2 diff --git a/examples/017_files_templates/roles/apache2/handlers/main.yml b/examples/017_files_templates/roles/apache2/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/017_files_templates/roles/apache2/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/017_files_templates/roles/apache2/meta/main.yml b/examples/017_files_templates/roles/apache2/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/017_files_templates/roles/apache2/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/017_files_templates/roles/apache2/tasks/main.yml b/examples/017_files_templates/roles/apache2/tasks/main.yml new file mode 100644 index 0000000..2d0632f --- /dev/null +++ b/examples/017_files_templates/roles/apache2/tasks/main.yml @@ -0,0 +1,17 @@ +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi + +- name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + +- name: de-activate default apache site + file: path=/etc/apache2/sites-enabled/000-default.conf state=absent + notify: restart apache2 + +- name: ensure apache2 started + service: name=apache2 state=started enabled=yes diff --git a/examples/017_files_templates/roles/apache2/vars/main.yml b/examples/017_files_templates/roles/apache2/vars/main.yml new file mode 100644 index 0000000..5d23ceb --- /dev/null +++ b/examples/017_files_templates/roles/apache2/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for apache2 diff --git a/examples/017_files_templates/roles/control/README.md b/examples/017_files_templates/roles/control/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/017_files_templates/roles/control/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/017_files_templates/roles/control/defaults/main.yml b/examples/017_files_templates/roles/control/defaults/main.yml new file mode 100644 index 0000000..9fe52bd --- /dev/null +++ b/examples/017_files_templates/roles/control/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for control diff --git a/examples/017_files_templates/roles/control/handlers/main.yml b/examples/017_files_templates/roles/control/handlers/main.yml new file mode 100644 index 0000000..4136893 --- /dev/null +++ b/examples/017_files_templates/roles/control/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for control diff --git a/examples/017_files_templates/roles/control/meta/main.yml b/examples/017_files_templates/roles/control/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/017_files_templates/roles/control/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/017_files_templates/roles/control/tasks/main.yml b/examples/017_files_templates/roles/control/tasks/main.yml new file mode 100644 index 0000000..330e91c --- /dev/null +++ b/examples/017_files_templates/roles/control/tasks/main.yml @@ -0,0 +1,6 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - curl + - python-httplib2 diff --git a/examples/017_files_templates/roles/control/vars/main.yml b/examples/017_files_templates/roles/control/vars/main.yml new file mode 100644 index 0000000..eadc8b6 --- /dev/null +++ b/examples/017_files_templates/roles/control/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for control diff --git a/examples/017_files_templates/roles/demo_app/README.md b/examples/017_files_templates/roles/demo_app/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/017_files_templates/roles/demo_app/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/017_files_templates/roles/demo_app/defaults/main.yml b/examples/017_files_templates/roles/demo_app/defaults/main.yml new file mode 100644 index 0000000..914e957 --- /dev/null +++ b/examples/017_files_templates/roles/demo_app/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for demo_app diff --git a/examples/017_files_templates/roles/demo_app/files/demo/app/demo.py b/examples/017_files_templates/roles/demo_app/files/demo/app/demo.py new file mode 100644 index 0000000..f7897f0 --- /dev/null +++ b/examples/017_files_templates/roles/demo_app/files/demo/app/demo.py @@ -0,0 +1,23 @@ +from flask import Flask +from flask.ext.sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + try: + db.create_all() + except Exception as e: + return e.message + '\n' + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() diff --git a/examples/017_files_templates/roles/demo_app/files/demo/app/demo.wsgi b/examples/017_files_templates/roles/demo_app/files/demo/app/demo.wsgi new file mode 100644 index 0000000..f6453b3 --- /dev/null +++ b/examples/017_files_templates/roles/demo_app/files/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +execfile(activate_this, dict(__file__=activate_this)) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application diff --git a/examples/017_files_templates/roles/demo_app/files/demo/app/requirements.txt b/examples/017_files_templates/roles/demo_app/files/demo/app/requirements.txt new file mode 100644 index 0000000..451ff90 --- /dev/null +++ b/examples/017_files_templates/roles/demo_app/files/demo/app/requirements.txt @@ -0,0 +1,2 @@ +Flask==0.10.1 +Flask-SQLAlchemy==2.0 diff --git a/examples/017_files_templates/roles/demo_app/files/demo/demo.conf b/examples/017_files_templates/roles/demo_app/files/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/017_files_templates/roles/demo_app/files/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/017_files_templates/roles/demo_app/handlers/main.yml b/examples/017_files_templates/roles/demo_app/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/017_files_templates/roles/demo_app/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/017_files_templates/roles/demo_app/meta/main.yml b/examples/017_files_templates/roles/demo_app/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/017_files_templates/roles/demo_app/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/017_files_templates/roles/demo_app/tasks/main.yml b/examples/017_files_templates/roles/demo_app/tasks/main.yml new file mode 100644 index 0000000..05ff043 --- /dev/null +++ b/examples/017_files_templates/roles/demo_app/tasks/main.yml @@ -0,0 +1,23 @@ +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - python-pip + - python-virtualenv + - python-mysqldb + +- name: copy demo app source + copy: src=demo/app/ dest=/var/www/demo mode=0755 + notify: restart apache2 + +- name: copy apache virtual host config + copy: src=demo/demo.conf dest=/etc/apache2/sites-available mode=0755 + notify: restart apache2 + +- name: setup python virtualenv + pip: requirements=/var/www/demo/requirements.txt virtualenv=/var/www/demo/.venv + notify: restart apache2 + +- name: activate demo apache site + file: src=/etc/apache2/sites-available/demo.conf dest=/etc/apache2/sites-enabled/demo.conf state=link + notify: restart apache2 diff --git a/examples/017_files_templates/roles/demo_app/vars/main.yml b/examples/017_files_templates/roles/demo_app/vars/main.yml new file mode 100644 index 0000000..52fb613 --- /dev/null +++ b/examples/017_files_templates/roles/demo_app/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for demo_app diff --git a/examples/017_files_templates/roles/mysql/README.md b/examples/017_files_templates/roles/mysql/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/017_files_templates/roles/mysql/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/017_files_templates/roles/mysql/defaults/main.yml b/examples/017_files_templates/roles/mysql/defaults/main.yml new file mode 100644 index 0000000..e9ebcba --- /dev/null +++ b/examples/017_files_templates/roles/mysql/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for mysql diff --git a/examples/017_files_templates/roles/mysql/handlers/main.yml b/examples/017_files_templates/roles/mysql/handlers/main.yml new file mode 100644 index 0000000..3755d8c --- /dev/null +++ b/examples/017_files_templates/roles/mysql/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart mysql + service: name=mysql state=restarted diff --git a/examples/017_files_templates/roles/mysql/meta/main.yml b/examples/017_files_templates/roles/mysql/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/017_files_templates/roles/mysql/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/017_files_templates/roles/mysql/tasks/main.yml b/examples/017_files_templates/roles/mysql/tasks/main.yml new file mode 100644 index 0000000..af8cdcd --- /dev/null +++ b/examples/017_files_templates/roles/mysql/tasks/main.yml @@ -0,0 +1,21 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python-mysqldb + +- name: install mysql-server + apt: name=mysql-server state=present update_cache=yes + +- name: ensure mysql listening on all ports + lineinfile: dest=/etc/mysql/my.cnf regexp=^bind-address line="bind-address = 0.0.0.0" + notify: restart mysql + +- name: ensure mysql started + service: name=mysql state=started enabled=yes + +- name: create demo database + mysql_db: name=demo state=present + +- name: create demo user + mysql_user: name=demo password=demo priv=demo.*:ALL host='%' state=present diff --git a/examples/017_files_templates/roles/mysql/vars/main.yml b/examples/017_files_templates/roles/mysql/vars/main.yml new file mode 100644 index 0000000..a79bfed --- /dev/null +++ b/examples/017_files_templates/roles/mysql/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for mysql diff --git a/examples/017_files_templates/roles/nginx/README.md b/examples/017_files_templates/roles/nginx/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/017_files_templates/roles/nginx/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/017_files_templates/roles/nginx/defaults/main.yml b/examples/017_files_templates/roles/nginx/defaults/main.yml new file mode 100644 index 0000000..78c8c76 --- /dev/null +++ b/examples/017_files_templates/roles/nginx/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for nginx diff --git a/examples/017_files_templates/roles/nginx/handlers/main.yml b/examples/017_files_templates/roles/nginx/handlers/main.yml new file mode 100644 index 0000000..92971d2 --- /dev/null +++ b/examples/017_files_templates/roles/nginx/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart nginx + service: name=nginx state=restarted diff --git a/examples/017_files_templates/roles/nginx/meta/main.yml b/examples/017_files_templates/roles/nginx/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/017_files_templates/roles/nginx/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/017_files_templates/roles/nginx/tasks/main.yml b/examples/017_files_templates/roles/nginx/tasks/main.yml new file mode 100644 index 0000000..69c6461 --- /dev/null +++ b/examples/017_files_templates/roles/nginx/tasks/main.yml @@ -0,0 +1,23 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python-httplib2 + +- name: install nginx + apt: name=nginx state=present update_cache=yes + +- name: configure nginx site + template: src=nginx.conf.j2 dest=/etc/nginx/sites-available/demo mode=0644 + notify: restart nginx + +- name: de-activate default nginx site + file: path=/etc/nginx/sites-enabled/default state=absent + notify: restart nginx + +- name: activate demo nginx site + file: src=/etc/nginx/sites-available/demo dest=/etc/nginx/sites-enabled/demo state=link + notify: restart nginx + +- name: ensure nginx started + service: name=nginx state=started enabled=yes diff --git a/examples/017_files_templates/roles/nginx/templates/nginx.conf.j2 b/examples/017_files_templates/roles/nginx/templates/nginx.conf.j2 new file mode 100644 index 0000000..4b477b6 --- /dev/null +++ b/examples/017_files_templates/roles/nginx/templates/nginx.conf.j2 @@ -0,0 +1,13 @@ +upstream demo { +{% for server in groups.webserver %} + server {{ server }}; +{% endfor %} +} + +server { + listen 80; + + location / { + proxy_pass http://demo; + } +} diff --git a/examples/017_files_templates/roles/nginx/vars/main.yml b/examples/017_files_templates/roles/nginx/vars/main.yml new file mode 100644 index 0000000..d45faf6 --- /dev/null +++ b/examples/017_files_templates/roles/nginx/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for nginx diff --git a/examples/017_files_templates/webserver.yml b/examples/017_files_templates/webserver.yml new file mode 100644 index 0000000..195ec7f --- /dev/null +++ b/examples/017_files_templates/webserver.yml @@ -0,0 +1,6 @@ +--- +- hosts: webserver + become: true + roles: + - apache2 + - demo_app diff --git a/examples/018_site_yml/control.yml b/examples/018_site_yml/control.yml new file mode 100644 index 0000000..c6a8d81 --- /dev/null +++ b/examples/018_site_yml/control.yml @@ -0,0 +1,5 @@ +--- +- hosts: control + become: true + roles: + - control diff --git a/examples/018_site_yml/database.yml b/examples/018_site_yml/database.yml new file mode 100644 index 0000000..e22020d --- /dev/null +++ b/examples/018_site_yml/database.yml @@ -0,0 +1,5 @@ +--- +- hosts: database + become: true + roles: + - mysql diff --git a/examples/018_site_yml/demo/app/demo.py b/examples/018_site_yml/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/018_site_yml/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/018_site_yml/demo/app/demo.wsgi b/examples/018_site_yml/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/018_site_yml/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/018_site_yml/demo/app/requirements.txt b/examples/018_site_yml/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/018_site_yml/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/018_site_yml/demo/demo.conf b/examples/018_site_yml/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/018_site_yml/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/018_site_yml/loadbalancer.yml b/examples/018_site_yml/loadbalancer.yml new file mode 100644 index 0000000..63f0c1a --- /dev/null +++ b/examples/018_site_yml/loadbalancer.yml @@ -0,0 +1,28 @@ +--- +- hosts: loadbalancer + become: true + roles: + - nginx + - haproxy + - keepalived + vars: + nginx_http_port: 80 + nginx_https_port: 443 + nginx_http2: true + nginx_ssl_certificate: "/etc/ssl/certs/ssl-cert-snakeoil.pem" + nginx_ssl_certificate_key: "/etc/ssl/private/ssl-cert-snakeoil.key" + haproxy_frontend_port: 80 + haproxy_backend_servers: + - { name: "web1", address: "0.0.0.0", port: 80 } + keepalived_vrrp_id: 51 + keepalived_vrrp_priority: 100 + keepalived_vrrp_auth_pass: "password" + keepalived_vrrp_virtual_ip: "" # Set this to the virtual IP you want to use + keepalived_vrrp_state: "MASTER" # Set to "BACKUP" for the secondary load balancer + keepalived_vrrp_interface: "eth0" # Change to your network interface + keepalived_vrrp_virtual_router_id: 51 # Must match the ID used by the other load balancer + keepalived_vrrp_unicast_peer: [] # Add IPs of other load balancers if needed + keepalived_vrrp_unicast_src_ip: "" # Set to the source IP for unicast communication + keepalived_vrrp_track_script: "check_haproxy" + keepalived_vrrp_script_name: "check_haproxy" + diff --git a/examples/018_site_yml/playbooks/hostname.yml b/examples/018_site_yml/playbooks/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/018_site_yml/playbooks/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/018_site_yml/playbooks/stack_restart.yml b/examples/018_site_yml/playbooks/stack_restart.yml new file mode 100644 index 0000000..b55de3d --- /dev/null +++ b/examples/018_site_yml/playbooks/stack_restart.yml @@ -0,0 +1,33 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + - wait_for: port=80 state=drained + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + - wait_for: port=80 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + - wait_for: port=3306 state=started + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + - wait_for: port=80 + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started + - wait_for: port=80 diff --git a/examples/018_site_yml/playbooks/stack_status.yml b/examples/018_site_yml/playbooks/stack_status.yml new file mode 100644 index 0000000..0676295 --- /dev/null +++ b/examples/018_site_yml/playbooks/stack_status.yml @@ -0,0 +1,67 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: verify nginx service + command: service nginx status + + - name: verify nginx is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: webserver + become: true + tasks: + - name: verify apache2 service + command: service apache2 status + + - name: verify apache2 is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: database + become: true + tasks: + - name: verify mysql service + command: service mysql status + + - name: verify mysql is listening on 3306 + wait_for: port=3306 timeout=1 + +- hosts: control + tasks: + - name: verify end-to-end index response + uri: url=http://{{item}} return_content=yes + with_items: groups.loadbalancer + register: lb_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny' not in item.content" + with_items: "{{lb_index.results}}" + + - name: verify end-to-end db response + uri: url=http://{{item}}/db return_content=yes + with_items: groups.loadbalancer + register: lb_db + + - fail: msg="db failed to return content" + when: "'Database Connected from' not in item.content" + with_items: "{{lb_db.results}}" + +- hosts: loadbalancer + tasks: + - name: verify backend index response + uri: url=http://{{item}} return_content=yes + with_items: groups.webserver + register: app_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny {{item.item}}!' not in item.content" + with_items: "{{app_index.results}}" + + - name: verify backend db response + uri: url=http://{{item}}/db return_content=yes + with_items: groups.webserver + register: app_db + + - fail: msg="db failed to return content" + when: "'Database Connected from {{item.item}}!' not in item.content" + with_items: "{{app_db.results}}" diff --git a/examples/018_site_yml/roles/apache2/README.md b/examples/018_site_yml/roles/apache2/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/018_site_yml/roles/apache2/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/018_site_yml/roles/apache2/defaults/main.yml b/examples/018_site_yml/roles/apache2/defaults/main.yml new file mode 100644 index 0000000..0381169 --- /dev/null +++ b/examples/018_site_yml/roles/apache2/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for apache2 diff --git a/examples/018_site_yml/roles/apache2/handlers/main.yml b/examples/018_site_yml/roles/apache2/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/018_site_yml/roles/apache2/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/018_site_yml/roles/apache2/meta/main.yml b/examples/018_site_yml/roles/apache2/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/018_site_yml/roles/apache2/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/018_site_yml/roles/apache2/tasks/main.yml b/examples/018_site_yml/roles/apache2/tasks/main.yml new file mode 100644 index 0000000..2d0632f --- /dev/null +++ b/examples/018_site_yml/roles/apache2/tasks/main.yml @@ -0,0 +1,17 @@ +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi + +- name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + +- name: de-activate default apache site + file: path=/etc/apache2/sites-enabled/000-default.conf state=absent + notify: restart apache2 + +- name: ensure apache2 started + service: name=apache2 state=started enabled=yes diff --git a/examples/018_site_yml/roles/apache2/vars/main.yml b/examples/018_site_yml/roles/apache2/vars/main.yml new file mode 100644 index 0000000..5d23ceb --- /dev/null +++ b/examples/018_site_yml/roles/apache2/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for apache2 diff --git a/examples/018_site_yml/roles/control/README.md b/examples/018_site_yml/roles/control/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/018_site_yml/roles/control/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/018_site_yml/roles/control/defaults/main.yml b/examples/018_site_yml/roles/control/defaults/main.yml new file mode 100644 index 0000000..9fe52bd --- /dev/null +++ b/examples/018_site_yml/roles/control/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for control diff --git a/examples/018_site_yml/roles/control/handlers/main.yml b/examples/018_site_yml/roles/control/handlers/main.yml new file mode 100644 index 0000000..4136893 --- /dev/null +++ b/examples/018_site_yml/roles/control/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for control diff --git a/examples/018_site_yml/roles/control/meta/main.yml b/examples/018_site_yml/roles/control/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/018_site_yml/roles/control/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/018_site_yml/roles/control/tasks/main.yml b/examples/018_site_yml/roles/control/tasks/main.yml new file mode 100644 index 0000000..330e91c --- /dev/null +++ b/examples/018_site_yml/roles/control/tasks/main.yml @@ -0,0 +1,6 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - curl + - python-httplib2 diff --git a/examples/018_site_yml/roles/control/vars/main.yml b/examples/018_site_yml/roles/control/vars/main.yml new file mode 100644 index 0000000..eadc8b6 --- /dev/null +++ b/examples/018_site_yml/roles/control/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for control diff --git a/examples/018_site_yml/roles/demo_app/README.md b/examples/018_site_yml/roles/demo_app/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/018_site_yml/roles/demo_app/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/018_site_yml/roles/demo_app/defaults/main.yml b/examples/018_site_yml/roles/demo_app/defaults/main.yml new file mode 100644 index 0000000..914e957 --- /dev/null +++ b/examples/018_site_yml/roles/demo_app/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for demo_app diff --git a/examples/018_site_yml/roles/demo_app/files/demo/app/demo.py b/examples/018_site_yml/roles/demo_app/files/demo/app/demo.py new file mode 100644 index 0000000..f7897f0 --- /dev/null +++ b/examples/018_site_yml/roles/demo_app/files/demo/app/demo.py @@ -0,0 +1,23 @@ +from flask import Flask +from flask.ext.sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + try: + db.create_all() + except Exception as e: + return e.message + '\n' + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() diff --git a/examples/018_site_yml/roles/demo_app/files/demo/app/demo.wsgi b/examples/018_site_yml/roles/demo_app/files/demo/app/demo.wsgi new file mode 100644 index 0000000..f6453b3 --- /dev/null +++ b/examples/018_site_yml/roles/demo_app/files/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +execfile(activate_this, dict(__file__=activate_this)) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application diff --git a/examples/018_site_yml/roles/demo_app/files/demo/app/requirements.txt b/examples/018_site_yml/roles/demo_app/files/demo/app/requirements.txt new file mode 100644 index 0000000..451ff90 --- /dev/null +++ b/examples/018_site_yml/roles/demo_app/files/demo/app/requirements.txt @@ -0,0 +1,2 @@ +Flask==0.10.1 +Flask-SQLAlchemy==2.0 diff --git a/examples/018_site_yml/roles/demo_app/files/demo/demo.conf b/examples/018_site_yml/roles/demo_app/files/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/018_site_yml/roles/demo_app/files/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/018_site_yml/roles/demo_app/handlers/main.yml b/examples/018_site_yml/roles/demo_app/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/018_site_yml/roles/demo_app/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/018_site_yml/roles/demo_app/meta/main.yml b/examples/018_site_yml/roles/demo_app/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/018_site_yml/roles/demo_app/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/018_site_yml/roles/demo_app/tasks/main.yml b/examples/018_site_yml/roles/demo_app/tasks/main.yml new file mode 100644 index 0000000..c5e1f3a --- /dev/null +++ b/examples/018_site_yml/roles/demo_app/tasks/main.yml @@ -0,0 +1,23 @@ +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - python-pip-whl + - python3-virtualenv + - python3-mysqldb + +- name: copy demo app source + copy: src=demo/app/ dest=/var/www/demo mode=0755 + notify: restart apache2 + +- name: copy apache virtual host config + copy: src=demo/demo.conf dest=/etc/apache2/sites-available mode=0755 + notify: restart apache2 + +- name: setup python virtualenv + pip: requirements=/var/www/demo/requirements.txt virtualenv=/var/www/demo/.venv + notify: restart apache2 + +- name: activate demo apache site + file: src=/etc/apache2/sites-available/demo.conf dest=/etc/apache2/sites-enabled/demo.conf state=link + notify: restart apache2 diff --git a/examples/018_site_yml/roles/demo_app/vars/main.yml b/examples/018_site_yml/roles/demo_app/vars/main.yml new file mode 100644 index 0000000..52fb613 --- /dev/null +++ b/examples/018_site_yml/roles/demo_app/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for demo_app diff --git a/examples/018_site_yml/roles/mysql/README.md b/examples/018_site_yml/roles/mysql/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/018_site_yml/roles/mysql/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/018_site_yml/roles/mysql/defaults/main.yml b/examples/018_site_yml/roles/mysql/defaults/main.yml new file mode 100644 index 0000000..e9ebcba --- /dev/null +++ b/examples/018_site_yml/roles/mysql/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for mysql diff --git a/examples/018_site_yml/roles/mysql/handlers/main.yml b/examples/018_site_yml/roles/mysql/handlers/main.yml new file mode 100644 index 0000000..3755d8c --- /dev/null +++ b/examples/018_site_yml/roles/mysql/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart mysql + service: name=mysql state=restarted diff --git a/examples/018_site_yml/roles/mysql/meta/main.yml b/examples/018_site_yml/roles/mysql/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/018_site_yml/roles/mysql/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/018_site_yml/roles/mysql/tasks/main.yml b/examples/018_site_yml/roles/mysql/tasks/main.yml new file mode 100644 index 0000000..b5990b7 --- /dev/null +++ b/examples/018_site_yml/roles/mysql/tasks/main.yml @@ -0,0 +1,21 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python3-mysqldb + +- name: install mysql-server + apt: name=mysql-server state=present update_cache=yes + +- name: ensure mysql listening on all ports + lineinfile: dest=/etc/mysql/my.cnf regexp=^bind-address line="bind-address = 0.0.0.0" + notify: restart mysql + +- name: ensure mysql started + service: name=mysql state=started enabled=yes + +- name: create demo database + mysql_db: name=demo state=present + +- name: create demo user + mysql_user: name=demo password=demo priv=demo.*:ALL host='%' state=present diff --git a/examples/018_site_yml/roles/mysql/vars/main.yml b/examples/018_site_yml/roles/mysql/vars/main.yml new file mode 100644 index 0000000..a79bfed --- /dev/null +++ b/examples/018_site_yml/roles/mysql/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for mysql diff --git a/examples/018_site_yml/roles/nginx/README.md b/examples/018_site_yml/roles/nginx/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/018_site_yml/roles/nginx/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/018_site_yml/roles/nginx/defaults/main.yml b/examples/018_site_yml/roles/nginx/defaults/main.yml new file mode 100644 index 0000000..78c8c76 --- /dev/null +++ b/examples/018_site_yml/roles/nginx/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for nginx diff --git a/examples/018_site_yml/roles/nginx/handlers/main.yml b/examples/018_site_yml/roles/nginx/handlers/main.yml new file mode 100644 index 0000000..92971d2 --- /dev/null +++ b/examples/018_site_yml/roles/nginx/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart nginx + service: name=nginx state=restarted diff --git a/examples/018_site_yml/roles/nginx/meta/main.yml b/examples/018_site_yml/roles/nginx/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/018_site_yml/roles/nginx/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/018_site_yml/roles/nginx/tasks/main.yml b/examples/018_site_yml/roles/nginx/tasks/main.yml new file mode 100644 index 0000000..69c6461 --- /dev/null +++ b/examples/018_site_yml/roles/nginx/tasks/main.yml @@ -0,0 +1,23 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python-httplib2 + +- name: install nginx + apt: name=nginx state=present update_cache=yes + +- name: configure nginx site + template: src=nginx.conf.j2 dest=/etc/nginx/sites-available/demo mode=0644 + notify: restart nginx + +- name: de-activate default nginx site + file: path=/etc/nginx/sites-enabled/default state=absent + notify: restart nginx + +- name: activate demo nginx site + file: src=/etc/nginx/sites-available/demo dest=/etc/nginx/sites-enabled/demo state=link + notify: restart nginx + +- name: ensure nginx started + service: name=nginx state=started enabled=yes diff --git a/examples/018_site_yml/roles/nginx/templates/nginx.conf.j2 b/examples/018_site_yml/roles/nginx/templates/nginx.conf.j2 new file mode 100644 index 0000000..4b477b6 --- /dev/null +++ b/examples/018_site_yml/roles/nginx/templates/nginx.conf.j2 @@ -0,0 +1,13 @@ +upstream demo { +{% for server in groups.webserver %} + server {{ server }}; +{% endfor %} +} + +server { + listen 80; + + location / { + proxy_pass http://demo; + } +} diff --git a/examples/018_site_yml/roles/nginx/vars/main.yml b/examples/018_site_yml/roles/nginx/vars/main.yml new file mode 100644 index 0000000..d45faf6 --- /dev/null +++ b/examples/018_site_yml/roles/nginx/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for nginx diff --git a/examples/018_site_yml/site.yml b/examples/018_site_yml/site.yml new file mode 100644 index 0000000..0cb3dd0 --- /dev/null +++ b/examples/018_site_yml/site.yml @@ -0,0 +1,5 @@ +--- +- include: control.yml +- include: database.yml +- include: webserver.yml +- include: loadbalancer.yml diff --git a/examples/018_site_yml/webserver.yml b/examples/018_site_yml/webserver.yml new file mode 100644 index 0000000..195ec7f --- /dev/null +++ b/examples/018_site_yml/webserver.yml @@ -0,0 +1,6 @@ +--- +- hosts: webserver + become: true + roles: + - apache2 + - demo_app diff --git a/examples/019_facts/control.yml b/examples/019_facts/control.yml new file mode 100644 index 0000000..c6a8d81 --- /dev/null +++ b/examples/019_facts/control.yml @@ -0,0 +1,5 @@ +--- +- hosts: control + become: true + roles: + - control diff --git a/examples/019_facts/database.yml b/examples/019_facts/database.yml new file mode 100644 index 0000000..e22020d --- /dev/null +++ b/examples/019_facts/database.yml @@ -0,0 +1,5 @@ +--- +- hosts: database + become: true + roles: + - mysql diff --git a/examples/019_facts/demo/app/demo.py b/examples/019_facts/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/019_facts/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/019_facts/demo/app/demo.wsgi b/examples/019_facts/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/019_facts/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/019_facts/demo/app/requirements.txt b/examples/019_facts/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/019_facts/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/019_facts/demo/demo.conf b/examples/019_facts/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/019_facts/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/019_facts/loadbalancer.yml b/examples/019_facts/loadbalancer.yml new file mode 100644 index 0000000..651bc7d --- /dev/null +++ b/examples/019_facts/loadbalancer.yml @@ -0,0 +1,5 @@ +--- +- hosts: loadbalancer + become: true + roles: + - nginx diff --git a/examples/019_facts/playbooks/hostname.yml b/examples/019_facts/playbooks/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/019_facts/playbooks/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/019_facts/playbooks/stack_restart.yml b/examples/019_facts/playbooks/stack_restart.yml new file mode 100644 index 0000000..d89c326 --- /dev/null +++ b/examples/019_facts/playbooks/stack_restart.yml @@ -0,0 +1,33 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + - wait_for: port=80 state=drained + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + - wait_for: port=80 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + - wait_for: host={{ ansible_eth0.ipv4.address }} port=3306 state=started + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + - wait_for: port=80 + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started + - wait_for: port=80 diff --git a/examples/019_facts/playbooks/stack_status.yml b/examples/019_facts/playbooks/stack_status.yml new file mode 100644 index 0000000..9c8be07 --- /dev/null +++ b/examples/019_facts/playbooks/stack_status.yml @@ -0,0 +1,67 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: verify nginx service + command: service nginx status + + - name: verify nginx is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: webserver + become: true + tasks: + - name: verify apache2 service + command: service apache2 status + + - name: verify apache2 is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: database + become: true + tasks: + - name: verify mysql service + command: service mysql status + + - name: verify mysql is listening on 3306 + wait_for: host={{ ansible_eth0.ipv4.address }} port=3306 timeout=1 + +- hosts: control + tasks: + - name: verify end-to-end index response + uri: url=http://{{item}} return_content=yes + with_items: "{{ groups.loadbalancer }}" + register: lb_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny' not in item.content" + with_items: "{{lb_index.results}}" + + - name: verify end-to-end db response + uri: url=http://{{item}}/db return_content=yes + with_items: "{{ groups.loadbalancer }}" + register: lb_db + + - fail: msg="db failed to return content" + when: "'Database Connected from' not in item.content" + with_items: "{{lb_db.results}}" + +- hosts: loadbalancer + tasks: + - name: verify backend index response + uri: url=http://{{item}} return_content=yes + with_items: "{{ groups.webserver }}" + register: app_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny' not in item.content" + with_items: "{{app_index.results}}" + + - name: verify backend db response + uri: url=http://{{item}}/db return_content=yes + with_items: "{{ groups.webserver }}" + register: app_db + + - fail: msg="db failed to return content" + when: "'Database Connected' not in item.content" + with_items: "{{app_db.results}}" diff --git a/examples/019_facts/roles/apache2/README.md b/examples/019_facts/roles/apache2/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/019_facts/roles/apache2/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/019_facts/roles/apache2/defaults/main.yml b/examples/019_facts/roles/apache2/defaults/main.yml new file mode 100644 index 0000000..0381169 --- /dev/null +++ b/examples/019_facts/roles/apache2/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for apache2 diff --git a/examples/019_facts/roles/apache2/handlers/main.yml b/examples/019_facts/roles/apache2/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/019_facts/roles/apache2/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/019_facts/roles/apache2/meta/main.yml b/examples/019_facts/roles/apache2/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/019_facts/roles/apache2/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/019_facts/roles/apache2/tasks/main.yml b/examples/019_facts/roles/apache2/tasks/main.yml new file mode 100644 index 0000000..2d0632f --- /dev/null +++ b/examples/019_facts/roles/apache2/tasks/main.yml @@ -0,0 +1,17 @@ +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi + +- name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + +- name: de-activate default apache site + file: path=/etc/apache2/sites-enabled/000-default.conf state=absent + notify: restart apache2 + +- name: ensure apache2 started + service: name=apache2 state=started enabled=yes diff --git a/examples/019_facts/roles/apache2/vars/main.yml b/examples/019_facts/roles/apache2/vars/main.yml new file mode 100644 index 0000000..5d23ceb --- /dev/null +++ b/examples/019_facts/roles/apache2/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for apache2 diff --git a/examples/019_facts/roles/control/README.md b/examples/019_facts/roles/control/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/019_facts/roles/control/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/019_facts/roles/control/defaults/main.yml b/examples/019_facts/roles/control/defaults/main.yml new file mode 100644 index 0000000..9fe52bd --- /dev/null +++ b/examples/019_facts/roles/control/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for control diff --git a/examples/019_facts/roles/control/handlers/main.yml b/examples/019_facts/roles/control/handlers/main.yml new file mode 100644 index 0000000..4136893 --- /dev/null +++ b/examples/019_facts/roles/control/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for control diff --git a/examples/019_facts/roles/control/meta/main.yml b/examples/019_facts/roles/control/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/019_facts/roles/control/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/019_facts/roles/control/tasks/main.yml b/examples/019_facts/roles/control/tasks/main.yml new file mode 100644 index 0000000..330e91c --- /dev/null +++ b/examples/019_facts/roles/control/tasks/main.yml @@ -0,0 +1,6 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - curl + - python-httplib2 diff --git a/examples/019_facts/roles/control/vars/main.yml b/examples/019_facts/roles/control/vars/main.yml new file mode 100644 index 0000000..eadc8b6 --- /dev/null +++ b/examples/019_facts/roles/control/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for control diff --git a/examples/019_facts/roles/demo_app/README.md b/examples/019_facts/roles/demo_app/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/019_facts/roles/demo_app/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/019_facts/roles/demo_app/defaults/main.yml b/examples/019_facts/roles/demo_app/defaults/main.yml new file mode 100644 index 0000000..914e957 --- /dev/null +++ b/examples/019_facts/roles/demo_app/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for demo_app diff --git a/examples/019_facts/roles/demo_app/files/demo/app/demo.py b/examples/019_facts/roles/demo_app/files/demo/app/demo.py new file mode 100644 index 0000000..f7897f0 --- /dev/null +++ b/examples/019_facts/roles/demo_app/files/demo/app/demo.py @@ -0,0 +1,23 @@ +from flask import Flask +from flask.ext.sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + try: + db.create_all() + except Exception as e: + return e.message + '\n' + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() diff --git a/examples/019_facts/roles/demo_app/files/demo/app/demo.wsgi b/examples/019_facts/roles/demo_app/files/demo/app/demo.wsgi new file mode 100644 index 0000000..f6453b3 --- /dev/null +++ b/examples/019_facts/roles/demo_app/files/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +execfile(activate_this, dict(__file__=activate_this)) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application diff --git a/examples/019_facts/roles/demo_app/files/demo/app/requirements.txt b/examples/019_facts/roles/demo_app/files/demo/app/requirements.txt new file mode 100644 index 0000000..451ff90 --- /dev/null +++ b/examples/019_facts/roles/demo_app/files/demo/app/requirements.txt @@ -0,0 +1,2 @@ +Flask==0.10.1 +Flask-SQLAlchemy==2.0 diff --git a/examples/019_facts/roles/demo_app/files/demo/demo.conf b/examples/019_facts/roles/demo_app/files/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/019_facts/roles/demo_app/files/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/019_facts/roles/demo_app/handlers/main.yml b/examples/019_facts/roles/demo_app/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/019_facts/roles/demo_app/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/019_facts/roles/demo_app/meta/main.yml b/examples/019_facts/roles/demo_app/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/019_facts/roles/demo_app/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/019_facts/roles/demo_app/tasks/main.yml b/examples/019_facts/roles/demo_app/tasks/main.yml new file mode 100644 index 0000000..c5e1f3a --- /dev/null +++ b/examples/019_facts/roles/demo_app/tasks/main.yml @@ -0,0 +1,23 @@ +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - python-pip-whl + - python3-virtualenv + - python3-mysqldb + +- name: copy demo app source + copy: src=demo/app/ dest=/var/www/demo mode=0755 + notify: restart apache2 + +- name: copy apache virtual host config + copy: src=demo/demo.conf dest=/etc/apache2/sites-available mode=0755 + notify: restart apache2 + +- name: setup python virtualenv + pip: requirements=/var/www/demo/requirements.txt virtualenv=/var/www/demo/.venv + notify: restart apache2 + +- name: activate demo apache site + file: src=/etc/apache2/sites-available/demo.conf dest=/etc/apache2/sites-enabled/demo.conf state=link + notify: restart apache2 diff --git a/examples/019_facts/roles/demo_app/vars/main.yml b/examples/019_facts/roles/demo_app/vars/main.yml new file mode 100644 index 0000000..52fb613 --- /dev/null +++ b/examples/019_facts/roles/demo_app/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for demo_app diff --git a/examples/019_facts/roles/mysql/README.md b/examples/019_facts/roles/mysql/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/019_facts/roles/mysql/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/019_facts/roles/mysql/defaults/main.yml b/examples/019_facts/roles/mysql/defaults/main.yml new file mode 100644 index 0000000..e9ebcba --- /dev/null +++ b/examples/019_facts/roles/mysql/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for mysql diff --git a/examples/019_facts/roles/mysql/handlers/main.yml b/examples/019_facts/roles/mysql/handlers/main.yml new file mode 100644 index 0000000..3755d8c --- /dev/null +++ b/examples/019_facts/roles/mysql/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart mysql + service: name=mysql state=restarted diff --git a/examples/019_facts/roles/mysql/meta/main.yml b/examples/019_facts/roles/mysql/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/019_facts/roles/mysql/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/019_facts/roles/mysql/tasks/main.yml b/examples/019_facts/roles/mysql/tasks/main.yml new file mode 100644 index 0000000..163a18f --- /dev/null +++ b/examples/019_facts/roles/mysql/tasks/main.yml @@ -0,0 +1,26 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python3-mysqldb + - mysql-server + +- name: install mysql-server + apt: name=mysql-server state=present update_cache=yes + +- name: copy original config file + copy: src=files/my.cnf dest=/etc/mysql/my.cnf owner=mysql group=mysql mode=0700 + +- name: ensure mysql listening on all ports + lineinfile: dest=/etc/mysql/my.cnf regexp=^bind-address + line="bind-address = {{ ansible_eth0.ipv4.address }}" + notify: restart mysql + +- name: ensure mysql started + service: name=mysql state=started enabled=yes + +- name: create demo database + mysql_db: name=demo state=present + +- name: create demo user + mysql_user: name=demo password=demo priv=demo.*:ALL host='%' state=present diff --git a/examples/019_facts/roles/mysql/vars/main.yml b/examples/019_facts/roles/mysql/vars/main.yml new file mode 100644 index 0000000..a79bfed --- /dev/null +++ b/examples/019_facts/roles/mysql/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for mysql diff --git a/examples/019_facts/roles/nginx/README.md b/examples/019_facts/roles/nginx/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/019_facts/roles/nginx/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/019_facts/roles/nginx/defaults/main.yml b/examples/019_facts/roles/nginx/defaults/main.yml new file mode 100644 index 0000000..78c8c76 --- /dev/null +++ b/examples/019_facts/roles/nginx/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for nginx diff --git a/examples/019_facts/roles/nginx/handlers/main.yml b/examples/019_facts/roles/nginx/handlers/main.yml new file mode 100644 index 0000000..92971d2 --- /dev/null +++ b/examples/019_facts/roles/nginx/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart nginx + service: name=nginx state=restarted diff --git a/examples/019_facts/roles/nginx/meta/main.yml b/examples/019_facts/roles/nginx/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/019_facts/roles/nginx/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/019_facts/roles/nginx/tasks/main.yml b/examples/019_facts/roles/nginx/tasks/main.yml new file mode 100644 index 0000000..69c6461 --- /dev/null +++ b/examples/019_facts/roles/nginx/tasks/main.yml @@ -0,0 +1,23 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python-httplib2 + +- name: install nginx + apt: name=nginx state=present update_cache=yes + +- name: configure nginx site + template: src=nginx.conf.j2 dest=/etc/nginx/sites-available/demo mode=0644 + notify: restart nginx + +- name: de-activate default nginx site + file: path=/etc/nginx/sites-enabled/default state=absent + notify: restart nginx + +- name: activate demo nginx site + file: src=/etc/nginx/sites-available/demo dest=/etc/nginx/sites-enabled/demo state=link + notify: restart nginx + +- name: ensure nginx started + service: name=nginx state=started enabled=yes diff --git a/examples/019_facts/roles/nginx/templates/nginx.conf.j2 b/examples/019_facts/roles/nginx/templates/nginx.conf.j2 new file mode 100644 index 0000000..4b477b6 --- /dev/null +++ b/examples/019_facts/roles/nginx/templates/nginx.conf.j2 @@ -0,0 +1,13 @@ +upstream demo { +{% for server in groups.webserver %} + server {{ server }}; +{% endfor %} +} + +server { + listen 80; + + location / { + proxy_pass http://demo; + } +} diff --git a/examples/019_facts/roles/nginx/vars/main.yml b/examples/019_facts/roles/nginx/vars/main.yml new file mode 100644 index 0000000..d45faf6 --- /dev/null +++ b/examples/019_facts/roles/nginx/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for nginx diff --git a/examples/019_facts/site.yml b/examples/019_facts/site.yml new file mode 100644 index 0000000..7299e9e --- /dev/null +++ b/examples/019_facts/site.yml @@ -0,0 +1,6 @@ +--- +- include: control.yml +- include: database.yml +- include: webserver.yml +- include: loadbalancer.yml +- include: playbooks/stack_status.yml diff --git a/examples/019_facts/webserver.yml b/examples/019_facts/webserver.yml new file mode 100644 index 0000000..195ec7f --- /dev/null +++ b/examples/019_facts/webserver.yml @@ -0,0 +1,6 @@ +--- +- hosts: webserver + become: true + roles: + - apache2 + - demo_app diff --git a/examples/020_defaults/control.yml b/examples/020_defaults/control.yml new file mode 100644 index 0000000..c6a8d81 --- /dev/null +++ b/examples/020_defaults/control.yml @@ -0,0 +1,5 @@ +--- +- hosts: control + become: true + roles: + - control diff --git a/examples/020_defaults/database.yml b/examples/020_defaults/database.yml new file mode 100644 index 0000000..e22020d --- /dev/null +++ b/examples/020_defaults/database.yml @@ -0,0 +1,5 @@ +--- +- hosts: database + become: true + roles: + - mysql diff --git a/examples/020_defaults/demo/app/demo.py b/examples/020_defaults/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/020_defaults/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/020_defaults/demo/app/demo.wsgi b/examples/020_defaults/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/020_defaults/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/020_defaults/demo/app/requirements.txt b/examples/020_defaults/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/020_defaults/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/020_defaults/demo/demo.conf b/examples/020_defaults/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/020_defaults/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/020_defaults/loadbalancer.yml b/examples/020_defaults/loadbalancer.yml new file mode 100644 index 0000000..651bc7d --- /dev/null +++ b/examples/020_defaults/loadbalancer.yml @@ -0,0 +1,5 @@ +--- +- hosts: loadbalancer + become: true + roles: + - nginx diff --git a/examples/020_defaults/playbooks/hostname.yml b/examples/020_defaults/playbooks/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/020_defaults/playbooks/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/020_defaults/playbooks/stack_restart.yml b/examples/020_defaults/playbooks/stack_restart.yml new file mode 100644 index 0000000..d89c326 --- /dev/null +++ b/examples/020_defaults/playbooks/stack_restart.yml @@ -0,0 +1,33 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + - wait_for: port=80 state=drained + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + - wait_for: port=80 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + - wait_for: host={{ ansible_eth0.ipv4.address }} port=3306 state=started + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + - wait_for: port=80 + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started + - wait_for: port=80 diff --git a/examples/020_defaults/playbooks/stack_status.yml b/examples/020_defaults/playbooks/stack_status.yml new file mode 100644 index 0000000..32fcb9a --- /dev/null +++ b/examples/020_defaults/playbooks/stack_status.yml @@ -0,0 +1,67 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: verify nginx service + command: service nginx status + + - name: verify nginx is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: webserver + become: true + tasks: + - name: verify apache2 service + command: service apache2 status + + - name: verify apache2 is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: database + become: true + tasks: + - name: verify mysql service + command: service mysql status + + - name: verify mysql is listening on 3306 + wait_for: port=3306 timeout=1 + +- hosts: control + tasks: + - name: verify end-to-end index response + uri: url=http://{{item}} return_content=yes + with_items: groups.loadbalancer + register: lb_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny' not in item.content" + with_items: "{{lb_index.results}}" + + - name: verify end-to-end db response + uri: url=http://{{item}}/db return_content=yes + with_items: groups.loadbalancer + register: lb_db + + - fail: msg="db failed to return content" + when: "'Database Connected from' not in item.content" + with_items: "{{lb_db.results}}" + +- hosts: loadbalancer + tasks: + - name: verify backend index response + uri: url=http://{{item}} return_content=yes + with_items: groups.webserver + register: app_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny' not in item.content" + with_items: "{{app_index.results}}" + + - name: verify backend db response + uri: url=http://{{item}}/db return_content=yes + with_items: groups.webserver + register: app_db + + - fail: msg="db failed to return content" + when: "'Database Connected from' not in item.content" + with_items: "{{app_db.results}}" diff --git a/examples/020_defaults/roles/apache2/README.md b/examples/020_defaults/roles/apache2/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/020_defaults/roles/apache2/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/020_defaults/roles/apache2/defaults/main.yml b/examples/020_defaults/roles/apache2/defaults/main.yml new file mode 100644 index 0000000..0381169 --- /dev/null +++ b/examples/020_defaults/roles/apache2/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for apache2 diff --git a/examples/020_defaults/roles/apache2/handlers/main.yml b/examples/020_defaults/roles/apache2/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/020_defaults/roles/apache2/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/020_defaults/roles/apache2/meta/main.yml b/examples/020_defaults/roles/apache2/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/020_defaults/roles/apache2/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/020_defaults/roles/apache2/tasks/main.yml b/examples/020_defaults/roles/apache2/tasks/main.yml new file mode 100644 index 0000000..2d0632f --- /dev/null +++ b/examples/020_defaults/roles/apache2/tasks/main.yml @@ -0,0 +1,17 @@ +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi + +- name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + +- name: de-activate default apache site + file: path=/etc/apache2/sites-enabled/000-default.conf state=absent + notify: restart apache2 + +- name: ensure apache2 started + service: name=apache2 state=started enabled=yes diff --git a/examples/020_defaults/roles/apache2/vars/main.yml b/examples/020_defaults/roles/apache2/vars/main.yml new file mode 100644 index 0000000..5d23ceb --- /dev/null +++ b/examples/020_defaults/roles/apache2/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for apache2 diff --git a/examples/020_defaults/roles/control/README.md b/examples/020_defaults/roles/control/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/020_defaults/roles/control/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/020_defaults/roles/control/defaults/main.yml b/examples/020_defaults/roles/control/defaults/main.yml new file mode 100644 index 0000000..9fe52bd --- /dev/null +++ b/examples/020_defaults/roles/control/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for control diff --git a/examples/020_defaults/roles/control/handlers/main.yml b/examples/020_defaults/roles/control/handlers/main.yml new file mode 100644 index 0000000..4136893 --- /dev/null +++ b/examples/020_defaults/roles/control/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for control diff --git a/examples/020_defaults/roles/control/meta/main.yml b/examples/020_defaults/roles/control/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/020_defaults/roles/control/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/020_defaults/roles/control/tasks/main.yml b/examples/020_defaults/roles/control/tasks/main.yml new file mode 100644 index 0000000..330e91c --- /dev/null +++ b/examples/020_defaults/roles/control/tasks/main.yml @@ -0,0 +1,6 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - curl + - python-httplib2 diff --git a/examples/020_defaults/roles/control/vars/main.yml b/examples/020_defaults/roles/control/vars/main.yml new file mode 100644 index 0000000..eadc8b6 --- /dev/null +++ b/examples/020_defaults/roles/control/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for control diff --git a/examples/020_defaults/roles/demo_app/README.md b/examples/020_defaults/roles/demo_app/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/020_defaults/roles/demo_app/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/020_defaults/roles/demo_app/defaults/main.yml b/examples/020_defaults/roles/demo_app/defaults/main.yml new file mode 100644 index 0000000..914e957 --- /dev/null +++ b/examples/020_defaults/roles/demo_app/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for demo_app diff --git a/examples/020_defaults/roles/demo_app/files/demo/app/demo.py b/examples/020_defaults/roles/demo_app/files/demo/app/demo.py new file mode 100644 index 0000000..f7897f0 --- /dev/null +++ b/examples/020_defaults/roles/demo_app/files/demo/app/demo.py @@ -0,0 +1,23 @@ +from flask import Flask +from flask.ext.sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + try: + db.create_all() + except Exception as e: + return e.message + '\n' + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() diff --git a/examples/020_defaults/roles/demo_app/files/demo/app/demo.wsgi b/examples/020_defaults/roles/demo_app/files/demo/app/demo.wsgi new file mode 100644 index 0000000..6df3d61 --- /dev/null +++ b/examples/020_defaults/roles/demo_app/files/demo/app/demo.wsgi @@ -0,0 +1,12 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +#execfile(activate_this, dict(__file__=activate_this)) +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +#os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' +os.environ['DATABASE_URI'] = 'mysql://ansibleuser:ansiblepass@db01/ansibleapp' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application diff --git a/examples/020_defaults/roles/demo_app/files/demo/app/requirements.txt b/examples/020_defaults/roles/demo_app/files/demo/app/requirements.txt new file mode 100644 index 0000000..451ff90 --- /dev/null +++ b/examples/020_defaults/roles/demo_app/files/demo/app/requirements.txt @@ -0,0 +1,2 @@ +Flask==0.10.1 +Flask-SQLAlchemy==2.0 diff --git a/examples/020_defaults/roles/demo_app/files/demo/demo.conf b/examples/020_defaults/roles/demo_app/files/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/020_defaults/roles/demo_app/files/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/020_defaults/roles/demo_app/handlers/main.yml b/examples/020_defaults/roles/demo_app/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/020_defaults/roles/demo_app/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/020_defaults/roles/demo_app/meta/main.yml b/examples/020_defaults/roles/demo_app/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/020_defaults/roles/demo_app/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/020_defaults/roles/demo_app/tasks/main.yml b/examples/020_defaults/roles/demo_app/tasks/main.yml new file mode 100644 index 0000000..c5e1f3a --- /dev/null +++ b/examples/020_defaults/roles/demo_app/tasks/main.yml @@ -0,0 +1,23 @@ +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - python-pip-whl + - python3-virtualenv + - python3-mysqldb + +- name: copy demo app source + copy: src=demo/app/ dest=/var/www/demo mode=0755 + notify: restart apache2 + +- name: copy apache virtual host config + copy: src=demo/demo.conf dest=/etc/apache2/sites-available mode=0755 + notify: restart apache2 + +- name: setup python virtualenv + pip: requirements=/var/www/demo/requirements.txt virtualenv=/var/www/demo/.venv + notify: restart apache2 + +- name: activate demo apache site + file: src=/etc/apache2/sites-available/demo.conf dest=/etc/apache2/sites-enabled/demo.conf state=link + notify: restart apache2 diff --git a/examples/020_defaults/roles/demo_app/vars/main.yml b/examples/020_defaults/roles/demo_app/vars/main.yml new file mode 100644 index 0000000..52fb613 --- /dev/null +++ b/examples/020_defaults/roles/demo_app/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for demo_app diff --git a/examples/020_defaults/roles/mysql/README.md b/examples/020_defaults/roles/mysql/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/020_defaults/roles/mysql/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/020_defaults/roles/mysql/defaults/main.yml b/examples/020_defaults/roles/mysql/defaults/main.yml new file mode 100644 index 0000000..886d59c --- /dev/null +++ b/examples/020_defaults/roles/mysql/defaults/main.yml @@ -0,0 +1,6 @@ +--- +db_name: ansibleapp +db_user_name: ansibleuser +db_user_pass: ansiblepass +db_user_host: localhost +db_server: 3.144.5.82 diff --git a/examples/020_defaults/roles/mysql/handlers/main.yml b/examples/020_defaults/roles/mysql/handlers/main.yml new file mode 100644 index 0000000..3755d8c --- /dev/null +++ b/examples/020_defaults/roles/mysql/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart mysql + service: name=mysql state=restarted diff --git a/examples/020_defaults/roles/mysql/meta/main.yml b/examples/020_defaults/roles/mysql/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/020_defaults/roles/mysql/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/020_defaults/roles/mysql/tasks/main.yml b/examples/020_defaults/roles/mysql/tasks/main.yml new file mode 100644 index 0000000..d4489fa --- /dev/null +++ b/examples/020_defaults/roles/mysql/tasks/main.yml @@ -0,0 +1,23 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python3-mysqldb + +- name: install mysql-server + apt: name=mysql-server state=present update_cache=yes + +- name: ensure mysql listening on all ports + #lineinfile: dest=/etc/mysql/my.cnf regexp=^bind-address line="bind-address = {{ ansible_eth0.ipv6[0].address }}" + lineinfile: dest=/etc/mysql/my.cnf regexp=^bind-address line="bind-address = {{ db_server }}" + notify: restart mysql + +- name: ensure mysql started + service: name=mysql state=started enabled=yes + +- name: create database + mysql_db: name={{ db_name }} state=present + +- name: create user + mysql_user: name={{ db_user_name }} password={{ db_user_pass }} priv={{ db_name }}.*:ALL + host='{{ db_user_host }}' state=present diff --git a/examples/020_defaults/roles/mysql/vars/main.yml b/examples/020_defaults/roles/mysql/vars/main.yml new file mode 100644 index 0000000..a79bfed --- /dev/null +++ b/examples/020_defaults/roles/mysql/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for mysql diff --git a/examples/020_defaults/roles/nginx/README.md b/examples/020_defaults/roles/nginx/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/020_defaults/roles/nginx/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/020_defaults/roles/nginx/defaults/main.yml b/examples/020_defaults/roles/nginx/defaults/main.yml new file mode 100644 index 0000000..78c8c76 --- /dev/null +++ b/examples/020_defaults/roles/nginx/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for nginx diff --git a/examples/020_defaults/roles/nginx/handlers/main.yml b/examples/020_defaults/roles/nginx/handlers/main.yml new file mode 100644 index 0000000..92971d2 --- /dev/null +++ b/examples/020_defaults/roles/nginx/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart nginx + service: name=nginx state=restarted diff --git a/examples/020_defaults/roles/nginx/meta/main.yml b/examples/020_defaults/roles/nginx/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/020_defaults/roles/nginx/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/020_defaults/roles/nginx/tasks/main.yml b/examples/020_defaults/roles/nginx/tasks/main.yml new file mode 100644 index 0000000..69c6461 --- /dev/null +++ b/examples/020_defaults/roles/nginx/tasks/main.yml @@ -0,0 +1,23 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python-httplib2 + +- name: install nginx + apt: name=nginx state=present update_cache=yes + +- name: configure nginx site + template: src=nginx.conf.j2 dest=/etc/nginx/sites-available/demo mode=0644 + notify: restart nginx + +- name: de-activate default nginx site + file: path=/etc/nginx/sites-enabled/default state=absent + notify: restart nginx + +- name: activate demo nginx site + file: src=/etc/nginx/sites-available/demo dest=/etc/nginx/sites-enabled/demo state=link + notify: restart nginx + +- name: ensure nginx started + service: name=nginx state=started enabled=yes diff --git a/examples/020_defaults/roles/nginx/templates/nginx.conf.j2 b/examples/020_defaults/roles/nginx/templates/nginx.conf.j2 new file mode 100644 index 0000000..4b477b6 --- /dev/null +++ b/examples/020_defaults/roles/nginx/templates/nginx.conf.j2 @@ -0,0 +1,13 @@ +upstream demo { +{% for server in groups.webserver %} + server {{ server }}; +{% endfor %} +} + +server { + listen 80; + + location / { + proxy_pass http://demo; + } +} diff --git a/examples/020_defaults/roles/nginx/vars/main.yml b/examples/020_defaults/roles/nginx/vars/main.yml new file mode 100644 index 0000000..d45faf6 --- /dev/null +++ b/examples/020_defaults/roles/nginx/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for nginx diff --git a/examples/020_defaults/site.yml b/examples/020_defaults/site.yml new file mode 100644 index 0000000..7299e9e --- /dev/null +++ b/examples/020_defaults/site.yml @@ -0,0 +1,6 @@ +--- +- include: control.yml +- include: database.yml +- include: webserver.yml +- include: loadbalancer.yml +- include: playbooks/stack_status.yml diff --git a/examples/020_defaults/webserver.yml b/examples/020_defaults/webserver.yml new file mode 100644 index 0000000..195ec7f --- /dev/null +++ b/examples/020_defaults/webserver.yml @@ -0,0 +1,6 @@ +--- +- hosts: webserver + become: true + roles: + - apache2 + - demo_app diff --git a/examples/021_vars/control.yml b/examples/021_vars/control.yml new file mode 100644 index 0000000..c6a8d81 --- /dev/null +++ b/examples/021_vars/control.yml @@ -0,0 +1,5 @@ +--- +- hosts: control + become: true + roles: + - control diff --git a/examples/021_vars/database.yml b/examples/021_vars/database.yml new file mode 100644 index 0000000..6b6387d --- /dev/null +++ b/examples/021_vars/database.yml @@ -0,0 +1,6 @@ +--- +- hosts: database + become: true + roles: +# - { role: mysql, db_name: demo, db_user_name: demo, db_user_pass: demo, db_user_host: '%' } + - { role: mysql } diff --git a/examples/021_vars/demo/app/demo.py b/examples/021_vars/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/021_vars/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/021_vars/demo/app/demo.wsgi b/examples/021_vars/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/021_vars/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/021_vars/demo/app/requirements.txt b/examples/021_vars/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/021_vars/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/021_vars/demo/demo.conf b/examples/021_vars/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/021_vars/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/021_vars/loadbalancer.yml b/examples/021_vars/loadbalancer.yml new file mode 100644 index 0000000..651bc7d --- /dev/null +++ b/examples/021_vars/loadbalancer.yml @@ -0,0 +1,5 @@ +--- +- hosts: loadbalancer + become: true + roles: + - nginx diff --git a/examples/021_vars/playbooks/hostname.yml b/examples/021_vars/playbooks/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/021_vars/playbooks/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/021_vars/playbooks/stack_restart.yml b/examples/021_vars/playbooks/stack_restart.yml new file mode 100644 index 0000000..d89c326 --- /dev/null +++ b/examples/021_vars/playbooks/stack_restart.yml @@ -0,0 +1,33 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + - wait_for: port=80 state=drained + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + - wait_for: port=80 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + - wait_for: host={{ ansible_eth0.ipv4.address }} port=3306 state=started + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + - wait_for: port=80 + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started + - wait_for: port=80 diff --git a/examples/021_vars/playbooks/stack_status.yml b/examples/021_vars/playbooks/stack_status.yml new file mode 100644 index 0000000..aae9058 --- /dev/null +++ b/examples/021_vars/playbooks/stack_status.yml @@ -0,0 +1,67 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: verify nginx service + command: service nginx status + + - name: verify nginx is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: webserver + become: true + tasks: + - name: verify apache2 service + command: service apache2 status + + - name: verify apache2 is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: database + become: true + tasks: + - name: verify mysql service + command: service mysql status + + - name: verify mysql is listening on 3306 + wait_for: port=3306 timeout=1 + +- hosts: control + tasks: + - name: verify end-to-end index response + uri: url=http://{{item}} return_content=yes + with_items: "{{ groups.loadbalancer }}" + register: lb_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny' not in item.content" + with_items: "{{lb_index.results}}" + + - name: verify end-to-end db response + uri: url=http://{{item}}/db return_content=yes + with_items: "{{ groups.loadbalancer }}" + register: lb_db + + - fail: msg="db failed to return content" + when: "'Database Connected from' not in item.content" + with_items: "{{lb_db.results}}" + +- hosts: loadbalancer + tasks: + - name: verify backend index response + uri: url=http://{{item}} return_content=yes + with_items: "{{ groups.webserver }}" + register: app_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny' not in item.content" + with_items: "{{app_index.results}}" + + - name: verify backend db response + uri: url=http://{{item}}/db return_content=yes + with_items: "{{ groups.webserver }}" + register: app_db + + - fail: msg="db failed to return content" + when: "'Database Connected from' not in item.content" + with_items: "{{app_db.results}}" diff --git a/examples/021_vars/roles/apache2/README.md b/examples/021_vars/roles/apache2/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/021_vars/roles/apache2/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/021_vars/roles/apache2/defaults/main.yml b/examples/021_vars/roles/apache2/defaults/main.yml new file mode 100644 index 0000000..0381169 --- /dev/null +++ b/examples/021_vars/roles/apache2/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for apache2 diff --git a/examples/021_vars/roles/apache2/handlers/main.yml b/examples/021_vars/roles/apache2/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/021_vars/roles/apache2/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/021_vars/roles/apache2/meta/main.yml b/examples/021_vars/roles/apache2/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/021_vars/roles/apache2/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/021_vars/roles/apache2/tasks/main.yml b/examples/021_vars/roles/apache2/tasks/main.yml new file mode 100644 index 0000000..e1fd9a3 --- /dev/null +++ b/examples/021_vars/roles/apache2/tasks/main.yml @@ -0,0 +1,17 @@ +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi-py3 + +- name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + +- name: de-activate default apache site + file: path=/etc/apache2/sites-enabled/000-default.conf state=absent + notify: restart apache2 + +- name: ensure apache2 started + service: name=apache2 state=started enabled=yes diff --git a/examples/021_vars/roles/apache2/vars/main.yml b/examples/021_vars/roles/apache2/vars/main.yml new file mode 100644 index 0000000..5d23ceb --- /dev/null +++ b/examples/021_vars/roles/apache2/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for apache2 diff --git a/examples/021_vars/roles/control/README.md b/examples/021_vars/roles/control/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/021_vars/roles/control/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/021_vars/roles/control/defaults/main.yml b/examples/021_vars/roles/control/defaults/main.yml new file mode 100644 index 0000000..9fe52bd --- /dev/null +++ b/examples/021_vars/roles/control/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for control diff --git a/examples/021_vars/roles/control/handlers/main.yml b/examples/021_vars/roles/control/handlers/main.yml new file mode 100644 index 0000000..4136893 --- /dev/null +++ b/examples/021_vars/roles/control/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for control diff --git a/examples/021_vars/roles/control/meta/main.yml b/examples/021_vars/roles/control/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/021_vars/roles/control/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/021_vars/roles/control/tasks/main.yml b/examples/021_vars/roles/control/tasks/main.yml new file mode 100644 index 0000000..330e91c --- /dev/null +++ b/examples/021_vars/roles/control/tasks/main.yml @@ -0,0 +1,6 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - curl + - python-httplib2 diff --git a/examples/021_vars/roles/control/vars/main.yml b/examples/021_vars/roles/control/vars/main.yml new file mode 100644 index 0000000..eadc8b6 --- /dev/null +++ b/examples/021_vars/roles/control/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for control diff --git a/examples/021_vars/roles/demo_app/README.md b/examples/021_vars/roles/demo_app/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/021_vars/roles/demo_app/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/021_vars/roles/demo_app/defaults/main.yml b/examples/021_vars/roles/demo_app/defaults/main.yml new file mode 100644 index 0000000..914e957 --- /dev/null +++ b/examples/021_vars/roles/demo_app/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for demo_app diff --git a/examples/021_vars/roles/demo_app/files/demo/app/demo.py b/examples/021_vars/roles/demo_app/files/demo/app/demo.py new file mode 100644 index 0000000..05874b6 --- /dev/null +++ b/examples/021_vars/roles/demo_app/files/demo/app/demo.py @@ -0,0 +1,23 @@ +from flask import Flask +from flask.ext.sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + #try: + # db.create_all() + #except Exception as e: + # return e.message + '\n' + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() diff --git a/examples/021_vars/roles/demo_app/files/demo/app/demo.wsgi b/examples/021_vars/roles/demo_app/files/demo/app/demo.wsgi new file mode 100644 index 0000000..d3e3543 --- /dev/null +++ b/examples/021_vars/roles/demo_app/files/demo/app/demo.wsgi @@ -0,0 +1,11 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +#execfile(activate_this, dict(__file__=activate_this)) +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application diff --git a/examples/021_vars/roles/demo_app/files/demo/app/requirements.txt b/examples/021_vars/roles/demo_app/files/demo/app/requirements.txt new file mode 100644 index 0000000..451ff90 --- /dev/null +++ b/examples/021_vars/roles/demo_app/files/demo/app/requirements.txt @@ -0,0 +1,2 @@ +Flask==0.10.1 +Flask-SQLAlchemy==2.0 diff --git a/examples/021_vars/roles/demo_app/files/demo/demo.conf b/examples/021_vars/roles/demo_app/files/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/021_vars/roles/demo_app/files/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/021_vars/roles/demo_app/handlers/main.yml b/examples/021_vars/roles/demo_app/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/021_vars/roles/demo_app/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/021_vars/roles/demo_app/meta/main.yml b/examples/021_vars/roles/demo_app/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/021_vars/roles/demo_app/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/021_vars/roles/demo_app/tasks/main.yml b/examples/021_vars/roles/demo_app/tasks/main.yml new file mode 100644 index 0000000..c5e1f3a --- /dev/null +++ b/examples/021_vars/roles/demo_app/tasks/main.yml @@ -0,0 +1,23 @@ +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - python-pip-whl + - python3-virtualenv + - python3-mysqldb + +- name: copy demo app source + copy: src=demo/app/ dest=/var/www/demo mode=0755 + notify: restart apache2 + +- name: copy apache virtual host config + copy: src=demo/demo.conf dest=/etc/apache2/sites-available mode=0755 + notify: restart apache2 + +- name: setup python virtualenv + pip: requirements=/var/www/demo/requirements.txt virtualenv=/var/www/demo/.venv + notify: restart apache2 + +- name: activate demo apache site + file: src=/etc/apache2/sites-available/demo.conf dest=/etc/apache2/sites-enabled/demo.conf state=link + notify: restart apache2 diff --git a/examples/021_vars/roles/demo_app/vars/main.yml b/examples/021_vars/roles/demo_app/vars/main.yml new file mode 100644 index 0000000..52fb613 --- /dev/null +++ b/examples/021_vars/roles/demo_app/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for demo_app diff --git a/examples/021_vars/roles/mysql/README.md b/examples/021_vars/roles/mysql/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/021_vars/roles/mysql/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/021_vars/roles/mysql/defaults/main.yml b/examples/021_vars/roles/mysql/defaults/main.yml new file mode 100644 index 0000000..f76aeda --- /dev/null +++ b/examples/021_vars/roles/mysql/defaults/main.yml @@ -0,0 +1,6 @@ +--- +db_name: myapp +db_user_name: dbuser +db_user_pass: dbpass +db_user_host: localhost +db_host_ipv4: 3.144.5.82 diff --git a/examples/021_vars/roles/mysql/handlers/main.yml b/examples/021_vars/roles/mysql/handlers/main.yml new file mode 100644 index 0000000..3755d8c --- /dev/null +++ b/examples/021_vars/roles/mysql/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart mysql + service: name=mysql state=restarted diff --git a/examples/021_vars/roles/mysql/meta/main.yml b/examples/021_vars/roles/mysql/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/021_vars/roles/mysql/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/021_vars/roles/mysql/tasks/main.yml b/examples/021_vars/roles/mysql/tasks/main.yml new file mode 100644 index 0000000..0a36c93 --- /dev/null +++ b/examples/021_vars/roles/mysql/tasks/main.yml @@ -0,0 +1,27 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python3-mysqldb + - mysql-server + +- name: install mysql-server + apt: name=mysql-server state=present update_cache=yes + +- name: chmod cnf + copy: src=files/my.cnf dest=/etc/mysql/my.cnf owner=mysql group=mysql mode=0700 + +- name: ensure mysql listening on all ports + lineinfile: dest=/etc/mysql/my.cnf regexp=^bind-address + line="bind-address = {{ db_host_ipv4 }}" + notify: restart mysql + +- name: ensure mysql started + service: name=mysql state=started enabled=yes + +- name: create database + mysql_db: name={{ db_name }} state=present + +- name: create user + mysql_user: name={{ db_user_name }} password={{ db_user_pass }} priv={{ db_name }}.*:ALL + host='{{ db_user_host }}' state=present diff --git a/examples/021_vars/roles/mysql/vars/main.yml b/examples/021_vars/roles/mysql/vars/main.yml new file mode 100644 index 0000000..a79bfed --- /dev/null +++ b/examples/021_vars/roles/mysql/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for mysql diff --git a/examples/021_vars/roles/nginx/README.md b/examples/021_vars/roles/nginx/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/021_vars/roles/nginx/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/021_vars/roles/nginx/defaults/main.yml b/examples/021_vars/roles/nginx/defaults/main.yml new file mode 100644 index 0000000..16c56ce --- /dev/null +++ b/examples/021_vars/roles/nginx/defaults/main.yml @@ -0,0 +1,6 @@ +# defaults file for nginx +--- +sites: + myappguillem: + frontend: 80 + backend: 80 diff --git a/examples/021_vars/roles/nginx/handlers/main.yml b/examples/021_vars/roles/nginx/handlers/main.yml new file mode 100644 index 0000000..92971d2 --- /dev/null +++ b/examples/021_vars/roles/nginx/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart nginx + service: name=nginx state=restarted diff --git a/examples/021_vars/roles/nginx/meta/main.yml b/examples/021_vars/roles/nginx/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/021_vars/roles/nginx/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/021_vars/roles/nginx/tasks/main.yml b/examples/021_vars/roles/nginx/tasks/main.yml new file mode 100644 index 0000000..20396e9 --- /dev/null +++ b/examples/021_vars/roles/nginx/tasks/main.yml @@ -0,0 +1,30 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python-httplib2 + +- name: install nginx + apt: name=nginx state=present update_cache=yes + +- name: de-active former served sites + file: name=/etc/nginx/sites-enabled/{{ item.key }} state=absent + with_dict: "{{ sites }}" + notify: restart nginx + +- name: configure sites nginx + template: src=nginx.conf.j2 dest=/etc/nginx/sites-available/{{ item.key }} mode=0644 + with_dict: "{{ sites }}" + notify: restart nginx + +- name: de-activate default nginx site + file: path=/etc/nginx/sites-enabled/default state=absent + notify: restart nginx + +- name: activate sites nginx + file: src=/etc/nginx/sites-available/{{ item.key }} dest=/etc/nginx/sites-enabled/{{ item.key }} state=link + with_dict: "{{ sites }}" + notify: restart nginx + +- name: ensure nginx started + service: name=nginx state=started enabled=yes diff --git a/examples/021_vars/roles/nginx/templates/nginx.conf.j2 b/examples/021_vars/roles/nginx/templates/nginx.conf.j2 new file mode 100644 index 0000000..6e716d1 --- /dev/null +++ b/examples/021_vars/roles/nginx/templates/nginx.conf.j2 @@ -0,0 +1,13 @@ +upstream {{ item.key }} { +{% for server in groups.webserver %} + server {{ server }}:{{ item.value.backend }}; +{% endfor %} +} + +server { + listen {{ item.value.frontend }}; + + location / { + proxy_pass http://{{ item.key }}; + } +} diff --git a/examples/021_vars/roles/nginx/vars/main.yml b/examples/021_vars/roles/nginx/vars/main.yml new file mode 100644 index 0000000..d45faf6 --- /dev/null +++ b/examples/021_vars/roles/nginx/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for nginx diff --git a/examples/021_vars/site.yml b/examples/021_vars/site.yml new file mode 100644 index 0000000..7299e9e --- /dev/null +++ b/examples/021_vars/site.yml @@ -0,0 +1,6 @@ +--- +- include: control.yml +- include: database.yml +- include: webserver.yml +- include: loadbalancer.yml +- include: playbooks/stack_status.yml diff --git a/examples/021_vars/webserver.yml b/examples/021_vars/webserver.yml new file mode 100644 index 0000000..195ec7f --- /dev/null +++ b/examples/021_vars/webserver.yml @@ -0,0 +1,6 @@ +--- +- hosts: webserver + become: true + roles: + - apache2 + - demo_app diff --git a/examples/022_with_dict/control.yml b/examples/022_with_dict/control.yml new file mode 100644 index 0000000..c6a8d81 --- /dev/null +++ b/examples/022_with_dict/control.yml @@ -0,0 +1,5 @@ +--- +- hosts: control + become: true + roles: + - control diff --git a/examples/022_with_dict/database.yml b/examples/022_with_dict/database.yml new file mode 100644 index 0000000..fee12fa --- /dev/null +++ b/examples/022_with_dict/database.yml @@ -0,0 +1,5 @@ +--- +- hosts: database + become: true + roles: + - { role: mysql, db_name: demo, db_user_name: demo, db_user_pass: demo, db_user_host: '%' } diff --git a/examples/022_with_dict/demo/app/demo.py b/examples/022_with_dict/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/022_with_dict/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/022_with_dict/demo/app/demo.wsgi b/examples/022_with_dict/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/022_with_dict/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/022_with_dict/demo/app/requirements.txt b/examples/022_with_dict/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/022_with_dict/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/022_with_dict/demo/demo.conf b/examples/022_with_dict/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/022_with_dict/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/022_with_dict/loadbalancer.yml b/examples/022_with_dict/loadbalancer.yml new file mode 100644 index 0000000..651bc7d --- /dev/null +++ b/examples/022_with_dict/loadbalancer.yml @@ -0,0 +1,5 @@ +--- +- hosts: loadbalancer + become: true + roles: + - nginx diff --git a/examples/022_with_dict/playbooks/hostname.yml b/examples/022_with_dict/playbooks/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/022_with_dict/playbooks/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/022_with_dict/playbooks/stack_restart.yml b/examples/022_with_dict/playbooks/stack_restart.yml new file mode 100644 index 0000000..d89c326 --- /dev/null +++ b/examples/022_with_dict/playbooks/stack_restart.yml @@ -0,0 +1,33 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + - wait_for: port=80 state=drained + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + - wait_for: port=80 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + - wait_for: host={{ ansible_eth0.ipv4.address }} port=3306 state=started + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + - wait_for: port=80 + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started + - wait_for: port=80 diff --git a/examples/022_with_dict/playbooks/stack_status.yml b/examples/022_with_dict/playbooks/stack_status.yml new file mode 100644 index 0000000..3c1331b --- /dev/null +++ b/examples/022_with_dict/playbooks/stack_status.yml @@ -0,0 +1,67 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: verify nginx service + command: service nginx status + + - name: verify nginx is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: webserver + become: true + tasks: + - name: verify apache2 service + command: service apache2 status + + - name: verify apache2 is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: database + become: true + tasks: + - name: verify mysql service + command: service mysql status + + - name: verify mysql is listening on 3306 + wait_for: host={{ ansible_eth0.ipv4.address }} port=3306 timeout=1 + +- hosts: control + tasks: + - name: verify end-to-end index response + uri: url=http://{{item}} return_content=yes + with_items: groups.loadbalancer + register: lb_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny' not in item.content" + with_items: "{{lb_index.results}}" + + - name: verify end-to-end db response + uri: url=http://{{item}}/db return_content=yes + with_items: groups.loadbalancer + register: lb_db + + - fail: msg="db failed to return content" + when: "'Database Connected from' not in item.content" + with_items: "{{lb_db.results}}" + +- hosts: loadbalancer + tasks: + - name: verify backend index response + uri: url=http://{{item}} return_content=yes + with_items: groups.webserver + register: app_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny {{item.item}}!' not in item.content" + with_items: "{{app_index.results}}" + + - name: verify backend db response + uri: url=http://{{item}}/db return_content=yes + with_items: groups.webserver + register: app_db + + - fail: msg="db failed to return content" + when: "'Database Connected from {{item.item}}!' not in item.content" + with_items: "{{app_db.results}}" diff --git a/examples/022_with_dict/roles/apache2/README.md b/examples/022_with_dict/roles/apache2/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/022_with_dict/roles/apache2/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/022_with_dict/roles/apache2/defaults/main.yml b/examples/022_with_dict/roles/apache2/defaults/main.yml new file mode 100644 index 0000000..0381169 --- /dev/null +++ b/examples/022_with_dict/roles/apache2/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for apache2 diff --git a/examples/022_with_dict/roles/apache2/handlers/main.yml b/examples/022_with_dict/roles/apache2/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/022_with_dict/roles/apache2/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/022_with_dict/roles/apache2/meta/main.yml b/examples/022_with_dict/roles/apache2/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/022_with_dict/roles/apache2/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/022_with_dict/roles/apache2/tasks/main.yml b/examples/022_with_dict/roles/apache2/tasks/main.yml new file mode 100644 index 0000000..2d0632f --- /dev/null +++ b/examples/022_with_dict/roles/apache2/tasks/main.yml @@ -0,0 +1,17 @@ +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi + +- name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + +- name: de-activate default apache site + file: path=/etc/apache2/sites-enabled/000-default.conf state=absent + notify: restart apache2 + +- name: ensure apache2 started + service: name=apache2 state=started enabled=yes diff --git a/examples/022_with_dict/roles/apache2/vars/main.yml b/examples/022_with_dict/roles/apache2/vars/main.yml new file mode 100644 index 0000000..5d23ceb --- /dev/null +++ b/examples/022_with_dict/roles/apache2/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for apache2 diff --git a/examples/022_with_dict/roles/control/README.md b/examples/022_with_dict/roles/control/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/022_with_dict/roles/control/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/022_with_dict/roles/control/defaults/main.yml b/examples/022_with_dict/roles/control/defaults/main.yml new file mode 100644 index 0000000..9fe52bd --- /dev/null +++ b/examples/022_with_dict/roles/control/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for control diff --git a/examples/022_with_dict/roles/control/handlers/main.yml b/examples/022_with_dict/roles/control/handlers/main.yml new file mode 100644 index 0000000..4136893 --- /dev/null +++ b/examples/022_with_dict/roles/control/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for control diff --git a/examples/022_with_dict/roles/control/meta/main.yml b/examples/022_with_dict/roles/control/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/022_with_dict/roles/control/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/022_with_dict/roles/control/tasks/main.yml b/examples/022_with_dict/roles/control/tasks/main.yml new file mode 100644 index 0000000..330e91c --- /dev/null +++ b/examples/022_with_dict/roles/control/tasks/main.yml @@ -0,0 +1,6 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - curl + - python-httplib2 diff --git a/examples/022_with_dict/roles/control/vars/main.yml b/examples/022_with_dict/roles/control/vars/main.yml new file mode 100644 index 0000000..eadc8b6 --- /dev/null +++ b/examples/022_with_dict/roles/control/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for control diff --git a/examples/022_with_dict/roles/demo_app/README.md b/examples/022_with_dict/roles/demo_app/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/022_with_dict/roles/demo_app/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/022_with_dict/roles/demo_app/defaults/main.yml b/examples/022_with_dict/roles/demo_app/defaults/main.yml new file mode 100644 index 0000000..914e957 --- /dev/null +++ b/examples/022_with_dict/roles/demo_app/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for demo_app diff --git a/examples/022_with_dict/roles/demo_app/files/demo/app/demo.py b/examples/022_with_dict/roles/demo_app/files/demo/app/demo.py new file mode 100644 index 0000000..f7897f0 --- /dev/null +++ b/examples/022_with_dict/roles/demo_app/files/demo/app/demo.py @@ -0,0 +1,23 @@ +from flask import Flask +from flask.ext.sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + try: + db.create_all() + except Exception as e: + return e.message + '\n' + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() diff --git a/examples/022_with_dict/roles/demo_app/files/demo/app/demo.wsgi b/examples/022_with_dict/roles/demo_app/files/demo/app/demo.wsgi new file mode 100644 index 0000000..f6453b3 --- /dev/null +++ b/examples/022_with_dict/roles/demo_app/files/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +execfile(activate_this, dict(__file__=activate_this)) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application diff --git a/examples/022_with_dict/roles/demo_app/files/demo/app/requirements.txt b/examples/022_with_dict/roles/demo_app/files/demo/app/requirements.txt new file mode 100644 index 0000000..451ff90 --- /dev/null +++ b/examples/022_with_dict/roles/demo_app/files/demo/app/requirements.txt @@ -0,0 +1,2 @@ +Flask==0.10.1 +Flask-SQLAlchemy==2.0 diff --git a/examples/022_with_dict/roles/demo_app/files/demo/demo.conf b/examples/022_with_dict/roles/demo_app/files/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/022_with_dict/roles/demo_app/files/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/022_with_dict/roles/demo_app/handlers/main.yml b/examples/022_with_dict/roles/demo_app/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/022_with_dict/roles/demo_app/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/022_with_dict/roles/demo_app/meta/main.yml b/examples/022_with_dict/roles/demo_app/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/022_with_dict/roles/demo_app/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/022_with_dict/roles/demo_app/tasks/main.yml b/examples/022_with_dict/roles/demo_app/tasks/main.yml new file mode 100644 index 0000000..05ff043 --- /dev/null +++ b/examples/022_with_dict/roles/demo_app/tasks/main.yml @@ -0,0 +1,23 @@ +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - python-pip + - python-virtualenv + - python-mysqldb + +- name: copy demo app source + copy: src=demo/app/ dest=/var/www/demo mode=0755 + notify: restart apache2 + +- name: copy apache virtual host config + copy: src=demo/demo.conf dest=/etc/apache2/sites-available mode=0755 + notify: restart apache2 + +- name: setup python virtualenv + pip: requirements=/var/www/demo/requirements.txt virtualenv=/var/www/demo/.venv + notify: restart apache2 + +- name: activate demo apache site + file: src=/etc/apache2/sites-available/demo.conf dest=/etc/apache2/sites-enabled/demo.conf state=link + notify: restart apache2 diff --git a/examples/022_with_dict/roles/demo_app/vars/main.yml b/examples/022_with_dict/roles/demo_app/vars/main.yml new file mode 100644 index 0000000..52fb613 --- /dev/null +++ b/examples/022_with_dict/roles/demo_app/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for demo_app diff --git a/examples/022_with_dict/roles/mysql/README.md b/examples/022_with_dict/roles/mysql/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/022_with_dict/roles/mysql/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/022_with_dict/roles/mysql/defaults/main.yml b/examples/022_with_dict/roles/mysql/defaults/main.yml new file mode 100644 index 0000000..2ea6760 --- /dev/null +++ b/examples/022_with_dict/roles/mysql/defaults/main.yml @@ -0,0 +1,5 @@ +--- +db_name: myapp +db_user_name: dbuser +db_user_pass: dbpass +db_user_host: localhost diff --git a/examples/022_with_dict/roles/mysql/handlers/main.yml b/examples/022_with_dict/roles/mysql/handlers/main.yml new file mode 100644 index 0000000..3755d8c --- /dev/null +++ b/examples/022_with_dict/roles/mysql/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart mysql + service: name=mysql state=restarted diff --git a/examples/022_with_dict/roles/mysql/meta/main.yml b/examples/022_with_dict/roles/mysql/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/022_with_dict/roles/mysql/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/022_with_dict/roles/mysql/tasks/main.yml b/examples/022_with_dict/roles/mysql/tasks/main.yml new file mode 100644 index 0000000..438fd7a --- /dev/null +++ b/examples/022_with_dict/roles/mysql/tasks/main.yml @@ -0,0 +1,23 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python-mysqldb + +- name: install mysql-server + apt: name=mysql-server state=present update_cache=yes + +- name: ensure mysql listening on all ports + lineinfile: dest=/etc/mysql/my.cnf regexp=^bind-address + line="bind-address = {{ ansible_eth0.ipv4.address }}" + notify: restart mysql + +- name: ensure mysql started + service: name=mysql state=started enabled=yes + +- name: create database + mysql_db: name={{ db_name }} state=present + +- name: create user + mysql_user: name={{ db_user_name }} password={{ db_user_pass }} priv={{ db_name }}.*:ALL + host='{{ db_user_host }}' state=present diff --git a/examples/022_with_dict/roles/mysql/vars/main.yml b/examples/022_with_dict/roles/mysql/vars/main.yml new file mode 100644 index 0000000..a79bfed --- /dev/null +++ b/examples/022_with_dict/roles/mysql/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for mysql diff --git a/examples/022_with_dict/roles/nginx/README.md b/examples/022_with_dict/roles/nginx/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/022_with_dict/roles/nginx/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/022_with_dict/roles/nginx/defaults/main.yml b/examples/022_with_dict/roles/nginx/defaults/main.yml new file mode 100644 index 0000000..0661d5d --- /dev/null +++ b/examples/022_with_dict/roles/nginx/defaults/main.yml @@ -0,0 +1,5 @@ +--- +sites: + myapp: + frontend: 80 + backend: 80 diff --git a/examples/022_with_dict/roles/nginx/handlers/main.yml b/examples/022_with_dict/roles/nginx/handlers/main.yml new file mode 100644 index 0000000..92971d2 --- /dev/null +++ b/examples/022_with_dict/roles/nginx/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart nginx + service: name=nginx state=restarted diff --git a/examples/022_with_dict/roles/nginx/meta/main.yml b/examples/022_with_dict/roles/nginx/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/022_with_dict/roles/nginx/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/022_with_dict/roles/nginx/tasks/main.yml b/examples/022_with_dict/roles/nginx/tasks/main.yml new file mode 100644 index 0000000..47e4eb2 --- /dev/null +++ b/examples/022_with_dict/roles/nginx/tasks/main.yml @@ -0,0 +1,25 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python-httplib2 + +- name: install nginx + apt: name=nginx state=present update_cache=yes + +- name: configure nginx sites + template: src=nginx.conf.j2 dest=/etc/nginx/sites-available/{{ item.key }} mode=0644 + with_dict: sites + notify: restart nginx + +- name: de-activate default nginx site + file: path=/etc/nginx/sites-enabled/default state=absent + notify: restart nginx + +- name: activate nginx sites + file: src=/etc/nginx/sites-available/{{ item.key }} dest=/etc/nginx/sites-enabled/{{ item.key }} state=link + with_dict: sites + notify: restart nginx + +- name: ensure nginx started + service: name=nginx state=started enabled=yes diff --git a/examples/022_with_dict/roles/nginx/templates/nginx.conf.j2 b/examples/022_with_dict/roles/nginx/templates/nginx.conf.j2 new file mode 100644 index 0000000..092c8be --- /dev/null +++ b/examples/022_with_dict/roles/nginx/templates/nginx.conf.j2 @@ -0,0 +1,13 @@ +upstream {{ item.key }} { +{% for server in groups.webserver %} + server {{ server }}:{{ item.value.backend }}; +{% endfor %} +} + +server { + listen {{ item.value.frontend }}; + + location / { + proxy_pass http://{{ item.key }}; + } +} diff --git a/examples/022_with_dict/roles/nginx/vars/main.yml b/examples/022_with_dict/roles/nginx/vars/main.yml new file mode 100644 index 0000000..d45faf6 --- /dev/null +++ b/examples/022_with_dict/roles/nginx/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for nginx diff --git a/examples/022_with_dict/site.yml b/examples/022_with_dict/site.yml new file mode 100644 index 0000000..0cb3dd0 --- /dev/null +++ b/examples/022_with_dict/site.yml @@ -0,0 +1,5 @@ +--- +- include: control.yml +- include: database.yml +- include: webserver.yml +- include: loadbalancer.yml diff --git a/examples/022_with_dict/webserver.yml b/examples/022_with_dict/webserver.yml new file mode 100644 index 0000000..195ec7f --- /dev/null +++ b/examples/022_with_dict/webserver.yml @@ -0,0 +1,6 @@ +--- +- hosts: webserver + become: true + roles: + - apache2 + - demo_app diff --git a/examples/023_selective_removal/control.yml b/examples/023_selective_removal/control.yml new file mode 100644 index 0000000..c6a8d81 --- /dev/null +++ b/examples/023_selective_removal/control.yml @@ -0,0 +1,5 @@ +--- +- hosts: control + become: true + roles: + - control diff --git a/examples/023_selective_removal/database.yml b/examples/023_selective_removal/database.yml new file mode 100644 index 0000000..690fff4 --- /dev/null +++ b/examples/023_selective_removal/database.yml @@ -0,0 +1,5 @@ +--- +- hosts: database + become: true + roles: + - { role: mysql, db_name: eureka, db_user_name: eurekademo, db_user_pass: eurekademo, db_user_host: '%' } diff --git a/examples/023_selective_removal/demo/app/demo.py b/examples/023_selective_removal/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/023_selective_removal/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/023_selective_removal/demo/app/demo.wsgi b/examples/023_selective_removal/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/023_selective_removal/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/023_selective_removal/demo/app/requirements.txt b/examples/023_selective_removal/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/023_selective_removal/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/023_selective_removal/demo/demo.conf b/examples/023_selective_removal/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/023_selective_removal/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/023_selective_removal/loadbalancer.yml b/examples/023_selective_removal/loadbalancer.yml new file mode 100644 index 0000000..651bc7d --- /dev/null +++ b/examples/023_selective_removal/loadbalancer.yml @@ -0,0 +1,5 @@ +--- +- hosts: loadbalancer + become: true + roles: + - nginx diff --git a/examples/023_selective_removal/playbooks/hostname.yml b/examples/023_selective_removal/playbooks/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/023_selective_removal/playbooks/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/023_selective_removal/playbooks/stack_restart.yml b/examples/023_selective_removal/playbooks/stack_restart.yml new file mode 100644 index 0000000..d89c326 --- /dev/null +++ b/examples/023_selective_removal/playbooks/stack_restart.yml @@ -0,0 +1,33 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + - wait_for: port=80 state=drained + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + - wait_for: port=80 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + - wait_for: host={{ ansible_eth0.ipv4.address }} port=3306 state=started + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + - wait_for: port=80 + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started + - wait_for: port=80 diff --git a/examples/023_selective_removal/playbooks/stack_status.yml b/examples/023_selective_removal/playbooks/stack_status.yml new file mode 100644 index 0000000..2abc0ea --- /dev/null +++ b/examples/023_selective_removal/playbooks/stack_status.yml @@ -0,0 +1,67 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: verify nginx service + command: service nginx status + + - name: verify nginx is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: webserver + become: true + tasks: + - name: verify apache2 service + command: service apache2 status + + - name: verify apache2 is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: database + become: true + tasks: + - name: verify mysql service + command: service mysql status + + - name: verify mysql is listening on 3306 + wait_for: port=3306 timeout=1 + +- hosts: control + tasks: + - name: verify end-to-end index response + uri: url=http://{{item}} return_content=yes + with_items: "{{ groups.loadbalancer }}" + register: lb_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny' not in item.content" + with_items: "{{lb_index.results}}" + + - name: verify end-to-end db response + uri: url=http://{{item}}/db return_content=yes + with_items: "{{ groups.loadbalancer }}" + register: lb_db + + - fail: msg="db failed to return content" + when: "'Database Connected from' not in item.content" + with_items: "{{lb_db.results}}" + +- hosts: loadbalancer + tasks: + - name: verify backend index response + uri: url=http://{{item}} return_content=yes + with_items: "{{ groups.webserver }}" + register: app_index + +# - fail: msg="index failed to return content" +# when: "'Hello, from sunny {{ item.content }}!' not in item.content" +# with_items: "{{app_index.results}}" + + - name: verify backend db response + uri: url=http://{{item}}/db return_content=yes + with_items: "{{ groups.webserver }}" + register: app_db + +# - fail: msg="db failed to return content" +# when: "'Database Connected from {{ item.item }}!' not in item.content" +# with_items: "{{app_db.results}}" diff --git a/examples/023_selective_removal/roles/apache2/README.md b/examples/023_selective_removal/roles/apache2/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/023_selective_removal/roles/apache2/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/023_selective_removal/roles/apache2/defaults/main.yml b/examples/023_selective_removal/roles/apache2/defaults/main.yml new file mode 100644 index 0000000..0381169 --- /dev/null +++ b/examples/023_selective_removal/roles/apache2/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for apache2 diff --git a/examples/023_selective_removal/roles/apache2/handlers/main.yml b/examples/023_selective_removal/roles/apache2/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/023_selective_removal/roles/apache2/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/023_selective_removal/roles/apache2/meta/main.yml b/examples/023_selective_removal/roles/apache2/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/023_selective_removal/roles/apache2/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/023_selective_removal/roles/apache2/tasks/main.yml b/examples/023_selective_removal/roles/apache2/tasks/main.yml new file mode 100644 index 0000000..e1fd9a3 --- /dev/null +++ b/examples/023_selective_removal/roles/apache2/tasks/main.yml @@ -0,0 +1,17 @@ +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi-py3 + +- name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + +- name: de-activate default apache site + file: path=/etc/apache2/sites-enabled/000-default.conf state=absent + notify: restart apache2 + +- name: ensure apache2 started + service: name=apache2 state=started enabled=yes diff --git a/examples/023_selective_removal/roles/apache2/vars/main.yml b/examples/023_selective_removal/roles/apache2/vars/main.yml new file mode 100644 index 0000000..5d23ceb --- /dev/null +++ b/examples/023_selective_removal/roles/apache2/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for apache2 diff --git a/examples/023_selective_removal/roles/control/README.md b/examples/023_selective_removal/roles/control/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/023_selective_removal/roles/control/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/023_selective_removal/roles/control/defaults/main.yml b/examples/023_selective_removal/roles/control/defaults/main.yml new file mode 100644 index 0000000..9fe52bd --- /dev/null +++ b/examples/023_selective_removal/roles/control/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for control diff --git a/examples/023_selective_removal/roles/control/handlers/main.yml b/examples/023_selective_removal/roles/control/handlers/main.yml new file mode 100644 index 0000000..4136893 --- /dev/null +++ b/examples/023_selective_removal/roles/control/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for control diff --git a/examples/023_selective_removal/roles/control/meta/main.yml b/examples/023_selective_removal/roles/control/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/023_selective_removal/roles/control/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/023_selective_removal/roles/control/tasks/main.yml b/examples/023_selective_removal/roles/control/tasks/main.yml new file mode 100644 index 0000000..330e91c --- /dev/null +++ b/examples/023_selective_removal/roles/control/tasks/main.yml @@ -0,0 +1,6 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - curl + - python-httplib2 diff --git a/examples/023_selective_removal/roles/control/vars/main.yml b/examples/023_selective_removal/roles/control/vars/main.yml new file mode 100644 index 0000000..eadc8b6 --- /dev/null +++ b/examples/023_selective_removal/roles/control/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for control diff --git a/examples/023_selective_removal/roles/demo_app/README.md b/examples/023_selective_removal/roles/demo_app/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/023_selective_removal/roles/demo_app/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/023_selective_removal/roles/demo_app/defaults/main.yml b/examples/023_selective_removal/roles/demo_app/defaults/main.yml new file mode 100644 index 0000000..914e957 --- /dev/null +++ b/examples/023_selective_removal/roles/demo_app/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for demo_app diff --git a/examples/023_selective_removal/roles/demo_app/files/demo/app/demo.py b/examples/023_selective_removal/roles/demo_app/files/demo/app/demo.py new file mode 100644 index 0000000..05874b6 --- /dev/null +++ b/examples/023_selective_removal/roles/demo_app/files/demo/app/demo.py @@ -0,0 +1,23 @@ +from flask import Flask +from flask.ext.sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + #try: + # db.create_all() + #except Exception as e: + # return e.message + '\n' + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() diff --git a/examples/023_selective_removal/roles/demo_app/files/demo/app/demo.wsgi b/examples/023_selective_removal/roles/demo_app/files/demo/app/demo.wsgi new file mode 100644 index 0000000..d3e3543 --- /dev/null +++ b/examples/023_selective_removal/roles/demo_app/files/demo/app/demo.wsgi @@ -0,0 +1,11 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +#execfile(activate_this, dict(__file__=activate_this)) +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application diff --git a/examples/023_selective_removal/roles/demo_app/files/demo/app/requirements.txt b/examples/023_selective_removal/roles/demo_app/files/demo/app/requirements.txt new file mode 100644 index 0000000..451ff90 --- /dev/null +++ b/examples/023_selective_removal/roles/demo_app/files/demo/app/requirements.txt @@ -0,0 +1,2 @@ +Flask==0.10.1 +Flask-SQLAlchemy==2.0 diff --git a/examples/023_selective_removal/roles/demo_app/files/demo/demo.conf b/examples/023_selective_removal/roles/demo_app/files/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/023_selective_removal/roles/demo_app/files/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/023_selective_removal/roles/demo_app/handlers/main.yml b/examples/023_selective_removal/roles/demo_app/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/023_selective_removal/roles/demo_app/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/023_selective_removal/roles/demo_app/meta/main.yml b/examples/023_selective_removal/roles/demo_app/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/023_selective_removal/roles/demo_app/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/023_selective_removal/roles/demo_app/tasks/main.yml b/examples/023_selective_removal/roles/demo_app/tasks/main.yml new file mode 100644 index 0000000..c5e1f3a --- /dev/null +++ b/examples/023_selective_removal/roles/demo_app/tasks/main.yml @@ -0,0 +1,23 @@ +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - python-pip-whl + - python3-virtualenv + - python3-mysqldb + +- name: copy demo app source + copy: src=demo/app/ dest=/var/www/demo mode=0755 + notify: restart apache2 + +- name: copy apache virtual host config + copy: src=demo/demo.conf dest=/etc/apache2/sites-available mode=0755 + notify: restart apache2 + +- name: setup python virtualenv + pip: requirements=/var/www/demo/requirements.txt virtualenv=/var/www/demo/.venv + notify: restart apache2 + +- name: activate demo apache site + file: src=/etc/apache2/sites-available/demo.conf dest=/etc/apache2/sites-enabled/demo.conf state=link + notify: restart apache2 diff --git a/examples/023_selective_removal/roles/demo_app/vars/main.yml b/examples/023_selective_removal/roles/demo_app/vars/main.yml new file mode 100644 index 0000000..52fb613 --- /dev/null +++ b/examples/023_selective_removal/roles/demo_app/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for demo_app diff --git a/examples/023_selective_removal/roles/mysql/README.md b/examples/023_selective_removal/roles/mysql/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/023_selective_removal/roles/mysql/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/023_selective_removal/roles/mysql/defaults/main.yml b/examples/023_selective_removal/roles/mysql/defaults/main.yml new file mode 100644 index 0000000..2ea6760 --- /dev/null +++ b/examples/023_selective_removal/roles/mysql/defaults/main.yml @@ -0,0 +1,5 @@ +--- +db_name: myapp +db_user_name: dbuser +db_user_pass: dbpass +db_user_host: localhost diff --git a/examples/023_selective_removal/roles/mysql/handlers/main.yml b/examples/023_selective_removal/roles/mysql/handlers/main.yml new file mode 100644 index 0000000..3755d8c --- /dev/null +++ b/examples/023_selective_removal/roles/mysql/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart mysql + service: name=mysql state=restarted diff --git a/examples/023_selective_removal/roles/mysql/meta/main.yml b/examples/023_selective_removal/roles/mysql/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/023_selective_removal/roles/mysql/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/023_selective_removal/roles/mysql/tasks/main.yml b/examples/023_selective_removal/roles/mysql/tasks/main.yml new file mode 100644 index 0000000..35b2fd3 --- /dev/null +++ b/examples/023_selective_removal/roles/mysql/tasks/main.yml @@ -0,0 +1,23 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python3-mysqldb + +- name: install mysql-server + apt: name=mysql-server state=present update_cache=yes + +- name: ensure mysql listening on all ports + lineinfile: dest=/etc/mysql/my.cnf regexp=^bind-address + line="bind-address = {{ ansible_eth0.ipv4.address }}" + notify: restart mysql + +- name: ensure mysql started + service: name=mysql state=started enabled=yes + +- name: create database + mysql_db: name={{ db_name }} state=present + +- name: create user + mysql_user: name={{ db_user_name }} password={{ db_user_pass }} priv={{ db_name }}.*:ALL + host='{{ db_user_host }}' state=present diff --git a/examples/023_selective_removal/roles/mysql/vars/main.yml b/examples/023_selective_removal/roles/mysql/vars/main.yml new file mode 100644 index 0000000..a79bfed --- /dev/null +++ b/examples/023_selective_removal/roles/mysql/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for mysql diff --git a/examples/023_selective_removal/roles/nginx/README.md b/examples/023_selective_removal/roles/nginx/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/023_selective_removal/roles/nginx/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/023_selective_removal/roles/nginx/defaults/main.yml b/examples/023_selective_removal/roles/nginx/defaults/main.yml new file mode 100644 index 0000000..45a7ecc --- /dev/null +++ b/examples/023_selective_removal/roles/nginx/defaults/main.yml @@ -0,0 +1,5 @@ +--- +sites: + myapp20211216: + frontend: 80 + backend: 80 diff --git a/examples/023_selective_removal/roles/nginx/handlers/main.yml b/examples/023_selective_removal/roles/nginx/handlers/main.yml new file mode 100644 index 0000000..92971d2 --- /dev/null +++ b/examples/023_selective_removal/roles/nginx/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart nginx + service: name=nginx state=restarted diff --git a/examples/023_selective_removal/roles/nginx/meta/main.yml b/examples/023_selective_removal/roles/nginx/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/023_selective_removal/roles/nginx/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/023_selective_removal/roles/nginx/tasks/main.yml b/examples/023_selective_removal/roles/nginx/tasks/main.yml new file mode 100644 index 0000000..f69ee18 --- /dev/null +++ b/examples/023_selective_removal/roles/nginx/tasks/main.yml @@ -0,0 +1,31 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python-httplib2 + +- name: install nginx + apt: name=nginx state=present update_cache=yes + +- name: configure nginx sites + template: src=nginx.conf.j2 dest=/etc/nginx/sites-available/{{ item.key }} mode=0644 + with_dict: "{{ sites }}" + notify: restart nginx + +- name: get active sites + shell: ls /etc/nginx/sites-enabled + register: result + +- name: de-activate sites + file: path=/etc/nginx/sites-enabled/{{ item }} state=absent + with_items: "{{ result.stdout_lines }}" + when: item not in sites + notify: restart nginx + +- name: activate nginx sites + file: src=/etc/nginx/sites-available/{{ item.key }} dest=/etc/nginx/sites-enabled/{{ item.key }} state=link + with_dict: "{{ sites }}" + notify: restart nginx + +- name: ensure nginx started + service: name=nginx state=started enabled=yes diff --git a/examples/023_selective_removal/roles/nginx/templates/nginx.conf.j2 b/examples/023_selective_removal/roles/nginx/templates/nginx.conf.j2 new file mode 100644 index 0000000..092c8be --- /dev/null +++ b/examples/023_selective_removal/roles/nginx/templates/nginx.conf.j2 @@ -0,0 +1,13 @@ +upstream {{ item.key }} { +{% for server in groups.webserver %} + server {{ server }}:{{ item.value.backend }}; +{% endfor %} +} + +server { + listen {{ item.value.frontend }}; + + location / { + proxy_pass http://{{ item.key }}; + } +} diff --git a/examples/023_selective_removal/roles/nginx/vars/main.yml b/examples/023_selective_removal/roles/nginx/vars/main.yml new file mode 100644 index 0000000..d45faf6 --- /dev/null +++ b/examples/023_selective_removal/roles/nginx/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for nginx diff --git a/examples/023_selective_removal/site.yml b/examples/023_selective_removal/site.yml new file mode 100644 index 0000000..7299e9e --- /dev/null +++ b/examples/023_selective_removal/site.yml @@ -0,0 +1,6 @@ +--- +- include: control.yml +- include: database.yml +- include: webserver.yml +- include: loadbalancer.yml +- include: playbooks/stack_status.yml diff --git a/examples/023_selective_removal/webserver.yml b/examples/023_selective_removal/webserver.yml new file mode 100644 index 0000000..195ec7f --- /dev/null +++ b/examples/023_selective_removal/webserver.yml @@ -0,0 +1,6 @@ +--- +- hosts: webserver + become: true + roles: + - apache2 + - demo_app diff --git a/examples/024_continued/control.yml b/examples/024_continued/control.yml new file mode 100644 index 0000000..c6a8d81 --- /dev/null +++ b/examples/024_continued/control.yml @@ -0,0 +1,5 @@ +--- +- hosts: control + become: true + roles: + - control diff --git a/examples/024_continued/database.yml b/examples/024_continued/database.yml new file mode 100644 index 0000000..fee12fa --- /dev/null +++ b/examples/024_continued/database.yml @@ -0,0 +1,5 @@ +--- +- hosts: database + become: true + roles: + - { role: mysql, db_name: demo, db_user_name: demo, db_user_pass: demo, db_user_host: '%' } diff --git a/examples/024_continued/demo/app/demo.py b/examples/024_continued/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/024_continued/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/024_continued/demo/app/demo.wsgi b/examples/024_continued/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/024_continued/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/024_continued/demo/app/requirements.txt b/examples/024_continued/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/024_continued/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/024_continued/demo/demo.conf b/examples/024_continued/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/024_continued/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/024_continued/loadbalancer.yml b/examples/024_continued/loadbalancer.yml new file mode 100644 index 0000000..651bc7d --- /dev/null +++ b/examples/024_continued/loadbalancer.yml @@ -0,0 +1,5 @@ +--- +- hosts: loadbalancer + become: true + roles: + - nginx diff --git a/examples/024_continued/playbooks/hostname.yml b/examples/024_continued/playbooks/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/024_continued/playbooks/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/024_continued/playbooks/stack_restart.yml b/examples/024_continued/playbooks/stack_restart.yml new file mode 100644 index 0000000..d89c326 --- /dev/null +++ b/examples/024_continued/playbooks/stack_restart.yml @@ -0,0 +1,33 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + - wait_for: port=80 state=drained + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + - wait_for: port=80 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + - wait_for: host={{ ansible_eth0.ipv4.address }} port=3306 state=started + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + - wait_for: port=80 + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started + - wait_for: port=80 diff --git a/examples/024_continued/playbooks/stack_status.yml b/examples/024_continued/playbooks/stack_status.yml new file mode 100644 index 0000000..0676295 --- /dev/null +++ b/examples/024_continued/playbooks/stack_status.yml @@ -0,0 +1,67 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: verify nginx service + command: service nginx status + + - name: verify nginx is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: webserver + become: true + tasks: + - name: verify apache2 service + command: service apache2 status + + - name: verify apache2 is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: database + become: true + tasks: + - name: verify mysql service + command: service mysql status + + - name: verify mysql is listening on 3306 + wait_for: port=3306 timeout=1 + +- hosts: control + tasks: + - name: verify end-to-end index response + uri: url=http://{{item}} return_content=yes + with_items: groups.loadbalancer + register: lb_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny' not in item.content" + with_items: "{{lb_index.results}}" + + - name: verify end-to-end db response + uri: url=http://{{item}}/db return_content=yes + with_items: groups.loadbalancer + register: lb_db + + - fail: msg="db failed to return content" + when: "'Database Connected from' not in item.content" + with_items: "{{lb_db.results}}" + +- hosts: loadbalancer + tasks: + - name: verify backend index response + uri: url=http://{{item}} return_content=yes + with_items: groups.webserver + register: app_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny {{item.item}}!' not in item.content" + with_items: "{{app_index.results}}" + + - name: verify backend db response + uri: url=http://{{item}}/db return_content=yes + with_items: groups.webserver + register: app_db + + - fail: msg="db failed to return content" + when: "'Database Connected from {{item.item}}!' not in item.content" + with_items: "{{app_db.results}}" diff --git a/examples/024_continued/roles/apache2/README.md b/examples/024_continued/roles/apache2/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/024_continued/roles/apache2/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/024_continued/roles/apache2/defaults/main.yml b/examples/024_continued/roles/apache2/defaults/main.yml new file mode 100644 index 0000000..0381169 --- /dev/null +++ b/examples/024_continued/roles/apache2/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for apache2 diff --git a/examples/024_continued/roles/apache2/handlers/main.yml b/examples/024_continued/roles/apache2/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/024_continued/roles/apache2/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/024_continued/roles/apache2/meta/main.yml b/examples/024_continued/roles/apache2/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/024_continued/roles/apache2/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/024_continued/roles/apache2/tasks/main.yml b/examples/024_continued/roles/apache2/tasks/main.yml new file mode 100644 index 0000000..2d0632f --- /dev/null +++ b/examples/024_continued/roles/apache2/tasks/main.yml @@ -0,0 +1,17 @@ +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi + +- name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + +- name: de-activate default apache site + file: path=/etc/apache2/sites-enabled/000-default.conf state=absent + notify: restart apache2 + +- name: ensure apache2 started + service: name=apache2 state=started enabled=yes diff --git a/examples/024_continued/roles/apache2/vars/main.yml b/examples/024_continued/roles/apache2/vars/main.yml new file mode 100644 index 0000000..5d23ceb --- /dev/null +++ b/examples/024_continued/roles/apache2/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for apache2 diff --git a/examples/024_continued/roles/control/README.md b/examples/024_continued/roles/control/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/024_continued/roles/control/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/024_continued/roles/control/defaults/main.yml b/examples/024_continued/roles/control/defaults/main.yml new file mode 100644 index 0000000..9fe52bd --- /dev/null +++ b/examples/024_continued/roles/control/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for control diff --git a/examples/024_continued/roles/control/handlers/main.yml b/examples/024_continued/roles/control/handlers/main.yml new file mode 100644 index 0000000..4136893 --- /dev/null +++ b/examples/024_continued/roles/control/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for control diff --git a/examples/024_continued/roles/control/meta/main.yml b/examples/024_continued/roles/control/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/024_continued/roles/control/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/024_continued/roles/control/tasks/main.yml b/examples/024_continued/roles/control/tasks/main.yml new file mode 100644 index 0000000..330e91c --- /dev/null +++ b/examples/024_continued/roles/control/tasks/main.yml @@ -0,0 +1,6 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - curl + - python-httplib2 diff --git a/examples/024_continued/roles/control/vars/main.yml b/examples/024_continued/roles/control/vars/main.yml new file mode 100644 index 0000000..eadc8b6 --- /dev/null +++ b/examples/024_continued/roles/control/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for control diff --git a/examples/024_continued/roles/demo_app/README.md b/examples/024_continued/roles/demo_app/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/024_continued/roles/demo_app/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/024_continued/roles/demo_app/defaults/main.yml b/examples/024_continued/roles/demo_app/defaults/main.yml new file mode 100644 index 0000000..914e957 --- /dev/null +++ b/examples/024_continued/roles/demo_app/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for demo_app diff --git a/examples/024_continued/roles/demo_app/files/demo/app/demo.py b/examples/024_continued/roles/demo_app/files/demo/app/demo.py new file mode 100644 index 0000000..f7897f0 --- /dev/null +++ b/examples/024_continued/roles/demo_app/files/demo/app/demo.py @@ -0,0 +1,23 @@ +from flask import Flask +from flask.ext.sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + try: + db.create_all() + except Exception as e: + return e.message + '\n' + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() diff --git a/examples/024_continued/roles/demo_app/files/demo/app/requirements.txt b/examples/024_continued/roles/demo_app/files/demo/app/requirements.txt new file mode 100644 index 0000000..451ff90 --- /dev/null +++ b/examples/024_continued/roles/demo_app/files/demo/app/requirements.txt @@ -0,0 +1,2 @@ +Flask==0.10.1 +Flask-SQLAlchemy==2.0 diff --git a/examples/024_continued/roles/demo_app/files/demo/demo.conf b/examples/024_continued/roles/demo_app/files/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/024_continued/roles/demo_app/files/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/024_continued/roles/demo_app/handlers/main.yml b/examples/024_continued/roles/demo_app/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/024_continued/roles/demo_app/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/024_continued/roles/demo_app/meta/main.yml b/examples/024_continued/roles/demo_app/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/024_continued/roles/demo_app/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/024_continued/roles/demo_app/tasks/main.yml b/examples/024_continued/roles/demo_app/tasks/main.yml new file mode 100644 index 0000000..05a3d67 --- /dev/null +++ b/examples/024_continued/roles/demo_app/tasks/main.yml @@ -0,0 +1,27 @@ +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - python-pip-whl + - python3-virtualenv + - python3-mysqldb + +- name: copy demo app source + copy: src=demo/app/ dest=/var/www/demo mode=0755 + notify: restart apache2 + +- name: copy demo.wsgi + template: src=demo.wsgi.j2 dest=/var/www/demo/demo.wsgi mode=0755 + notify: restart apache2 + +- name: copy apache virtual host config + copy: src=demo/demo.conf dest=/etc/apache2/sites-available mode=0755 + notify: restart apache2 + +- name: setup python virtualenv + pip: requirements=/var/www/demo/requirements.txt virtualenv=/var/www/demo/.venv + notify: restart apache2 + +- name: activate demo apache site + file: src=/etc/apache2/sites-available/demo.conf dest=/etc/apache2/sites-enabled/demo.conf state=link + notify: restart apache2 diff --git a/examples/024_continued/roles/demo_app/templates/demo.wsgi.j2 b/examples/024_continued/roles/demo_app/templates/demo.wsgi.j2 new file mode 100644 index 0000000..9232790 --- /dev/null +++ b/examples/024_continued/roles/demo_app/templates/demo.wsgi.j2 @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://{{ db_user }}:{{ db_pass }}@db01/{{ db_name }}' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application diff --git a/examples/024_continued/roles/demo_app/vars/main.yml b/examples/024_continued/roles/demo_app/vars/main.yml new file mode 100644 index 0000000..52fb613 --- /dev/null +++ b/examples/024_continued/roles/demo_app/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for demo_app diff --git a/examples/024_continued/roles/mysql/README.md b/examples/024_continued/roles/mysql/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/024_continued/roles/mysql/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/024_continued/roles/mysql/defaults/main.yml b/examples/024_continued/roles/mysql/defaults/main.yml new file mode 100644 index 0000000..2ea6760 --- /dev/null +++ b/examples/024_continued/roles/mysql/defaults/main.yml @@ -0,0 +1,5 @@ +--- +db_name: myapp +db_user_name: dbuser +db_user_pass: dbpass +db_user_host: localhost diff --git a/examples/024_continued/roles/mysql/handlers/main.yml b/examples/024_continued/roles/mysql/handlers/main.yml new file mode 100644 index 0000000..3755d8c --- /dev/null +++ b/examples/024_continued/roles/mysql/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart mysql + service: name=mysql state=restarted diff --git a/examples/024_continued/roles/mysql/meta/main.yml b/examples/024_continued/roles/mysql/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/024_continued/roles/mysql/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/024_continued/roles/mysql/tasks/main.yml b/examples/024_continued/roles/mysql/tasks/main.yml new file mode 100644 index 0000000..c8f006c --- /dev/null +++ b/examples/024_continued/roles/mysql/tasks/main.yml @@ -0,0 +1,24 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python3-mysqldb + - mysql-server + +- name: install mysql-server + apt: name=mysql-server state=present update_cache=yes + +- name: ensure mysql listening on all ports + lineinfile: dest=/etc/mysql/my.cnf regexp=^bind-address + line="bind-address = {{ groups.database[0] }}" + notify: restart mysql + +- name: ensure mysql started + service: name=mysql state=started enabled=yes + +- name: create database + mysql_db: name={{ db_name }} state=present + +- name: create user + mysql_user: name={{ db_user_name }} password={{ db_user_pass }} priv={{ db_name }}.*:ALL + host='{{ db_user_host }}' state=present diff --git a/examples/024_continued/roles/mysql/vars/main.yml b/examples/024_continued/roles/mysql/vars/main.yml new file mode 100644 index 0000000..a79bfed --- /dev/null +++ b/examples/024_continued/roles/mysql/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for mysql diff --git a/examples/024_continued/roles/nginx/README.md b/examples/024_continued/roles/nginx/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/024_continued/roles/nginx/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/024_continued/roles/nginx/defaults/main.yml b/examples/024_continued/roles/nginx/defaults/main.yml new file mode 100644 index 0000000..0661d5d --- /dev/null +++ b/examples/024_continued/roles/nginx/defaults/main.yml @@ -0,0 +1,5 @@ +--- +sites: + myapp: + frontend: 80 + backend: 80 diff --git a/examples/024_continued/roles/nginx/handlers/main.yml b/examples/024_continued/roles/nginx/handlers/main.yml new file mode 100644 index 0000000..92971d2 --- /dev/null +++ b/examples/024_continued/roles/nginx/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart nginx + service: name=nginx state=restarted diff --git a/examples/024_continued/roles/nginx/meta/main.yml b/examples/024_continued/roles/nginx/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/024_continued/roles/nginx/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/024_continued/roles/nginx/tasks/main.yml b/examples/024_continued/roles/nginx/tasks/main.yml new file mode 100644 index 0000000..5e3e63a --- /dev/null +++ b/examples/024_continued/roles/nginx/tasks/main.yml @@ -0,0 +1,31 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python-httplib2 + +- name: install nginx + apt: name=nginx state=present update_cache=yes + +- name: configure nginx sites + template: src=nginx.conf.j2 dest=/etc/nginx/sites-available/{{ item.key }} mode=0644 + with_dict: "{{ sites }}" + notify: restart nginx + +- name: get active sites + shell: ls /etc/nginx/sites-enabled + register: active + +- name: de-activate sites + file: path=/etc/nginx/sites-enabled/{{ item }} state=absent + with_items: "{{ active.stdout_lines }}" + when: item not in sites + notify: restart nginx + +- name: activate nginx sites + file: src=/etc/nginx/sites-available/{{ item.key }} dest=/etc/nginx/sites-enabled/{{ item.key }} state=link + with_dict: "{{ sites }}" + notify: restart nginx + +- name: ensure nginx started + service: name=nginx state=started enabled=yes diff --git a/examples/024_continued/roles/nginx/templates/nginx.conf.j2 b/examples/024_continued/roles/nginx/templates/nginx.conf.j2 new file mode 100644 index 0000000..092c8be --- /dev/null +++ b/examples/024_continued/roles/nginx/templates/nginx.conf.j2 @@ -0,0 +1,13 @@ +upstream {{ item.key }} { +{% for server in groups.webserver %} + server {{ server }}:{{ item.value.backend }}; +{% endfor %} +} + +server { + listen {{ item.value.frontend }}; + + location / { + proxy_pass http://{{ item.key }}; + } +} diff --git a/examples/024_continued/roles/nginx/vars/main.yml b/examples/024_continued/roles/nginx/vars/main.yml new file mode 100644 index 0000000..d45faf6 --- /dev/null +++ b/examples/024_continued/roles/nginx/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for nginx diff --git a/examples/024_continued/site.yml b/examples/024_continued/site.yml new file mode 100644 index 0000000..7299e9e --- /dev/null +++ b/examples/024_continued/site.yml @@ -0,0 +1,6 @@ +--- +- include: control.yml +- include: database.yml +- include: webserver.yml +- include: loadbalancer.yml +- include: playbooks/stack_status.yml diff --git a/examples/024_continued/webserver.yml b/examples/024_continued/webserver.yml new file mode 100644 index 0000000..e860380 --- /dev/null +++ b/examples/024_continued/webserver.yml @@ -0,0 +1,6 @@ +--- +- hosts: webserver + become: true + roles: + - apache2 + - { role: demo_app, db_user: demo, db_pass: demo, db_name: demo } diff --git a/examples/025_vars_files_group_vars/control.yml b/examples/025_vars_files_group_vars/control.yml new file mode 100644 index 0000000..c6a8d81 --- /dev/null +++ b/examples/025_vars_files_group_vars/control.yml @@ -0,0 +1,5 @@ +--- +- hosts: control + become: true + roles: + - control diff --git a/examples/025_vars_files_group_vars/database.yml b/examples/025_vars_files_group_vars/database.yml new file mode 100644 index 0000000..6d7b7eb --- /dev/null +++ b/examples/025_vars_files_group_vars/database.yml @@ -0,0 +1,8 @@ +--- +- hosts: database + become: true + roles: + - role: mysql + db_user_name: "{{ db_user }}" + db_user_pass: "{{ db_pass }}" + db_user_host: '%' diff --git a/examples/025_vars_files_group_vars/group_vars/all b/examples/025_vars_files_group_vars/group_vars/all new file mode 100644 index 0000000..2fd732e --- /dev/null +++ b/examples/025_vars_files_group_vars/group_vars/all @@ -0,0 +1,12 @@ +--- +#DB from role mysql +db_name: maykadb +db_user: mayka_user +db_pass: mayka_pass +db_user_host: localhost + +#nginx loadbalancer configuration +sites: + myappmayka: + frontend: 80 + backend: 80 diff --git a/examples/025_vars_files_group_vars/loadbalancer.yml b/examples/025_vars_files_group_vars/loadbalancer.yml new file mode 100644 index 0000000..651bc7d --- /dev/null +++ b/examples/025_vars_files_group_vars/loadbalancer.yml @@ -0,0 +1,5 @@ +--- +- hosts: loadbalancer + become: true + roles: + - nginx diff --git a/examples/025_vars_files_group_vars/playbooks/hostname.yml b/examples/025_vars_files_group_vars/playbooks/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/025_vars_files_group_vars/playbooks/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/025_vars_files_group_vars/playbooks/stack_restart.yml b/examples/025_vars_files_group_vars/playbooks/stack_restart.yml new file mode 100644 index 0000000..d89c326 --- /dev/null +++ b/examples/025_vars_files_group_vars/playbooks/stack_restart.yml @@ -0,0 +1,33 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + - wait_for: port=80 state=drained + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + - wait_for: port=80 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + - wait_for: host={{ ansible_eth0.ipv4.address }} port=3306 state=started + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + - wait_for: port=80 + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started + - wait_for: port=80 diff --git a/examples/025_vars_files_group_vars/playbooks/stack_status.yml b/examples/025_vars_files_group_vars/playbooks/stack_status.yml new file mode 100644 index 0000000..2abc0ea --- /dev/null +++ b/examples/025_vars_files_group_vars/playbooks/stack_status.yml @@ -0,0 +1,67 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: verify nginx service + command: service nginx status + + - name: verify nginx is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: webserver + become: true + tasks: + - name: verify apache2 service + command: service apache2 status + + - name: verify apache2 is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: database + become: true + tasks: + - name: verify mysql service + command: service mysql status + + - name: verify mysql is listening on 3306 + wait_for: port=3306 timeout=1 + +- hosts: control + tasks: + - name: verify end-to-end index response + uri: url=http://{{item}} return_content=yes + with_items: "{{ groups.loadbalancer }}" + register: lb_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny' not in item.content" + with_items: "{{lb_index.results}}" + + - name: verify end-to-end db response + uri: url=http://{{item}}/db return_content=yes + with_items: "{{ groups.loadbalancer }}" + register: lb_db + + - fail: msg="db failed to return content" + when: "'Database Connected from' not in item.content" + with_items: "{{lb_db.results}}" + +- hosts: loadbalancer + tasks: + - name: verify backend index response + uri: url=http://{{item}} return_content=yes + with_items: "{{ groups.webserver }}" + register: app_index + +# - fail: msg="index failed to return content" +# when: "'Hello, from sunny {{ item.content }}!' not in item.content" +# with_items: "{{app_index.results}}" + + - name: verify backend db response + uri: url=http://{{item}}/db return_content=yes + with_items: "{{ groups.webserver }}" + register: app_db + +# - fail: msg="db failed to return content" +# when: "'Database Connected from {{ item.item }}!' not in item.content" +# with_items: "{{app_db.results}}" diff --git a/examples/025_vars_files_group_vars/roles/apache2/README.md b/examples/025_vars_files_group_vars/roles/apache2/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/apache2/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/025_vars_files_group_vars/roles/apache2/defaults/main.yml b/examples/025_vars_files_group_vars/roles/apache2/defaults/main.yml new file mode 100644 index 0000000..0381169 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/apache2/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for apache2 diff --git a/examples/025_vars_files_group_vars/roles/apache2/handlers/main.yml b/examples/025_vars_files_group_vars/roles/apache2/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/apache2/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/025_vars_files_group_vars/roles/apache2/meta/main.yml b/examples/025_vars_files_group_vars/roles/apache2/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/apache2/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/025_vars_files_group_vars/roles/apache2/tasks/main.yml b/examples/025_vars_files_group_vars/roles/apache2/tasks/main.yml new file mode 100644 index 0000000..e1fd9a3 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/apache2/tasks/main.yml @@ -0,0 +1,17 @@ +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi-py3 + +- name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + +- name: de-activate default apache site + file: path=/etc/apache2/sites-enabled/000-default.conf state=absent + notify: restart apache2 + +- name: ensure apache2 started + service: name=apache2 state=started enabled=yes diff --git a/examples/025_vars_files_group_vars/roles/apache2/vars/main.yml b/examples/025_vars_files_group_vars/roles/apache2/vars/main.yml new file mode 100644 index 0000000..5d23ceb --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/apache2/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for apache2 diff --git a/examples/025_vars_files_group_vars/roles/control/README.md b/examples/025_vars_files_group_vars/roles/control/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/control/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/025_vars_files_group_vars/roles/control/defaults/main.yml b/examples/025_vars_files_group_vars/roles/control/defaults/main.yml new file mode 100644 index 0000000..9fe52bd --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/control/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for control diff --git a/examples/025_vars_files_group_vars/roles/control/handlers/main.yml b/examples/025_vars_files_group_vars/roles/control/handlers/main.yml new file mode 100644 index 0000000..4136893 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/control/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for control diff --git a/examples/025_vars_files_group_vars/roles/control/meta/main.yml b/examples/025_vars_files_group_vars/roles/control/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/control/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/025_vars_files_group_vars/roles/control/tasks/main.yml b/examples/025_vars_files_group_vars/roles/control/tasks/main.yml new file mode 100644 index 0000000..330e91c --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/control/tasks/main.yml @@ -0,0 +1,6 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - curl + - python-httplib2 diff --git a/examples/025_vars_files_group_vars/roles/control/vars/main.yml b/examples/025_vars_files_group_vars/roles/control/vars/main.yml new file mode 100644 index 0000000..eadc8b6 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/control/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for control diff --git a/examples/025_vars_files_group_vars/roles/demo_app/README.md b/examples/025_vars_files_group_vars/roles/demo_app/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/demo_app/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/025_vars_files_group_vars/roles/demo_app/defaults/main.yml b/examples/025_vars_files_group_vars/roles/demo_app/defaults/main.yml new file mode 100644 index 0000000..914e957 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/demo_app/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for demo_app diff --git a/examples/025_vars_files_group_vars/roles/demo_app/files/demo/app/demo.py b/examples/025_vars_files_group_vars/roles/demo_app/files/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/demo_app/files/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/025_vars_files_group_vars/roles/demo_app/files/demo/app/demo.wsgi b/examples/025_vars_files_group_vars/roles/demo_app/files/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/demo_app/files/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/025_vars_files_group_vars/roles/demo_app/files/demo/app/requirements.txt b/examples/025_vars_files_group_vars/roles/demo_app/files/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/demo_app/files/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/025_vars_files_group_vars/roles/demo_app/files/demo/demo.conf b/examples/025_vars_files_group_vars/roles/demo_app/files/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/demo_app/files/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/025_vars_files_group_vars/roles/demo_app/handlers/main.yml b/examples/025_vars_files_group_vars/roles/demo_app/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/demo_app/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/025_vars_files_group_vars/roles/demo_app/meta/main.yml b/examples/025_vars_files_group_vars/roles/demo_app/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/demo_app/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/025_vars_files_group_vars/roles/demo_app/tasks/main.yml b/examples/025_vars_files_group_vars/roles/demo_app/tasks/main.yml new file mode 100644 index 0000000..05a3d67 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/demo_app/tasks/main.yml @@ -0,0 +1,27 @@ +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - python-pip-whl + - python3-virtualenv + - python3-mysqldb + +- name: copy demo app source + copy: src=demo/app/ dest=/var/www/demo mode=0755 + notify: restart apache2 + +- name: copy demo.wsgi + template: src=demo.wsgi.j2 dest=/var/www/demo/demo.wsgi mode=0755 + notify: restart apache2 + +- name: copy apache virtual host config + copy: src=demo/demo.conf dest=/etc/apache2/sites-available mode=0755 + notify: restart apache2 + +- name: setup python virtualenv + pip: requirements=/var/www/demo/requirements.txt virtualenv=/var/www/demo/.venv + notify: restart apache2 + +- name: activate demo apache site + file: src=/etc/apache2/sites-available/demo.conf dest=/etc/apache2/sites-enabled/demo.conf state=link + notify: restart apache2 diff --git a/examples/025_vars_files_group_vars/roles/demo_app/templates/demo.wsgi.j2 b/examples/025_vars_files_group_vars/roles/demo_app/templates/demo.wsgi.j2 new file mode 100644 index 0000000..7d65a51 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/demo_app/templates/demo.wsgi.j2 @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://{{ db_user }}:{{ db_pass }}@{{ groups.database[0] }}/{{ db_name }}' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application diff --git a/examples/025_vars_files_group_vars/roles/demo_app/vars/main.yml b/examples/025_vars_files_group_vars/roles/demo_app/vars/main.yml new file mode 100644 index 0000000..52fb613 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/demo_app/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for demo_app diff --git a/examples/025_vars_files_group_vars/roles/mysql/README.md b/examples/025_vars_files_group_vars/roles/mysql/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/mysql/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/025_vars_files_group_vars/roles/mysql/defaults/main.yml b/examples/025_vars_files_group_vars/roles/mysql/defaults/main.yml new file mode 100644 index 0000000..eefca51 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/mysql/defaults/main.yml @@ -0,0 +1,5 @@ +--- +#db_name: myapp +#db_user_name: dbuser +#db_user_pass: dbpass +#db_user_host: localhost diff --git a/examples/025_vars_files_group_vars/roles/mysql/handlers/main.yml b/examples/025_vars_files_group_vars/roles/mysql/handlers/main.yml new file mode 100644 index 0000000..3755d8c --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/mysql/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart mysql + service: name=mysql state=restarted diff --git a/examples/025_vars_files_group_vars/roles/mysql/meta/main.yml b/examples/025_vars_files_group_vars/roles/mysql/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/mysql/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/025_vars_files_group_vars/roles/mysql/tasks/main.yml b/examples/025_vars_files_group_vars/roles/mysql/tasks/main.yml new file mode 100644 index 0000000..9cf064a --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/mysql/tasks/main.yml @@ -0,0 +1,27 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python3-mysqldb + +- name: install mysql-server + apt: name=mysql-server state=present update_cache=yes + +- name: chmod 777 /etc/mysql/my.cnf + command: chmod 777 /etc/mysql/my.cnf + notify: restart mysql + +- name: ensure mysql listening on all ports + lineinfile: dest=/etc/mysql/my.cnf regexp=^bind-address + line="bind-address = {{ ansible_eth0.ipv4.address }}" + notify: restart mysql + +- name: ensure mysql started + service: name=mysql state=started enabled=yes + +- name: create database + mysql_db: name={{ db_name }} state=present + +- name: create user + mysql_user: name={{ db_user_name }} password={{ db_user_pass }} priv={{ db_name }}.*:ALL + host='{{ db_user_host }}' state=present diff --git a/examples/025_vars_files_group_vars/roles/mysql/vars/main.yml b/examples/025_vars_files_group_vars/roles/mysql/vars/main.yml new file mode 100644 index 0000000..a79bfed --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/mysql/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for mysql diff --git a/examples/025_vars_files_group_vars/roles/nginx/README.md b/examples/025_vars_files_group_vars/roles/nginx/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/nginx/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/025_vars_files_group_vars/roles/nginx/defaults/main.yml b/examples/025_vars_files_group_vars/roles/nginx/defaults/main.yml new file mode 100644 index 0000000..5a53da8 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/nginx/defaults/main.yml @@ -0,0 +1,5 @@ +#--- +#sites: +# myapp: +# frontend: 80 +# backend: 80 diff --git a/examples/025_vars_files_group_vars/roles/nginx/handlers/main.yml b/examples/025_vars_files_group_vars/roles/nginx/handlers/main.yml new file mode 100644 index 0000000..92971d2 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/nginx/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart nginx + service: name=nginx state=restarted diff --git a/examples/025_vars_files_group_vars/roles/nginx/meta/main.yml b/examples/025_vars_files_group_vars/roles/nginx/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/nginx/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/025_vars_files_group_vars/roles/nginx/tasks/main.yml b/examples/025_vars_files_group_vars/roles/nginx/tasks/main.yml new file mode 100644 index 0000000..4147480 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/nginx/tasks/main.yml @@ -0,0 +1,35 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python-httplib2 + +- name: install nginx + apt: name=nginx state=present update_cache=yes + +- name: configure nginx sites + template: src=nginx.conf.j2 dest=/etc/nginx/sites-available/{{ item.key }} mode=0644 + with_dict: "{{ sites }}" + notify: restart nginx + +- name: get active sites + shell: ls /etc/nginx/sites-enabled + register: result + +- name: de-activate default + file: path=/etc/nginx/sites-enabled/default state=absent + notify: restart nginx + +- name: de-activate sites + file: path=/etc/nginx/sites-enabled/{{ item }} state=absent + with_items: "{{ result.stdout_lines }}" + when: item not in sites + notify: restart nginx + +- name: activate nginx sites + file: src=/etc/nginx/sites-available/{{ item.key }} dest=/etc/nginx/sites-enabled/{{ item.key }} state=link + with_dict: "{{ sites }}" + notify: restart nginx + +- name: ensure nginx started + service: name=nginx state=started enabled=yes diff --git a/examples/025_vars_files_group_vars/roles/nginx/templates/nginx.conf.j2 b/examples/025_vars_files_group_vars/roles/nginx/templates/nginx.conf.j2 new file mode 100644 index 0000000..092c8be --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/nginx/templates/nginx.conf.j2 @@ -0,0 +1,13 @@ +upstream {{ item.key }} { +{% for server in groups.webserver %} + server {{ server }}:{{ item.value.backend }}; +{% endfor %} +} + +server { + listen {{ item.value.frontend }}; + + location / { + proxy_pass http://{{ item.key }}; + } +} diff --git a/examples/025_vars_files_group_vars/roles/nginx/vars/main.yml b/examples/025_vars_files_group_vars/roles/nginx/vars/main.yml new file mode 100644 index 0000000..d45faf6 --- /dev/null +++ b/examples/025_vars_files_group_vars/roles/nginx/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for nginx diff --git a/examples/025_vars_files_group_vars/site.yml b/examples/025_vars_files_group_vars/site.yml new file mode 100644 index 0000000..7299e9e --- /dev/null +++ b/examples/025_vars_files_group_vars/site.yml @@ -0,0 +1,6 @@ +--- +- include: control.yml +- include: database.yml +- include: webserver.yml +- include: loadbalancer.yml +- include: playbooks/stack_status.yml diff --git a/examples/025_vars_files_group_vars/webserver.yml b/examples/025_vars_files_group_vars/webserver.yml new file mode 100644 index 0000000..195ec7f --- /dev/null +++ b/examples/025_vars_files_group_vars/webserver.yml @@ -0,0 +1,6 @@ +--- +- hosts: webserver + become: true + roles: + - apache2 + - demo_app diff --git a/examples/026_vault/control.yml b/examples/026_vault/control.yml new file mode 100644 index 0000000..c6a8d81 --- /dev/null +++ b/examples/026_vault/control.yml @@ -0,0 +1,5 @@ +--- +- hosts: control + become: true + roles: + - control diff --git a/examples/026_vault/database.yml b/examples/026_vault/database.yml new file mode 100644 index 0000000..6d7b7eb --- /dev/null +++ b/examples/026_vault/database.yml @@ -0,0 +1,8 @@ +--- +- hosts: database + become: true + roles: + - role: mysql + db_user_name: "{{ db_user }}" + db_user_pass: "{{ db_pass }}" + db_user_host: '%' diff --git a/examples/026_vault/group_vars/all b/examples/026_vault/group_vars/all new file mode 100644 index 0000000..9a0f43e --- /dev/null +++ b/examples/026_vault/group_vars/all @@ -0,0 +1,15 @@ +$ANSIBLE_VAULT;1.1;AES256 +34663065306632666162353539363635666666653431636164316639303935613066643837303234 +3330306265323566313134623831613361336262666562340a383330396362383333383462336363 +37616534393332313163633063303436653862343431633834396538363739373435396338323162 +3230356333323765300a346436343931636134656237613633646662663637333635356563373565 +31343938333731316439353938646536333531313439643233393932303134383763376464336434 +63656634316561656337633566643430643634663333356231376534636138396533326462303836 +30336561623364643936336662616431383062636438366136313466396639633332383062313830 +34393836666638316233353563653265303264636333643139393563386362363031373362353435 +63373962343664373834333237333331393833646236386139633837303461626266383037303032 +33303230303864306639363936616635333436383431666435343931306531313461363664366632 +63363562326665646438636364303465303161633234333863653162643739653566626430386430 +32383266626237623739376233633434636362646630376139353364333835623532363164636565 +33633134636239333132353135623266393838653139656332383562653030346634306666363664 +3038366163306633326466393537353966656265386238363338 diff --git a/examples/026_vault/loadbalancer.yml b/examples/026_vault/loadbalancer.yml new file mode 100644 index 0000000..651bc7d --- /dev/null +++ b/examples/026_vault/loadbalancer.yml @@ -0,0 +1,5 @@ +--- +- hosts: loadbalancer + become: true + roles: + - nginx diff --git a/examples/026_vault/playbooks/hostname.yml b/examples/026_vault/playbooks/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/026_vault/playbooks/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/026_vault/playbooks/stack_restart.yml b/examples/026_vault/playbooks/stack_restart.yml new file mode 100644 index 0000000..d89c326 --- /dev/null +++ b/examples/026_vault/playbooks/stack_restart.yml @@ -0,0 +1,33 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + - wait_for: port=80 state=drained + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + - wait_for: port=80 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + - wait_for: host={{ ansible_eth0.ipv4.address }} port=3306 state=started + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + - wait_for: port=80 + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started + - wait_for: port=80 diff --git a/examples/026_vault/playbooks/stack_status.yml b/examples/026_vault/playbooks/stack_status.yml new file mode 100644 index 0000000..2abc0ea --- /dev/null +++ b/examples/026_vault/playbooks/stack_status.yml @@ -0,0 +1,67 @@ +--- +- hosts: loadbalancer + become: true + tasks: + - name: verify nginx service + command: service nginx status + + - name: verify nginx is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: webserver + become: true + tasks: + - name: verify apache2 service + command: service apache2 status + + - name: verify apache2 is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: database + become: true + tasks: + - name: verify mysql service + command: service mysql status + + - name: verify mysql is listening on 3306 + wait_for: port=3306 timeout=1 + +- hosts: control + tasks: + - name: verify end-to-end index response + uri: url=http://{{item}} return_content=yes + with_items: "{{ groups.loadbalancer }}" + register: lb_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny' not in item.content" + with_items: "{{lb_index.results}}" + + - name: verify end-to-end db response + uri: url=http://{{item}}/db return_content=yes + with_items: "{{ groups.loadbalancer }}" + register: lb_db + + - fail: msg="db failed to return content" + when: "'Database Connected from' not in item.content" + with_items: "{{lb_db.results}}" + +- hosts: loadbalancer + tasks: + - name: verify backend index response + uri: url=http://{{item}} return_content=yes + with_items: "{{ groups.webserver }}" + register: app_index + +# - fail: msg="index failed to return content" +# when: "'Hello, from sunny {{ item.content }}!' not in item.content" +# with_items: "{{app_index.results}}" + + - name: verify backend db response + uri: url=http://{{item}}/db return_content=yes + with_items: "{{ groups.webserver }}" + register: app_db + +# - fail: msg="db failed to return content" +# when: "'Database Connected from {{ item.item }}!' not in item.content" +# with_items: "{{app_db.results}}" diff --git a/examples/026_vault/roles/apache2/README.md b/examples/026_vault/roles/apache2/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/026_vault/roles/apache2/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/026_vault/roles/apache2/defaults/main.yml b/examples/026_vault/roles/apache2/defaults/main.yml new file mode 100644 index 0000000..0381169 --- /dev/null +++ b/examples/026_vault/roles/apache2/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for apache2 diff --git a/examples/026_vault/roles/apache2/handlers/main.yml b/examples/026_vault/roles/apache2/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/026_vault/roles/apache2/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/026_vault/roles/apache2/meta/main.yml b/examples/026_vault/roles/apache2/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/026_vault/roles/apache2/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/026_vault/roles/apache2/tasks/main.yml b/examples/026_vault/roles/apache2/tasks/main.yml new file mode 100644 index 0000000..e1fd9a3 --- /dev/null +++ b/examples/026_vault/roles/apache2/tasks/main.yml @@ -0,0 +1,17 @@ +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi-py3 + +- name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + +- name: de-activate default apache site + file: path=/etc/apache2/sites-enabled/000-default.conf state=absent + notify: restart apache2 + +- name: ensure apache2 started + service: name=apache2 state=started enabled=yes diff --git a/examples/026_vault/roles/apache2/vars/main.yml b/examples/026_vault/roles/apache2/vars/main.yml new file mode 100644 index 0000000..5d23ceb --- /dev/null +++ b/examples/026_vault/roles/apache2/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for apache2 diff --git a/examples/026_vault/roles/control/README.md b/examples/026_vault/roles/control/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/026_vault/roles/control/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/026_vault/roles/control/defaults/main.yml b/examples/026_vault/roles/control/defaults/main.yml new file mode 100644 index 0000000..9fe52bd --- /dev/null +++ b/examples/026_vault/roles/control/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for control diff --git a/examples/026_vault/roles/control/handlers/main.yml b/examples/026_vault/roles/control/handlers/main.yml new file mode 100644 index 0000000..4136893 --- /dev/null +++ b/examples/026_vault/roles/control/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for control diff --git a/examples/026_vault/roles/control/meta/main.yml b/examples/026_vault/roles/control/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/026_vault/roles/control/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/026_vault/roles/control/tasks/main.yml b/examples/026_vault/roles/control/tasks/main.yml new file mode 100644 index 0000000..330e91c --- /dev/null +++ b/examples/026_vault/roles/control/tasks/main.yml @@ -0,0 +1,6 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - curl + - python-httplib2 diff --git a/examples/026_vault/roles/control/vars/main.yml b/examples/026_vault/roles/control/vars/main.yml new file mode 100644 index 0000000..eadc8b6 --- /dev/null +++ b/examples/026_vault/roles/control/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for control diff --git a/examples/026_vault/roles/demo_app/README.md b/examples/026_vault/roles/demo_app/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/026_vault/roles/demo_app/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/026_vault/roles/demo_app/defaults/main.yml b/examples/026_vault/roles/demo_app/defaults/main.yml new file mode 100644 index 0000000..914e957 --- /dev/null +++ b/examples/026_vault/roles/demo_app/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for demo_app diff --git a/examples/026_vault/roles/demo_app/files/demo/app/demo.py b/examples/026_vault/roles/demo_app/files/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/026_vault/roles/demo_app/files/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/026_vault/roles/demo_app/files/demo/app/demo.wsgi b/examples/026_vault/roles/demo_app/files/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/026_vault/roles/demo_app/files/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/026_vault/roles/demo_app/files/demo/app/requirements.txt b/examples/026_vault/roles/demo_app/files/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/026_vault/roles/demo_app/files/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/026_vault/roles/demo_app/files/demo/demo.conf b/examples/026_vault/roles/demo_app/files/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/026_vault/roles/demo_app/files/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/026_vault/roles/demo_app/handlers/main.yml b/examples/026_vault/roles/demo_app/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/026_vault/roles/demo_app/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/026_vault/roles/demo_app/meta/main.yml b/examples/026_vault/roles/demo_app/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/026_vault/roles/demo_app/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/026_vault/roles/demo_app/tasks/main.yml b/examples/026_vault/roles/demo_app/tasks/main.yml new file mode 100644 index 0000000..05a3d67 --- /dev/null +++ b/examples/026_vault/roles/demo_app/tasks/main.yml @@ -0,0 +1,27 @@ +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - python-pip-whl + - python3-virtualenv + - python3-mysqldb + +- name: copy demo app source + copy: src=demo/app/ dest=/var/www/demo mode=0755 + notify: restart apache2 + +- name: copy demo.wsgi + template: src=demo.wsgi.j2 dest=/var/www/demo/demo.wsgi mode=0755 + notify: restart apache2 + +- name: copy apache virtual host config + copy: src=demo/demo.conf dest=/etc/apache2/sites-available mode=0755 + notify: restart apache2 + +- name: setup python virtualenv + pip: requirements=/var/www/demo/requirements.txt virtualenv=/var/www/demo/.venv + notify: restart apache2 + +- name: activate demo apache site + file: src=/etc/apache2/sites-available/demo.conf dest=/etc/apache2/sites-enabled/demo.conf state=link + notify: restart apache2 diff --git a/examples/026_vault/roles/demo_app/templates/demo.wsgi.j2 b/examples/026_vault/roles/demo_app/templates/demo.wsgi.j2 new file mode 100644 index 0000000..7d65a51 --- /dev/null +++ b/examples/026_vault/roles/demo_app/templates/demo.wsgi.j2 @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://{{ db_user }}:{{ db_pass }}@{{ groups.database[0] }}/{{ db_name }}' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application diff --git a/examples/026_vault/roles/demo_app/vars/main.yml b/examples/026_vault/roles/demo_app/vars/main.yml new file mode 100644 index 0000000..52fb613 --- /dev/null +++ b/examples/026_vault/roles/demo_app/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for demo_app diff --git a/examples/026_vault/roles/mysql/README.md b/examples/026_vault/roles/mysql/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/026_vault/roles/mysql/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/026_vault/roles/mysql/defaults/main.yml b/examples/026_vault/roles/mysql/defaults/main.yml new file mode 100644 index 0000000..eefca51 --- /dev/null +++ b/examples/026_vault/roles/mysql/defaults/main.yml @@ -0,0 +1,5 @@ +--- +#db_name: myapp +#db_user_name: dbuser +#db_user_pass: dbpass +#db_user_host: localhost diff --git a/examples/026_vault/roles/mysql/handlers/main.yml b/examples/026_vault/roles/mysql/handlers/main.yml new file mode 100644 index 0000000..3755d8c --- /dev/null +++ b/examples/026_vault/roles/mysql/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart mysql + service: name=mysql state=restarted diff --git a/examples/026_vault/roles/mysql/meta/main.yml b/examples/026_vault/roles/mysql/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/026_vault/roles/mysql/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/026_vault/roles/mysql/tasks/main.yml b/examples/026_vault/roles/mysql/tasks/main.yml new file mode 100644 index 0000000..9cf064a --- /dev/null +++ b/examples/026_vault/roles/mysql/tasks/main.yml @@ -0,0 +1,27 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python3-mysqldb + +- name: install mysql-server + apt: name=mysql-server state=present update_cache=yes + +- name: chmod 777 /etc/mysql/my.cnf + command: chmod 777 /etc/mysql/my.cnf + notify: restart mysql + +- name: ensure mysql listening on all ports + lineinfile: dest=/etc/mysql/my.cnf regexp=^bind-address + line="bind-address = {{ ansible_eth0.ipv4.address }}" + notify: restart mysql + +- name: ensure mysql started + service: name=mysql state=started enabled=yes + +- name: create database + mysql_db: name={{ db_name }} state=present + +- name: create user + mysql_user: name={{ db_user_name }} password={{ db_user_pass }} priv={{ db_name }}.*:ALL + host='{{ db_user_host }}' state=present diff --git a/examples/026_vault/roles/mysql/vars/main.yml b/examples/026_vault/roles/mysql/vars/main.yml new file mode 100644 index 0000000..a79bfed --- /dev/null +++ b/examples/026_vault/roles/mysql/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for mysql diff --git a/examples/026_vault/roles/nginx/README.md b/examples/026_vault/roles/nginx/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/026_vault/roles/nginx/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/026_vault/roles/nginx/defaults/main.yml b/examples/026_vault/roles/nginx/defaults/main.yml new file mode 100644 index 0000000..5a53da8 --- /dev/null +++ b/examples/026_vault/roles/nginx/defaults/main.yml @@ -0,0 +1,5 @@ +#--- +#sites: +# myapp: +# frontend: 80 +# backend: 80 diff --git a/examples/026_vault/roles/nginx/handlers/main.yml b/examples/026_vault/roles/nginx/handlers/main.yml new file mode 100644 index 0000000..92971d2 --- /dev/null +++ b/examples/026_vault/roles/nginx/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart nginx + service: name=nginx state=restarted diff --git a/examples/026_vault/roles/nginx/meta/main.yml b/examples/026_vault/roles/nginx/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/026_vault/roles/nginx/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/026_vault/roles/nginx/tasks/main.yml b/examples/026_vault/roles/nginx/tasks/main.yml new file mode 100644 index 0000000..643cca3 --- /dev/null +++ b/examples/026_vault/roles/nginx/tasks/main.yml @@ -0,0 +1,35 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python-httplib2 + +- name: install nginx + apt: name=nginx state=present update_cache=yes + +- name: configure nginx sites + template: src=nginx.conf.j2 dest=/etc/nginx/sites-available/{{ item.key }} mode=0644 + with_dict: "{{ sites }}" + notify: restart nginx + +- name: get active sites + shell: ls -l /etc/nginx/sites-enabled + register: result + +- name: de-activate default + file: path=/etc/nginx/sites-enabled/default state=absent + notify: restart nginx + +- name: de-activate sites + file: path=/etc/nginx/sites-enabled/{{ item }} state=absent + with_items: active.stdout_lines + when: item not in sites + notify: restart nginx + +- name: activate nginx sites + file: src=/etc/nginx/sites-available/{{ item.key }} dest=/etc/nginx/sites-enabled/{{ item.key }} state=link + with_dict: "{{ sites }}" + notify: restart nginx + +- name: ensure nginx started + service: name=nginx state=started enabled=yes diff --git a/examples/026_vault/roles/nginx/templates/nginx.conf.j2 b/examples/026_vault/roles/nginx/templates/nginx.conf.j2 new file mode 100644 index 0000000..092c8be --- /dev/null +++ b/examples/026_vault/roles/nginx/templates/nginx.conf.j2 @@ -0,0 +1,13 @@ +upstream {{ item.key }} { +{% for server in groups.webserver %} + server {{ server }}:{{ item.value.backend }}; +{% endfor %} +} + +server { + listen {{ item.value.frontend }}; + + location / { + proxy_pass http://{{ item.key }}; + } +} diff --git a/examples/026_vault/roles/nginx/vars/main.yml b/examples/026_vault/roles/nginx/vars/main.yml new file mode 100644 index 0000000..d45faf6 --- /dev/null +++ b/examples/026_vault/roles/nginx/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for nginx diff --git a/examples/026_vault/site.yml b/examples/026_vault/site.yml new file mode 100644 index 0000000..7299e9e --- /dev/null +++ b/examples/026_vault/site.yml @@ -0,0 +1,6 @@ +--- +- include: control.yml +- include: database.yml +- include: webserver.yml +- include: loadbalancer.yml +- include: playbooks/stack_status.yml diff --git a/examples/026_vault/webserver.yml b/examples/026_vault/webserver.yml new file mode 100644 index 0000000..195ec7f --- /dev/null +++ b/examples/026_vault/webserver.yml @@ -0,0 +1,6 @@ +--- +- hosts: webserver + become: true + roles: + - apache2 + - demo_app diff --git a/examples/027_gather_facts/control.yml b/examples/027_gather_facts/control.yml new file mode 100644 index 0000000..c959863 --- /dev/null +++ b/examples/027_gather_facts/control.yml @@ -0,0 +1,6 @@ +--- +- hosts: control + become: true + gather_facts: false + roles: + - control diff --git a/examples/027_gather_facts/database.yml b/examples/027_gather_facts/database.yml new file mode 100644 index 0000000..6d7b7eb --- /dev/null +++ b/examples/027_gather_facts/database.yml @@ -0,0 +1,8 @@ +--- +- hosts: database + become: true + roles: + - role: mysql + db_user_name: "{{ db_user }}" + db_user_pass: "{{ db_pass }}" + db_user_host: '%' diff --git a/examples/027_gather_facts/group_vars/all b/examples/027_gather_facts/group_vars/all new file mode 100644 index 0000000..2fd732e --- /dev/null +++ b/examples/027_gather_facts/group_vars/all @@ -0,0 +1,12 @@ +--- +#DB from role mysql +db_name: maykadb +db_user: mayka_user +db_pass: mayka_pass +db_user_host: localhost + +#nginx loadbalancer configuration +sites: + myappmayka: + frontend: 80 + backend: 80 diff --git a/examples/027_gather_facts/loadbalancer.yml b/examples/027_gather_facts/loadbalancer.yml new file mode 100644 index 0000000..5d025e2 --- /dev/null +++ b/examples/027_gather_facts/loadbalancer.yml @@ -0,0 +1,6 @@ +--- +- hosts: loadbalancer + become: true + gather_facts: false + roles: + - nginx diff --git a/examples/027_gather_facts/playbooks/hostname.yml b/examples/027_gather_facts/playbooks/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/027_gather_facts/playbooks/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/027_gather_facts/playbooks/stack_restart.yml b/examples/027_gather_facts/playbooks/stack_restart.yml new file mode 100644 index 0000000..d89c326 --- /dev/null +++ b/examples/027_gather_facts/playbooks/stack_restart.yml @@ -0,0 +1,33 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + - wait_for: port=80 state=drained + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + - wait_for: port=80 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + - wait_for: host={{ ansible_eth0.ipv4.address }} port=3306 state=started + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + - wait_for: port=80 + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started + - wait_for: port=80 diff --git a/examples/027_gather_facts/playbooks/stack_status.yml b/examples/027_gather_facts/playbooks/stack_status.yml new file mode 100644 index 0000000..4dab982 --- /dev/null +++ b/examples/027_gather_facts/playbooks/stack_status.yml @@ -0,0 +1,71 @@ +--- +- hosts: loadbalancer + become: true + gather_facts: false + tasks: + - name: verify nginx service + command: service nginx status + + - name: verify nginx is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: webserver + become: true + gather_facts: false + tasks: + - name: verify apache2 service + command: service apache2 status + + - name: verify apache2 is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: database + become: true + tasks: + - name: verify mysql service + command: service mysql status + + - name: verify mysql is listening on 3306 + wait_for: port=3306 timeout=1 + +- hosts: control + gather_facts: false + tasks: + - name: verify end-to-end index response + uri: url=http://{{item}} return_content=yes + with_items: "{{ groups.loadbalancer }}" + register: lb_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny' not in item.content" + with_items: "{{lb_index.results}}" + + - name: verify end-to-end db response + uri: url=http://{{item}}/db return_content=yes + with_items: "{{ groups.loadbalancer }}" + register: lb_db + + - fail: msg="db failed to return content" + when: "'Database Connected from' not in item.content" + with_items: "{{lb_db.results}}" + +- hosts: loadbalancer + gather_facts: false + tasks: + - name: verify backend index response + uri: url=http://{{item}} return_content=yes + with_items: "{{ groups.webserver }}" + register: app_index + +# - fail: msg="index failed to return content" +# when: "'Hello, from sunny {{ item.content }}!' not in item.content" +# with_items: "{{app_index.results}}" + + - name: verify backend db response + uri: url=http://{{item}}/db return_content=yes + with_items: "{{ groups.webserver }}" + register: app_db + +# - fail: msg="db failed to return content" +# when: "'Database Connected from {{ item.item }}!' not in item.content" +# with_items: "{{app_db.results}}" diff --git a/examples/027_gather_facts/roles/apache2/README.md b/examples/027_gather_facts/roles/apache2/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/027_gather_facts/roles/apache2/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/027_gather_facts/roles/apache2/defaults/main.yml b/examples/027_gather_facts/roles/apache2/defaults/main.yml new file mode 100644 index 0000000..0381169 --- /dev/null +++ b/examples/027_gather_facts/roles/apache2/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for apache2 diff --git a/examples/027_gather_facts/roles/apache2/handlers/main.yml b/examples/027_gather_facts/roles/apache2/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/027_gather_facts/roles/apache2/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/027_gather_facts/roles/apache2/meta/main.yml b/examples/027_gather_facts/roles/apache2/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/027_gather_facts/roles/apache2/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/027_gather_facts/roles/apache2/tasks/main.yml b/examples/027_gather_facts/roles/apache2/tasks/main.yml new file mode 100644 index 0000000..e1fd9a3 --- /dev/null +++ b/examples/027_gather_facts/roles/apache2/tasks/main.yml @@ -0,0 +1,17 @@ +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - apache2 + - libapache2-mod-wsgi-py3 + +- name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + +- name: de-activate default apache site + file: path=/etc/apache2/sites-enabled/000-default.conf state=absent + notify: restart apache2 + +- name: ensure apache2 started + service: name=apache2 state=started enabled=yes diff --git a/examples/027_gather_facts/roles/apache2/vars/main.yml b/examples/027_gather_facts/roles/apache2/vars/main.yml new file mode 100644 index 0000000..5d23ceb --- /dev/null +++ b/examples/027_gather_facts/roles/apache2/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for apache2 diff --git a/examples/027_gather_facts/roles/control/README.md b/examples/027_gather_facts/roles/control/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/027_gather_facts/roles/control/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/027_gather_facts/roles/control/defaults/main.yml b/examples/027_gather_facts/roles/control/defaults/main.yml new file mode 100644 index 0000000..9fe52bd --- /dev/null +++ b/examples/027_gather_facts/roles/control/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for control diff --git a/examples/027_gather_facts/roles/control/handlers/main.yml b/examples/027_gather_facts/roles/control/handlers/main.yml new file mode 100644 index 0000000..4136893 --- /dev/null +++ b/examples/027_gather_facts/roles/control/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for control diff --git a/examples/027_gather_facts/roles/control/meta/main.yml b/examples/027_gather_facts/roles/control/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/027_gather_facts/roles/control/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/027_gather_facts/roles/control/tasks/main.yml b/examples/027_gather_facts/roles/control/tasks/main.yml new file mode 100644 index 0000000..330e91c --- /dev/null +++ b/examples/027_gather_facts/roles/control/tasks/main.yml @@ -0,0 +1,6 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - curl + - python-httplib2 diff --git a/examples/027_gather_facts/roles/control/vars/main.yml b/examples/027_gather_facts/roles/control/vars/main.yml new file mode 100644 index 0000000..eadc8b6 --- /dev/null +++ b/examples/027_gather_facts/roles/control/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for control diff --git a/examples/027_gather_facts/roles/demo_app/README.md b/examples/027_gather_facts/roles/demo_app/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/027_gather_facts/roles/demo_app/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/027_gather_facts/roles/demo_app/defaults/main.yml b/examples/027_gather_facts/roles/demo_app/defaults/main.yml new file mode 100644 index 0000000..914e957 --- /dev/null +++ b/examples/027_gather_facts/roles/demo_app/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for demo_app diff --git a/examples/027_gather_facts/roles/demo_app/files/demo/app/demo.py b/examples/027_gather_facts/roles/demo_app/files/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/027_gather_facts/roles/demo_app/files/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/027_gather_facts/roles/demo_app/files/demo/app/demo.wsgi b/examples/027_gather_facts/roles/demo_app/files/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/027_gather_facts/roles/demo_app/files/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/027_gather_facts/roles/demo_app/files/demo/app/requirements.txt b/examples/027_gather_facts/roles/demo_app/files/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/027_gather_facts/roles/demo_app/files/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/027_gather_facts/roles/demo_app/files/demo/demo.conf b/examples/027_gather_facts/roles/demo_app/files/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/027_gather_facts/roles/demo_app/files/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/027_gather_facts/roles/demo_app/handlers/main.yml b/examples/027_gather_facts/roles/demo_app/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/027_gather_facts/roles/demo_app/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/027_gather_facts/roles/demo_app/meta/main.yml b/examples/027_gather_facts/roles/demo_app/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/027_gather_facts/roles/demo_app/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/027_gather_facts/roles/demo_app/tasks/main.yml b/examples/027_gather_facts/roles/demo_app/tasks/main.yml new file mode 100644 index 0000000..05a3d67 --- /dev/null +++ b/examples/027_gather_facts/roles/demo_app/tasks/main.yml @@ -0,0 +1,27 @@ +--- +- name: install web components + apt: name={{item}} state=present update_cache=yes + with_items: + - python-pip-whl + - python3-virtualenv + - python3-mysqldb + +- name: copy demo app source + copy: src=demo/app/ dest=/var/www/demo mode=0755 + notify: restart apache2 + +- name: copy demo.wsgi + template: src=demo.wsgi.j2 dest=/var/www/demo/demo.wsgi mode=0755 + notify: restart apache2 + +- name: copy apache virtual host config + copy: src=demo/demo.conf dest=/etc/apache2/sites-available mode=0755 + notify: restart apache2 + +- name: setup python virtualenv + pip: requirements=/var/www/demo/requirements.txt virtualenv=/var/www/demo/.venv + notify: restart apache2 + +- name: activate demo apache site + file: src=/etc/apache2/sites-available/demo.conf dest=/etc/apache2/sites-enabled/demo.conf state=link + notify: restart apache2 diff --git a/examples/027_gather_facts/roles/demo_app/templates/demo.wsgi.j2 b/examples/027_gather_facts/roles/demo_app/templates/demo.wsgi.j2 new file mode 100644 index 0000000..7d65a51 --- /dev/null +++ b/examples/027_gather_facts/roles/demo_app/templates/demo.wsgi.j2 @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://{{ db_user }}:{{ db_pass }}@{{ groups.database[0] }}/{{ db_name }}' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application diff --git a/examples/027_gather_facts/roles/demo_app/vars/main.yml b/examples/027_gather_facts/roles/demo_app/vars/main.yml new file mode 100644 index 0000000..52fb613 --- /dev/null +++ b/examples/027_gather_facts/roles/demo_app/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for demo_app diff --git a/examples/027_gather_facts/roles/mysql/README.md b/examples/027_gather_facts/roles/mysql/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/027_gather_facts/roles/mysql/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/027_gather_facts/roles/mysql/defaults/main.yml b/examples/027_gather_facts/roles/mysql/defaults/main.yml new file mode 100644 index 0000000..eefca51 --- /dev/null +++ b/examples/027_gather_facts/roles/mysql/defaults/main.yml @@ -0,0 +1,5 @@ +--- +#db_name: myapp +#db_user_name: dbuser +#db_user_pass: dbpass +#db_user_host: localhost diff --git a/examples/027_gather_facts/roles/mysql/handlers/main.yml b/examples/027_gather_facts/roles/mysql/handlers/main.yml new file mode 100644 index 0000000..3755d8c --- /dev/null +++ b/examples/027_gather_facts/roles/mysql/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart mysql + service: name=mysql state=restarted diff --git a/examples/027_gather_facts/roles/mysql/meta/main.yml b/examples/027_gather_facts/roles/mysql/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/027_gather_facts/roles/mysql/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/027_gather_facts/roles/mysql/tasks/main.yml b/examples/027_gather_facts/roles/mysql/tasks/main.yml new file mode 100644 index 0000000..9cf064a --- /dev/null +++ b/examples/027_gather_facts/roles/mysql/tasks/main.yml @@ -0,0 +1,27 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python3-mysqldb + +- name: install mysql-server + apt: name=mysql-server state=present update_cache=yes + +- name: chmod 777 /etc/mysql/my.cnf + command: chmod 777 /etc/mysql/my.cnf + notify: restart mysql + +- name: ensure mysql listening on all ports + lineinfile: dest=/etc/mysql/my.cnf regexp=^bind-address + line="bind-address = {{ ansible_eth0.ipv4.address }}" + notify: restart mysql + +- name: ensure mysql started + service: name=mysql state=started enabled=yes + +- name: create database + mysql_db: name={{ db_name }} state=present + +- name: create user + mysql_user: name={{ db_user_name }} password={{ db_user_pass }} priv={{ db_name }}.*:ALL + host='{{ db_user_host }}' state=present diff --git a/examples/027_gather_facts/roles/mysql/vars/main.yml b/examples/027_gather_facts/roles/mysql/vars/main.yml new file mode 100644 index 0000000..a79bfed --- /dev/null +++ b/examples/027_gather_facts/roles/mysql/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for mysql diff --git a/examples/027_gather_facts/roles/nginx/README.md b/examples/027_gather_facts/roles/nginx/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/027_gather_facts/roles/nginx/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/027_gather_facts/roles/nginx/defaults/main.yml b/examples/027_gather_facts/roles/nginx/defaults/main.yml new file mode 100644 index 0000000..5a53da8 --- /dev/null +++ b/examples/027_gather_facts/roles/nginx/defaults/main.yml @@ -0,0 +1,5 @@ +#--- +#sites: +# myapp: +# frontend: 80 +# backend: 80 diff --git a/examples/027_gather_facts/roles/nginx/handlers/main.yml b/examples/027_gather_facts/roles/nginx/handlers/main.yml new file mode 100644 index 0000000..92971d2 --- /dev/null +++ b/examples/027_gather_facts/roles/nginx/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart nginx + service: name=nginx state=restarted diff --git a/examples/027_gather_facts/roles/nginx/meta/main.yml b/examples/027_gather_facts/roles/nginx/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/027_gather_facts/roles/nginx/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/027_gather_facts/roles/nginx/tasks/main.yml b/examples/027_gather_facts/roles/nginx/tasks/main.yml new file mode 100644 index 0000000..643cca3 --- /dev/null +++ b/examples/027_gather_facts/roles/nginx/tasks/main.yml @@ -0,0 +1,35 @@ +--- +- name: install tools + apt: name={{item}} state=present update_cache=yes + with_items: + - python-httplib2 + +- name: install nginx + apt: name=nginx state=present update_cache=yes + +- name: configure nginx sites + template: src=nginx.conf.j2 dest=/etc/nginx/sites-available/{{ item.key }} mode=0644 + with_dict: "{{ sites }}" + notify: restart nginx + +- name: get active sites + shell: ls -l /etc/nginx/sites-enabled + register: result + +- name: de-activate default + file: path=/etc/nginx/sites-enabled/default state=absent + notify: restart nginx + +- name: de-activate sites + file: path=/etc/nginx/sites-enabled/{{ item }} state=absent + with_items: active.stdout_lines + when: item not in sites + notify: restart nginx + +- name: activate nginx sites + file: src=/etc/nginx/sites-available/{{ item.key }} dest=/etc/nginx/sites-enabled/{{ item.key }} state=link + with_dict: "{{ sites }}" + notify: restart nginx + +- name: ensure nginx started + service: name=nginx state=started enabled=yes diff --git a/examples/027_gather_facts/roles/nginx/templates/nginx.conf.j2 b/examples/027_gather_facts/roles/nginx/templates/nginx.conf.j2 new file mode 100644 index 0000000..092c8be --- /dev/null +++ b/examples/027_gather_facts/roles/nginx/templates/nginx.conf.j2 @@ -0,0 +1,13 @@ +upstream {{ item.key }} { +{% for server in groups.webserver %} + server {{ server }}:{{ item.value.backend }}; +{% endfor %} +} + +server { + listen {{ item.value.frontend }}; + + location / { + proxy_pass http://{{ item.key }}; + } +} diff --git a/examples/027_gather_facts/roles/nginx/vars/main.yml b/examples/027_gather_facts/roles/nginx/vars/main.yml new file mode 100644 index 0000000..d45faf6 --- /dev/null +++ b/examples/027_gather_facts/roles/nginx/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for nginx diff --git a/examples/027_gather_facts/site.yml b/examples/027_gather_facts/site.yml new file mode 100644 index 0000000..7299e9e --- /dev/null +++ b/examples/027_gather_facts/site.yml @@ -0,0 +1,6 @@ +--- +- include: control.yml +- include: database.yml +- include: webserver.yml +- include: loadbalancer.yml +- include: playbooks/stack_status.yml diff --git a/examples/027_gather_facts/webserver.yml b/examples/027_gather_facts/webserver.yml new file mode 100644 index 0000000..98f1b45 --- /dev/null +++ b/examples/027_gather_facts/webserver.yml @@ -0,0 +1,7 @@ +--- +- hosts: webserver + become: true + gather_facts: false + roles: + - apache2 + - demo_app diff --git a/examples/028_apt_cache_one_day/control.yml b/examples/028_apt_cache_one_day/control.yml new file mode 100644 index 0000000..c959863 --- /dev/null +++ b/examples/028_apt_cache_one_day/control.yml @@ -0,0 +1,6 @@ +--- +- hosts: control + become: true + gather_facts: false + roles: + - control diff --git a/examples/028_apt_cache_one_day/database.yml b/examples/028_apt_cache_one_day/database.yml new file mode 100644 index 0000000..6d7b7eb --- /dev/null +++ b/examples/028_apt_cache_one_day/database.yml @@ -0,0 +1,8 @@ +--- +- hosts: database + become: true + roles: + - role: mysql + db_user_name: "{{ db_user }}" + db_user_pass: "{{ db_pass }}" + db_user_host: '%' diff --git a/examples/028_apt_cache_one_day/group_vars/all b/examples/028_apt_cache_one_day/group_vars/all new file mode 100644 index 0000000..2fd732e --- /dev/null +++ b/examples/028_apt_cache_one_day/group_vars/all @@ -0,0 +1,12 @@ +--- +#DB from role mysql +db_name: maykadb +db_user: mayka_user +db_pass: mayka_pass +db_user_host: localhost + +#nginx loadbalancer configuration +sites: + myappmayka: + frontend: 80 + backend: 80 diff --git a/examples/028_apt_cache_one_day/loadbalancer.yml b/examples/028_apt_cache_one_day/loadbalancer.yml new file mode 100644 index 0000000..5d025e2 --- /dev/null +++ b/examples/028_apt_cache_one_day/loadbalancer.yml @@ -0,0 +1,6 @@ +--- +- hosts: loadbalancer + become: true + gather_facts: false + roles: + - nginx diff --git a/examples/028_apt_cache_one_day/playbooks/hostname.yml b/examples/028_apt_cache_one_day/playbooks/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/028_apt_cache_one_day/playbooks/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/028_apt_cache_one_day/playbooks/stack_restart.yml b/examples/028_apt_cache_one_day/playbooks/stack_restart.yml new file mode 100644 index 0000000..d89c326 --- /dev/null +++ b/examples/028_apt_cache_one_day/playbooks/stack_restart.yml @@ -0,0 +1,33 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + - wait_for: port=80 state=drained + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + - wait_for: port=80 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + - wait_for: host={{ ansible_eth0.ipv4.address }} port=3306 state=started + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + - wait_for: port=80 + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started + - wait_for: port=80 diff --git a/examples/028_apt_cache_one_day/playbooks/stack_status.yml b/examples/028_apt_cache_one_day/playbooks/stack_status.yml new file mode 100644 index 0000000..4dab982 --- /dev/null +++ b/examples/028_apt_cache_one_day/playbooks/stack_status.yml @@ -0,0 +1,71 @@ +--- +- hosts: loadbalancer + become: true + gather_facts: false + tasks: + - name: verify nginx service + command: service nginx status + + - name: verify nginx is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: webserver + become: true + gather_facts: false + tasks: + - name: verify apache2 service + command: service apache2 status + + - name: verify apache2 is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: database + become: true + tasks: + - name: verify mysql service + command: service mysql status + + - name: verify mysql is listening on 3306 + wait_for: port=3306 timeout=1 + +- hosts: control + gather_facts: false + tasks: + - name: verify end-to-end index response + uri: url=http://{{item}} return_content=yes + with_items: "{{ groups.loadbalancer }}" + register: lb_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny' not in item.content" + with_items: "{{lb_index.results}}" + + - name: verify end-to-end db response + uri: url=http://{{item}}/db return_content=yes + with_items: "{{ groups.loadbalancer }}" + register: lb_db + + - fail: msg="db failed to return content" + when: "'Database Connected from' not in item.content" + with_items: "{{lb_db.results}}" + +- hosts: loadbalancer + gather_facts: false + tasks: + - name: verify backend index response + uri: url=http://{{item}} return_content=yes + with_items: "{{ groups.webserver }}" + register: app_index + +# - fail: msg="index failed to return content" +# when: "'Hello, from sunny {{ item.content }}!' not in item.content" +# with_items: "{{app_index.results}}" + + - name: verify backend db response + uri: url=http://{{item}}/db return_content=yes + with_items: "{{ groups.webserver }}" + register: app_db + +# - fail: msg="db failed to return content" +# when: "'Database Connected from {{ item.item }}!' not in item.content" +# with_items: "{{app_db.results}}" diff --git a/examples/028_apt_cache_one_day/roles/apache2/README.md b/examples/028_apt_cache_one_day/roles/apache2/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/apache2/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/028_apt_cache_one_day/roles/apache2/defaults/main.yml b/examples/028_apt_cache_one_day/roles/apache2/defaults/main.yml new file mode 100644 index 0000000..0381169 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/apache2/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for apache2 diff --git a/examples/028_apt_cache_one_day/roles/apache2/handlers/main.yml b/examples/028_apt_cache_one_day/roles/apache2/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/apache2/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/028_apt_cache_one_day/roles/apache2/meta/main.yml b/examples/028_apt_cache_one_day/roles/apache2/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/apache2/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/028_apt_cache_one_day/roles/apache2/tasks/main.yml b/examples/028_apt_cache_one_day/roles/apache2/tasks/main.yml new file mode 100644 index 0000000..ba9a5bb --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/apache2/tasks/main.yml @@ -0,0 +1,20 @@ +--- +- name: update apt cache once day + apt: update_cache=yes cache_valid_time=86400 + +- name: install web components + apt: name={{item}} state=present + with_items: + - apache2 + - libapache2-mod-wsgi-py3 + +- name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + +- name: de-activate default apache site + file: path=/etc/apache2/sites-enabled/000-default.conf state=absent + notify: restart apache2 + +- name: ensure apache2 started + service: name=apache2 state=started enabled=yes diff --git a/examples/028_apt_cache_one_day/roles/apache2/vars/main.yml b/examples/028_apt_cache_one_day/roles/apache2/vars/main.yml new file mode 100644 index 0000000..5d23ceb --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/apache2/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for apache2 diff --git a/examples/028_apt_cache_one_day/roles/control/README.md b/examples/028_apt_cache_one_day/roles/control/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/control/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/028_apt_cache_one_day/roles/control/defaults/main.yml b/examples/028_apt_cache_one_day/roles/control/defaults/main.yml new file mode 100644 index 0000000..9fe52bd --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/control/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for control diff --git a/examples/028_apt_cache_one_day/roles/control/handlers/main.yml b/examples/028_apt_cache_one_day/roles/control/handlers/main.yml new file mode 100644 index 0000000..4136893 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/control/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for control diff --git a/examples/028_apt_cache_one_day/roles/control/meta/main.yml b/examples/028_apt_cache_one_day/roles/control/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/control/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/028_apt_cache_one_day/roles/control/tasks/main.yml b/examples/028_apt_cache_one_day/roles/control/tasks/main.yml new file mode 100644 index 0000000..fdd3144 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/control/tasks/main.yml @@ -0,0 +1,9 @@ +--- +- name: update apt cache once day + apt: update_cache=yes cache_valid_time=86400 + +- name: install tools + apt: name={{item}} state=present + with_items: + - curl + - python-httplib2 diff --git a/examples/028_apt_cache_one_day/roles/control/vars/main.yml b/examples/028_apt_cache_one_day/roles/control/vars/main.yml new file mode 100644 index 0000000..eadc8b6 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/control/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for control diff --git a/examples/028_apt_cache_one_day/roles/demo_app/README.md b/examples/028_apt_cache_one_day/roles/demo_app/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/demo_app/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/028_apt_cache_one_day/roles/demo_app/defaults/main.yml b/examples/028_apt_cache_one_day/roles/demo_app/defaults/main.yml new file mode 100644 index 0000000..914e957 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/demo_app/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for demo_app diff --git a/examples/028_apt_cache_one_day/roles/demo_app/files/demo/app/demo.py b/examples/028_apt_cache_one_day/roles/demo_app/files/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/demo_app/files/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/028_apt_cache_one_day/roles/demo_app/files/demo/app/demo.wsgi b/examples/028_apt_cache_one_day/roles/demo_app/files/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/demo_app/files/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/028_apt_cache_one_day/roles/demo_app/files/demo/app/requirements.txt b/examples/028_apt_cache_one_day/roles/demo_app/files/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/demo_app/files/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/028_apt_cache_one_day/roles/demo_app/files/demo/demo.conf b/examples/028_apt_cache_one_day/roles/demo_app/files/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/demo_app/files/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/028_apt_cache_one_day/roles/demo_app/handlers/main.yml b/examples/028_apt_cache_one_day/roles/demo_app/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/demo_app/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/028_apt_cache_one_day/roles/demo_app/meta/main.yml b/examples/028_apt_cache_one_day/roles/demo_app/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/demo_app/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/028_apt_cache_one_day/roles/demo_app/tasks/main.yml b/examples/028_apt_cache_one_day/roles/demo_app/tasks/main.yml new file mode 100644 index 0000000..c013724 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/demo_app/tasks/main.yml @@ -0,0 +1,30 @@ +--- +- name: update apt cache once day + apt: update_cache=yes cache_valid_time=86400 + +- name: install web components + apt: name={{item}} state=present + with_items: + - python-pip-whl + - python3-virtualenv + - python3-mysqldb + +- name: copy demo app source + copy: src=demo/app/ dest=/var/www/demo mode=0755 + notify: restart apache2 + +- name: copy demo.wsgi + template: src=demo.wsgi.j2 dest=/var/www/demo/demo.wsgi mode=0755 + notify: restart apache2 + +- name: copy apache virtual host config + copy: src=demo/demo.conf dest=/etc/apache2/sites-available mode=0755 + notify: restart apache2 + +- name: setup python virtualenv + pip: requirements=/var/www/demo/requirements.txt virtualenv=/var/www/demo/.venv + notify: restart apache2 + +- name: activate demo apache site + file: src=/etc/apache2/sites-available/demo.conf dest=/etc/apache2/sites-enabled/demo.conf state=link + notify: restart apache2 diff --git a/examples/028_apt_cache_one_day/roles/demo_app/templates/demo.wsgi.j2 b/examples/028_apt_cache_one_day/roles/demo_app/templates/demo.wsgi.j2 new file mode 100644 index 0000000..7d65a51 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/demo_app/templates/demo.wsgi.j2 @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://{{ db_user }}:{{ db_pass }}@{{ groups.database[0] }}/{{ db_name }}' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application diff --git a/examples/028_apt_cache_one_day/roles/demo_app/vars/main.yml b/examples/028_apt_cache_one_day/roles/demo_app/vars/main.yml new file mode 100644 index 0000000..52fb613 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/demo_app/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for demo_app diff --git a/examples/028_apt_cache_one_day/roles/mysql/README.md b/examples/028_apt_cache_one_day/roles/mysql/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/mysql/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/028_apt_cache_one_day/roles/mysql/defaults/main.yml b/examples/028_apt_cache_one_day/roles/mysql/defaults/main.yml new file mode 100644 index 0000000..eefca51 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/mysql/defaults/main.yml @@ -0,0 +1,5 @@ +--- +#db_name: myapp +#db_user_name: dbuser +#db_user_pass: dbpass +#db_user_host: localhost diff --git a/examples/028_apt_cache_one_day/roles/mysql/handlers/main.yml b/examples/028_apt_cache_one_day/roles/mysql/handlers/main.yml new file mode 100644 index 0000000..3755d8c --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/mysql/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart mysql + service: name=mysql state=restarted diff --git a/examples/028_apt_cache_one_day/roles/mysql/meta/main.yml b/examples/028_apt_cache_one_day/roles/mysql/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/mysql/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/028_apt_cache_one_day/roles/mysql/tasks/main.yml b/examples/028_apt_cache_one_day/roles/mysql/tasks/main.yml new file mode 100644 index 0000000..01080e4 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/mysql/tasks/main.yml @@ -0,0 +1,30 @@ +--- +- name: update apt cache once day + apt: update_cache=yes cache_valid_time=86400 + +- name: install tools + apt: name={{item}} state=present + with_items: + - python3-mysqldb + +- name: install mysql-server + apt: name=mysql-server state=present + +- name: chmod 777 /etc/mysql/my.cnf + command: chmod 777 /etc/mysql/my.cnf + notify: restart mysql + +- name: ensure mysql listening on all ports + lineinfile: dest=/etc/mysql/my.cnf regexp=^bind-address + line="bind-address = {{ ansible_eth0.ipv4.address }}" + notify: restart mysql + +- name: ensure mysql started + service: name=mysql state=started enabled=yes + +- name: create database + mysql_db: name={{ db_name }} state=present + +- name: create user + mysql_user: name={{ db_user_name }} password={{ db_user_pass }} priv={{ db_name }}.*:ALL + host='{{ db_user_host }}' state=present diff --git a/examples/028_apt_cache_one_day/roles/mysql/vars/main.yml b/examples/028_apt_cache_one_day/roles/mysql/vars/main.yml new file mode 100644 index 0000000..a79bfed --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/mysql/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for mysql diff --git a/examples/028_apt_cache_one_day/roles/nginx/README.md b/examples/028_apt_cache_one_day/roles/nginx/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/nginx/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/028_apt_cache_one_day/roles/nginx/defaults/main.yml b/examples/028_apt_cache_one_day/roles/nginx/defaults/main.yml new file mode 100644 index 0000000..5a53da8 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/nginx/defaults/main.yml @@ -0,0 +1,5 @@ +#--- +#sites: +# myapp: +# frontend: 80 +# backend: 80 diff --git a/examples/028_apt_cache_one_day/roles/nginx/handlers/main.yml b/examples/028_apt_cache_one_day/roles/nginx/handlers/main.yml new file mode 100644 index 0000000..92971d2 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/nginx/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart nginx + service: name=nginx state=restarted diff --git a/examples/028_apt_cache_one_day/roles/nginx/meta/main.yml b/examples/028_apt_cache_one_day/roles/nginx/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/nginx/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/028_apt_cache_one_day/roles/nginx/tasks/main.yml b/examples/028_apt_cache_one_day/roles/nginx/tasks/main.yml new file mode 100644 index 0000000..45b08dc --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/nginx/tasks/main.yml @@ -0,0 +1,38 @@ +--- +- name: update apt cache once day + apt: update_cache=yes cache_valid_time=86400 + +- name: install tools + apt: name={{item}} state=present + with_items: + - python-httplib2 + +- name: install nginx + apt: name=nginx state=present + +- name: configure nginx sites + template: src=nginx.conf.j2 dest=/etc/nginx/sites-available/{{ item.key }} mode=0644 + with_dict: "{{ sites }}" + notify: restart nginx + +- name: get active sites + shell: ls -l /etc/nginx/sites-enabled + register: result + +- name: de-activate default + file: path=/etc/nginx/sites-enabled/default state=absent + notify: restart nginx + +- name: de-activate sites + file: path=/etc/nginx/sites-enabled/{{ item }} state=absent + with_items: active.stdout_lines + when: item not in sites + notify: restart nginx + +- name: activate nginx sites + file: src=/etc/nginx/sites-available/{{ item.key }} dest=/etc/nginx/sites-enabled/{{ item.key }} state=link + with_dict: "{{ sites }}" + notify: restart nginx + +- name: ensure nginx started + service: name=nginx state=started enabled=yes diff --git a/examples/028_apt_cache_one_day/roles/nginx/templates/nginx.conf.j2 b/examples/028_apt_cache_one_day/roles/nginx/templates/nginx.conf.j2 new file mode 100644 index 0000000..092c8be --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/nginx/templates/nginx.conf.j2 @@ -0,0 +1,13 @@ +upstream {{ item.key }} { +{% for server in groups.webserver %} + server {{ server }}:{{ item.value.backend }}; +{% endfor %} +} + +server { + listen {{ item.value.frontend }}; + + location / { + proxy_pass http://{{ item.key }}; + } +} diff --git a/examples/028_apt_cache_one_day/roles/nginx/vars/main.yml b/examples/028_apt_cache_one_day/roles/nginx/vars/main.yml new file mode 100644 index 0000000..d45faf6 --- /dev/null +++ b/examples/028_apt_cache_one_day/roles/nginx/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for nginx diff --git a/examples/028_apt_cache_one_day/site.yml b/examples/028_apt_cache_one_day/site.yml new file mode 100644 index 0000000..7299e9e --- /dev/null +++ b/examples/028_apt_cache_one_day/site.yml @@ -0,0 +1,6 @@ +--- +- include: control.yml +- include: database.yml +- include: webserver.yml +- include: loadbalancer.yml +- include: playbooks/stack_status.yml diff --git a/examples/028_apt_cache_one_day/webserver.yml b/examples/028_apt_cache_one_day/webserver.yml new file mode 100644 index 0000000..98f1b45 --- /dev/null +++ b/examples/028_apt_cache_one_day/webserver.yml @@ -0,0 +1,7 @@ +--- +- hosts: webserver + become: true + gather_facts: false + roles: + - apache2 + - demo_app diff --git a/examples/029_tags/control.yml b/examples/029_tags/control.yml new file mode 100644 index 0000000..c959863 --- /dev/null +++ b/examples/029_tags/control.yml @@ -0,0 +1,6 @@ +--- +- hosts: control + become: true + gather_facts: false + roles: + - control diff --git a/examples/029_tags/database.yml b/examples/029_tags/database.yml new file mode 100644 index 0000000..6d7b7eb --- /dev/null +++ b/examples/029_tags/database.yml @@ -0,0 +1,8 @@ +--- +- hosts: database + become: true + roles: + - role: mysql + db_user_name: "{{ db_user }}" + db_user_pass: "{{ db_pass }}" + db_user_host: '%' diff --git a/examples/029_tags/group_vars/all b/examples/029_tags/group_vars/all new file mode 100644 index 0000000..2fd732e --- /dev/null +++ b/examples/029_tags/group_vars/all @@ -0,0 +1,12 @@ +--- +#DB from role mysql +db_name: maykadb +db_user: mayka_user +db_pass: mayka_pass +db_user_host: localhost + +#nginx loadbalancer configuration +sites: + myappmayka: + frontend: 80 + backend: 80 diff --git a/examples/029_tags/loadbalancer.yml b/examples/029_tags/loadbalancer.yml new file mode 100644 index 0000000..5d025e2 --- /dev/null +++ b/examples/029_tags/loadbalancer.yml @@ -0,0 +1,6 @@ +--- +- hosts: loadbalancer + become: true + gather_facts: false + roles: + - nginx diff --git a/examples/029_tags/playbooks/hostname.yml b/examples/029_tags/playbooks/hostname.yml new file mode 100644 index 0000000..a1a3ad6 --- /dev/null +++ b/examples/029_tags/playbooks/hostname.yml @@ -0,0 +1,5 @@ +--- + - hosts: all + tasks: + - name: get server hostname + command: hostname diff --git a/examples/029_tags/playbooks/stack_restart.yml b/examples/029_tags/playbooks/stack_restart.yml new file mode 100644 index 0000000..d89c326 --- /dev/null +++ b/examples/029_tags/playbooks/stack_restart.yml @@ -0,0 +1,33 @@ +--- +# Bring stack down +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=stopped + - wait_for: port=80 state=drained + +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=stopped + - wait_for: port=80 state=stopped + +# Restart mysql +- hosts: database + become: true + tasks: + - service: name=mysql state=restarted + - wait_for: host={{ ansible_eth0.ipv4.address }} port=3306 state=started + +# Bring stack up +- hosts: webserver + become: true + tasks: + - service: name=apache2 state=started + - wait_for: port=80 + +- hosts: loadbalancer + become: true + tasks: + - service: name=nginx state=started + - wait_for: port=80 diff --git a/examples/029_tags/playbooks/stack_status.yml b/examples/029_tags/playbooks/stack_status.yml new file mode 100644 index 0000000..4dab982 --- /dev/null +++ b/examples/029_tags/playbooks/stack_status.yml @@ -0,0 +1,71 @@ +--- +- hosts: loadbalancer + become: true + gather_facts: false + tasks: + - name: verify nginx service + command: service nginx status + + - name: verify nginx is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: webserver + become: true + gather_facts: false + tasks: + - name: verify apache2 service + command: service apache2 status + + - name: verify apache2 is listening on 80 + wait_for: port=80 timeout=1 + +- hosts: database + become: true + tasks: + - name: verify mysql service + command: service mysql status + + - name: verify mysql is listening on 3306 + wait_for: port=3306 timeout=1 + +- hosts: control + gather_facts: false + tasks: + - name: verify end-to-end index response + uri: url=http://{{item}} return_content=yes + with_items: "{{ groups.loadbalancer }}" + register: lb_index + + - fail: msg="index failed to return content" + when: "'Hello, from sunny' not in item.content" + with_items: "{{lb_index.results}}" + + - name: verify end-to-end db response + uri: url=http://{{item}}/db return_content=yes + with_items: "{{ groups.loadbalancer }}" + register: lb_db + + - fail: msg="db failed to return content" + when: "'Database Connected from' not in item.content" + with_items: "{{lb_db.results}}" + +- hosts: loadbalancer + gather_facts: false + tasks: + - name: verify backend index response + uri: url=http://{{item}} return_content=yes + with_items: "{{ groups.webserver }}" + register: app_index + +# - fail: msg="index failed to return content" +# when: "'Hello, from sunny {{ item.content }}!' not in item.content" +# with_items: "{{app_index.results}}" + + - name: verify backend db response + uri: url=http://{{item}}/db return_content=yes + with_items: "{{ groups.webserver }}" + register: app_db + +# - fail: msg="db failed to return content" +# when: "'Database Connected from {{ item.item }}!' not in item.content" +# with_items: "{{app_db.results}}" diff --git a/examples/029_tags/roles/apache2/README.md b/examples/029_tags/roles/apache2/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/029_tags/roles/apache2/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/029_tags/roles/apache2/defaults/main.yml b/examples/029_tags/roles/apache2/defaults/main.yml new file mode 100644 index 0000000..0381169 --- /dev/null +++ b/examples/029_tags/roles/apache2/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for apache2 diff --git a/examples/029_tags/roles/apache2/handlers/main.yml b/examples/029_tags/roles/apache2/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/029_tags/roles/apache2/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/029_tags/roles/apache2/meta/main.yml b/examples/029_tags/roles/apache2/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/029_tags/roles/apache2/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/029_tags/roles/apache2/tasks/main.yml b/examples/029_tags/roles/apache2/tasks/main.yml new file mode 100644 index 0000000..0d36b08 --- /dev/null +++ b/examples/029_tags/roles/apache2/tasks/main.yml @@ -0,0 +1,21 @@ +--- +- name: update apt cache once day + apt: update_cache=yes cache_valid_time=86400 + +- name: install web components + apt: name={{item}} state=present + with_items: + - apache2 + - libapache2-mod-wsgi-py3 + +- name: ensure mod_wsgi enabled + apache2_module: state=present name=wsgi + notify: restart apache2 + +- name: de-activate default apache site + file: path=/etc/apache2/sites-enabled/000-default.conf state=absent + tags: [ 'deploy' ] + notify: restart apache2 + +- name: ensure apache2 started + service: name=apache2 state=started enabled=yes diff --git a/examples/029_tags/roles/apache2/vars/main.yml b/examples/029_tags/roles/apache2/vars/main.yml new file mode 100644 index 0000000..5d23ceb --- /dev/null +++ b/examples/029_tags/roles/apache2/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for apache2 diff --git a/examples/029_tags/roles/control/README.md b/examples/029_tags/roles/control/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/029_tags/roles/control/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/029_tags/roles/control/defaults/main.yml b/examples/029_tags/roles/control/defaults/main.yml new file mode 100644 index 0000000..9fe52bd --- /dev/null +++ b/examples/029_tags/roles/control/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for control diff --git a/examples/029_tags/roles/control/handlers/main.yml b/examples/029_tags/roles/control/handlers/main.yml new file mode 100644 index 0000000..4136893 --- /dev/null +++ b/examples/029_tags/roles/control/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for control diff --git a/examples/029_tags/roles/control/meta/main.yml b/examples/029_tags/roles/control/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/029_tags/roles/control/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/029_tags/roles/control/tasks/main.yml b/examples/029_tags/roles/control/tasks/main.yml new file mode 100644 index 0000000..fdd3144 --- /dev/null +++ b/examples/029_tags/roles/control/tasks/main.yml @@ -0,0 +1,9 @@ +--- +- name: update apt cache once day + apt: update_cache=yes cache_valid_time=86400 + +- name: install tools + apt: name={{item}} state=present + with_items: + - curl + - python-httplib2 diff --git a/examples/029_tags/roles/control/vars/main.yml b/examples/029_tags/roles/control/vars/main.yml new file mode 100644 index 0000000..eadc8b6 --- /dev/null +++ b/examples/029_tags/roles/control/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for control diff --git a/examples/029_tags/roles/demo_app/README.md b/examples/029_tags/roles/demo_app/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/029_tags/roles/demo_app/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/029_tags/roles/demo_app/defaults/main.yml b/examples/029_tags/roles/demo_app/defaults/main.yml new file mode 100644 index 0000000..914e957 --- /dev/null +++ b/examples/029_tags/roles/demo_app/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for demo_app diff --git a/examples/029_tags/roles/demo_app/files/demo/app/demo.py b/examples/029_tags/roles/demo_app/files/demo/app/demo.py new file mode 100644 index 0000000..f093790 --- /dev/null +++ b/examples/029_tags/roles/demo_app/files/demo/app/demo.py @@ -0,0 +1,20 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +import os, socket + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URI'] +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +db = SQLAlchemy(app) +hostname = socket.gethostname() + +@app.route('/') +def index(): + return 'Hello, from sunny %s!\n' % hostname + +@app.route('/db') +def dbtest(): + return 'Database Connected from %s!\n' % hostname + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/examples/029_tags/roles/demo_app/files/demo/app/demo.wsgi b/examples/029_tags/roles/demo_app/files/demo/app/demo.wsgi new file mode 100644 index 0000000..0b81ee5 --- /dev/null +++ b/examples/029_tags/roles/demo_app/files/demo/app/demo.wsgi @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://demo:demo@db01/demo' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application \ No newline at end of file diff --git a/examples/029_tags/roles/demo_app/files/demo/app/requirements.txt b/examples/029_tags/roles/demo_app/files/demo/app/requirements.txt new file mode 100644 index 0000000..d51b4ef --- /dev/null +++ b/examples/029_tags/roles/demo_app/files/demo/app/requirements.txt @@ -0,0 +1,9 @@ +click==7.1.2 +Flask==1.1.4 +Flask-SQLAlchemy==2.5.1 +greenlet==1.1.2 +itsdangerous==1.1.0 +Jinja2==2.11.3 +MarkupSafe==2.0.1 +SQLAlchemy==1.4.32 +Werkzeug==1.0.1 \ No newline at end of file diff --git a/examples/029_tags/roles/demo_app/files/demo/demo.conf b/examples/029_tags/roles/demo_app/files/demo/demo.conf new file mode 100644 index 0000000..ac7b9e2 --- /dev/null +++ b/examples/029_tags/roles/demo_app/files/demo/demo.conf @@ -0,0 +1,11 @@ + + WSGIDaemonProcess demo threads=5 + WSGIScriptAlias / /var/www/demo/demo.wsgi + + + WSGIProcessGroup demo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + diff --git a/examples/029_tags/roles/demo_app/handlers/main.yml b/examples/029_tags/roles/demo_app/handlers/main.yml new file mode 100644 index 0000000..b50f192 --- /dev/null +++ b/examples/029_tags/roles/demo_app/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart apache2 + service: name=apache2 state=restarted diff --git a/examples/029_tags/roles/demo_app/meta/main.yml b/examples/029_tags/roles/demo_app/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/029_tags/roles/demo_app/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/029_tags/roles/demo_app/tasks/main.yml b/examples/029_tags/roles/demo_app/tasks/main.yml new file mode 100644 index 0000000..3267250 --- /dev/null +++ b/examples/029_tags/roles/demo_app/tasks/main.yml @@ -0,0 +1,35 @@ +--- +- name: update apt cache once day + apt: update_cache=yes cache_valid_time=86400 + +- name: install web components + apt: name={{item}} state=present + with_items: + - python-pip-whl + - python3-virtualenv + - python3-mysqldb + +- name: copy demo app source + copy: src=demo/app/ dest=/var/www/demo mode=0755 + tags: [ 'deploy' ] + notify: restart apache2 + +- name: copy demo.wsgi + template: src=demo.wsgi.j2 dest=/var/www/demo/demo.wsgi mode=0755 + tags: [ 'deploy' ] + notify: restart apache2 + +- name: copy apache virtual host config + copy: src=demo/demo.conf dest=/etc/apache2/sites-available mode=0755 + tags: [ 'deploy' ] + notify: restart apache2 + +- name: setup python virtualenv + pip: requirements=/var/www/demo/requirements.txt virtualenv=/var/www/demo/.venv + tags: [ 'deploy' ] + notify: restart apache2 + +- name: activate demo apache site + file: src=/etc/apache2/sites-available/demo.conf dest=/etc/apache2/sites-enabled/demo.conf state=link + tags: [ 'deploy' ] + notify: restart apache2 diff --git a/examples/029_tags/roles/demo_app/templates/demo.wsgi.j2 b/examples/029_tags/roles/demo_app/templates/demo.wsgi.j2 new file mode 100644 index 0000000..7d65a51 --- /dev/null +++ b/examples/029_tags/roles/demo_app/templates/demo.wsgi.j2 @@ -0,0 +1,10 @@ +activate_this = '/var/www/demo/.venv/bin/activate_this.py' +exec(open(activate_this).read(), {'__file__': activate_this}) + +import os +os.environ['DATABASE_URI'] = 'mysql://{{ db_user }}:{{ db_pass }}@{{ groups.database[0] }}/{{ db_name }}' + +import sys +sys.path.insert(0, '/var/www/demo') + +from demo import app as application diff --git a/examples/029_tags/roles/demo_app/vars/main.yml b/examples/029_tags/roles/demo_app/vars/main.yml new file mode 100644 index 0000000..52fb613 --- /dev/null +++ b/examples/029_tags/roles/demo_app/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for demo_app diff --git a/examples/029_tags/roles/mysql/README.md b/examples/029_tags/roles/mysql/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/029_tags/roles/mysql/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/029_tags/roles/mysql/defaults/main.yml b/examples/029_tags/roles/mysql/defaults/main.yml new file mode 100644 index 0000000..eefca51 --- /dev/null +++ b/examples/029_tags/roles/mysql/defaults/main.yml @@ -0,0 +1,5 @@ +--- +#db_name: myapp +#db_user_name: dbuser +#db_user_pass: dbpass +#db_user_host: localhost diff --git a/examples/029_tags/roles/mysql/handlers/main.yml b/examples/029_tags/roles/mysql/handlers/main.yml new file mode 100644 index 0000000..3755d8c --- /dev/null +++ b/examples/029_tags/roles/mysql/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart mysql + service: name=mysql state=restarted diff --git a/examples/029_tags/roles/mysql/meta/main.yml b/examples/029_tags/roles/mysql/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/029_tags/roles/mysql/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/029_tags/roles/mysql/tasks/main.yml b/examples/029_tags/roles/mysql/tasks/main.yml new file mode 100644 index 0000000..01080e4 --- /dev/null +++ b/examples/029_tags/roles/mysql/tasks/main.yml @@ -0,0 +1,30 @@ +--- +- name: update apt cache once day + apt: update_cache=yes cache_valid_time=86400 + +- name: install tools + apt: name={{item}} state=present + with_items: + - python3-mysqldb + +- name: install mysql-server + apt: name=mysql-server state=present + +- name: chmod 777 /etc/mysql/my.cnf + command: chmod 777 /etc/mysql/my.cnf + notify: restart mysql + +- name: ensure mysql listening on all ports + lineinfile: dest=/etc/mysql/my.cnf regexp=^bind-address + line="bind-address = {{ ansible_eth0.ipv4.address }}" + notify: restart mysql + +- name: ensure mysql started + service: name=mysql state=started enabled=yes + +- name: create database + mysql_db: name={{ db_name }} state=present + +- name: create user + mysql_user: name={{ db_user_name }} password={{ db_user_pass }} priv={{ db_name }}.*:ALL + host='{{ db_user_host }}' state=present diff --git a/examples/029_tags/roles/mysql/vars/main.yml b/examples/029_tags/roles/mysql/vars/main.yml new file mode 100644 index 0000000..a79bfed --- /dev/null +++ b/examples/029_tags/roles/mysql/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for mysql diff --git a/examples/029_tags/roles/nginx/README.md b/examples/029_tags/roles/nginx/README.md new file mode 100644 index 0000000..225dd44 --- /dev/null +++ b/examples/029_tags/roles/nginx/README.md @@ -0,0 +1,38 @@ +Role Name +========= + +A brief description of the role goes here. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. + +Dependencies +------------ + +A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: username.rolename, x: 42 } + +License +------- + +BSD + +Author Information +------------------ + +An optional section for the role authors to include contact information, or a website (HTML is not allowed). diff --git a/examples/029_tags/roles/nginx/defaults/main.yml b/examples/029_tags/roles/nginx/defaults/main.yml new file mode 100644 index 0000000..5a53da8 --- /dev/null +++ b/examples/029_tags/roles/nginx/defaults/main.yml @@ -0,0 +1,5 @@ +#--- +#sites: +# myapp: +# frontend: 80 +# backend: 80 diff --git a/examples/029_tags/roles/nginx/handlers/main.yml b/examples/029_tags/roles/nginx/handlers/main.yml new file mode 100644 index 0000000..92971d2 --- /dev/null +++ b/examples/029_tags/roles/nginx/handlers/main.yml @@ -0,0 +1,3 @@ +--- +- name: restart nginx + service: name=nginx state=restarted diff --git a/examples/029_tags/roles/nginx/meta/main.yml b/examples/029_tags/roles/nginx/meta/main.yml new file mode 100644 index 0000000..62c7d35 --- /dev/null +++ b/examples/029_tags/roles/nginx/meta/main.yml @@ -0,0 +1,139 @@ +--- +galaxy_info: + author: your name + description: + company: your company (optional) + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + # Some suggested licenses: + # - BSD (default) + # - MIT + # - GPLv2 + # - GPLv3 + # - Apache + # - CC-BY + license: license (GPLv2, CC-BY, etc) + min_ansible_version: 1.2 + # + # Below are all platforms currently available. Just uncomment + # the ones that apply to your role. If you don't see your + # platform on this list, let us know and we'll get it added! + # + #platforms: + #- name: EL + # versions: + # - all + # - 5 + # - 6 + # - 7 + #- name: GenericUNIX + # versions: + # - all + # - any + #- name: Fedora + # versions: + # - all + # - 16 + # - 17 + # - 18 + # - 19 + # - 20 + # - 21 + # - 22 + #- name: Windows + # versions: + # - all + # - 2012R2 + #- name: SmartOS + # versions: + # - all + # - any + #- name: opensuse + # versions: + # - all + # - 12.1 + # - 12.2 + # - 12.3 + # - 13.1 + # - 13.2 + #- name: Amazon + # versions: + # - all + # - 2013.03 + # - 2013.09 + #- name: GenericBSD + # versions: + # - all + # - any + #- name: FreeBSD + # versions: + # - all + # - 8.0 + # - 8.1 + # - 8.2 + # - 8.3 + # - 8.4 + # - 9.0 + # - 9.1 + # - 9.1 + # - 9.2 + #- name: Ubuntu + # versions: + # - all + # - lucid + # - maverick + # - natty + # - oneiric + # - precise + # - quantal + # - raring + # - saucy + # - trusty + # - utopic + # - vivid + #- name: SLES + # versions: + # - all + # - 10SP3 + # - 10SP4 + # - 11 + # - 11SP1 + # - 11SP2 + # - 11SP3 + #- name: GenericLinux + # versions: + # - all + # - any + #- name: Debian + # versions: + # - all + # - etch + # - jessie + # - lenny + # - squeeze + # - wheezy + # + # Below are all categories currently available. Just as with + # the platforms above, uncomment those that apply to your role. + # + #categories: + #- cloud + #- cloud:ec2 + #- cloud:gce + #- cloud:rax + #- clustering + #- database + #- database:nosql + #- database:sql + #- development + #- monitoring + #- networking + #- packaging + #- system + #- web +dependencies: [] + # List your role dependencies here, one per line. + # Be sure to remove the '[]' above if you add dependencies + # to this list. + diff --git a/examples/029_tags/roles/nginx/tasks/main.yml b/examples/029_tags/roles/nginx/tasks/main.yml new file mode 100644 index 0000000..45b08dc --- /dev/null +++ b/examples/029_tags/roles/nginx/tasks/main.yml @@ -0,0 +1,38 @@ +--- +- name: update apt cache once day + apt: update_cache=yes cache_valid_time=86400 + +- name: install tools + apt: name={{item}} state=present + with_items: + - python-httplib2 + +- name: install nginx + apt: name=nginx state=present + +- name: configure nginx sites + template: src=nginx.conf.j2 dest=/etc/nginx/sites-available/{{ item.key }} mode=0644 + with_dict: "{{ sites }}" + notify: restart nginx + +- name: get active sites + shell: ls -l /etc/nginx/sites-enabled + register: result + +- name: de-activate default + file: path=/etc/nginx/sites-enabled/default state=absent + notify: restart nginx + +- name: de-activate sites + file: path=/etc/nginx/sites-enabled/{{ item }} state=absent + with_items: active.stdout_lines + when: item not in sites + notify: restart nginx + +- name: activate nginx sites + file: src=/etc/nginx/sites-available/{{ item.key }} dest=/etc/nginx/sites-enabled/{{ item.key }} state=link + with_dict: "{{ sites }}" + notify: restart nginx + +- name: ensure nginx started + service: name=nginx state=started enabled=yes diff --git a/examples/029_tags/roles/nginx/templates/nginx.conf.j2 b/examples/029_tags/roles/nginx/templates/nginx.conf.j2 new file mode 100644 index 0000000..092c8be --- /dev/null +++ b/examples/029_tags/roles/nginx/templates/nginx.conf.j2 @@ -0,0 +1,13 @@ +upstream {{ item.key }} { +{% for server in groups.webserver %} + server {{ server }}:{{ item.value.backend }}; +{% endfor %} +} + +server { + listen {{ item.value.frontend }}; + + location / { + proxy_pass http://{{ item.key }}; + } +} diff --git a/examples/029_tags/roles/nginx/vars/main.yml b/examples/029_tags/roles/nginx/vars/main.yml new file mode 100644 index 0000000..d45faf6 --- /dev/null +++ b/examples/029_tags/roles/nginx/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for nginx diff --git a/examples/029_tags/site.yml b/examples/029_tags/site.yml new file mode 100644 index 0000000..7299e9e --- /dev/null +++ b/examples/029_tags/site.yml @@ -0,0 +1,6 @@ +--- +- include: control.yml +- include: database.yml +- include: webserver.yml +- include: loadbalancer.yml +- include: playbooks/stack_status.yml diff --git a/examples/029_tags/webserver.yml b/examples/029_tags/webserver.yml new file mode 100644 index 0000000..98f1b45 --- /dev/null +++ b/examples/029_tags/webserver.yml @@ -0,0 +1,7 @@ +--- +- hosts: webserver + become: true + gather_facts: false + roles: + - apache2 + - demo_app diff --git a/examples/030_windows/README.md b/examples/030_windows/README.md new file mode 100644 index 0000000..acb1021 --- /dev/null +++ b/examples/030_windows/README.md @@ -0,0 +1,71 @@ +# Inventario máquina Windows + +--- + +> **Notas previas:** + +> Se debe tener la máquina con la red en privado y no en público, se debe cambiar. + +> Este ejemplo usa autenticación básica y conexiones no cifradas, que **no es seguro para entornos de producción**. Para producción, debes usar HTTPS y autenticación cifrada. + +--- + +# 1. Habilitar WinRM en la máquina Windows + +Puedes ejecutar este script en **PowerShell** como administrador en la máquina Windows: + +````markdown +# Habilita WinRM y configura la autenticación básica (sólo para pruebas/lab) +winrm quickconfig -force +winrm set winrm/config/service '@{AllowUnencrypted="true"}' +winrm set winrm/config/service/auth '@{Basic="true"}' + +# Permite conexiones desde cualquier IP (ajusta según tus necesidades) +Set-Item -Path WSMan:\localhost\Service\AllowUnencrypted -Value $true +Set-Item -Path WSMan:\localhost\Service\Auth\Basic -Value $true + +# Abre el puerto 5985 en el firewall (HTTP) +netsh advfirewall firewall add rule name="WinRM HTTP" dir=in action=allow protocol=TCP localport=5985 + +# Crea regla del Firewall para el puerto 5985 (HTTP) +New-NetFirewallRule -Name "WinRM HTTP" -DisplayName "WinRM HTTP" -Enabled True -Direction Inbound -Protocol TCP -Localport 5985 -Action Allow +```` +--- + +# 2. Crear un usuario administrador o usar uno existente + +Asegúrate de tener un usuario con privilegios de administrador en la máquina Windows. +Recuerda la contraseña, la necesitarás para la conexión. + +--- + +# 3. Ejemplo de inventario Ansible para Windows + +Tu archivo `hosts` (inventario) podría verse así: + +````markdown +[windows] +mi_windows_server ansible_host=192.168.1.100 + +[windows:vars] +ansible_user=Administrador +ansible_password=TuContraseña +ansible_port=5985 +ansible_connection=winrm +ansible_winrm_server_cert_validation=ignore +```` + +--- + +# 4. Ejemplo de playbook Ansible para Windows + +Aquí tienes un playbook sencillo para probar la conexión: + +````markdown +--- +- name: Prueba de conexión a Windows + hosts: windows + tasks: + - name: Hacer ping a la máquina Windows + ansible.windows.win_ping: +```` \ No newline at end of file diff --git a/examples/030_windows/all-hosts b/examples/030_windows/all-hosts new file mode 100644 index 0000000..bae74b1 --- /dev/null +++ b/examples/030_windows/all-hosts @@ -0,0 +1,9 @@ +[windows] +win101 ansible_host=192.168.1.175 + +[windows:vars] +ansible_user=vboxuser +ansible_password=changeme +ansible_port=5985 +ansible_connection=winrm +ansible_winrm_server_cert_validation=ignore \ No newline at end of file diff --git a/examples/030_windows/windows.yml b/examples/030_windows/windows.yml new file mode 100644 index 0000000..036af2e --- /dev/null +++ b/examples/030_windows/windows.yml @@ -0,0 +1,41 @@ +- name: Ping a Máquina Windows + hosts: windows + tasks: + - name: Ping the Windows machine + win_ping: + register: ping_result + + - name: Display the ping result + debug: + var: ping_result + + - name: Create folder C:\Temp if it does not exist + win_file: + path: C:\Temp + state: directory + + - name: Download Google Chrome installer + win_get_url: + url: https://dl.google.com/chrome/install/375.126/chrome_installer.exe + dest: C:\Temp\chrome_installer.exe + + - name: Install Google Chrome + win_package: + path: C:\Temp\chrome_installer.exe + arguments: /silent /install + state: present + + - name: Ensure Google Chrome is installed + win_shell: | + $chromePath = "C:\Program Files\Google\Chrome\Application\chrome.exe" + if (Test-Path $chromePath) { + Write-Output "Google Chrome is installed." + } else { + Write-Output "Google Chrome is not installed." + exit 1 + } + register: chrome_check + + - name: Display the Chrome Check result + debug: + var: chrome_check \ No newline at end of file diff --git a/examples/031_aws/README.md b/examples/031_aws/README.md new file mode 100644 index 0000000..6952d1b --- /dev/null +++ b/examples/031_aws/README.md @@ -0,0 +1,33 @@ +# Ejemplo Inventario dinámico AWS + +## 1. Instalación de los collections de AWS + +````markdown +ansible-galaxy collection install amazon.cloud +ansible-galaxy collection install amazon.aws +```` + +## 2. Instalación del cliente AWS en máquina agente de control ansible + +````markdown +curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" +unzip awscliv2.zip +sudo apt install unzip +unzip awscliv2.zip +sudo ./aws/install +aws --version +aws configure #Se necesita un usuario con acceso +```` + +Comprobamos que todo funciona del lado del AWS Cli + +````markdown +aws sts get-caller-identity +```` + +## 3. Creación de llave para EC2 + +````markdown +aws ec2 create-key-pair --key-name mi-clave-ec2 --query "KeyMaterial" --output text > /home/vagrant/.ssh/mi-clave-ec2.pem +chmod 400 /home/vagrant/.ssh/mi-clave-ec2.pem +```` \ No newline at end of file diff --git a/examples/031_aws/aws-example.yml b/examples/031_aws/aws-example.yml new file mode 100644 index 0000000..15adedf --- /dev/null +++ b/examples/031_aws/aws-example.yml @@ -0,0 +1,53 @@ +- name: Levantar instancias EC2 y configurar SSH + hosts: localhost + gather_facts: no + vars: + key_name: mi-clave-ec2.pem + region: eu-central-1 + instance_type: t2.micro + image: ami-02b7d5b1e55a7b5f1 # Amazon Linux 2023 AMI 2023.7.20250512.0 x86_64 HVM kernel-6.1 + tasks: + - name: Create instances EC2 with SSH key + amazon.aws.ec2_instance: + name: "{{ item }}" + key_name: "{{ key_name }}" + region: "{{ region }}" + instance_type: "{{ instance_type }}" + image_id: "{{ image }}" + vpc_subnet_id: subnet-0426901b07d63d0f4 + loop: + - instancia-curso-ansible-1 + - instancia-curso-ansible-2 + + - name: Show public instance_types + amazon.aws.ec2_instance_info: + region: "{{ region }}" + register: ec2_info + + - name: Show public IPs + debug: + msg: "Public IP: {{ item.public_ip_address }}" + loop: "{{ ec2_info.instances }}" + + - name: Add instances to inventory + add_host: + name: "{{ item.public_ip_address }}" + ansible_user: ec2-user + ansible_ssh_private_key_file: "{{ key_name }}" + loop: "{{ ec2_info.instances }}" + + - name: Save EC2 hosts to file + copy: + content: | + [ec2_instances] + {% for instance in ec2_info.instances %} + {{ instance.public_dns_name }} {{ instance.public_ip_address }} + {% endfor %} + dest: ./ec2_hosts.ini + + - name: Delete EC2 instances + amazon.aws.ec2_instance: + state: absent + region: "{{ region }}" + instance_ids: "{{ ec2_info.instances | map(attribute='id') | list }}" + when: ec2_info.instances | length > 0 \ No newline at end of file diff --git a/examples/032_azure/README.md b/examples/032_azure/README.md new file mode 100644 index 0000000..c9910b3 --- /dev/null +++ b/examples/032_azure/README.md @@ -0,0 +1,3 @@ +# Ejemplo Azure + + diff --git a/examples/032_azure/test_ansible_azure.yml b/examples/032_azure/test_ansible_azure.yml new file mode 100644 index 0000000..b03947b --- /dev/null +++ b/examples/032_azure/test_ansible_azure.yml @@ -0,0 +1,60 @@ +- name: Test Azure Connection + hosts: localhost + connection: local + vars: + username: adminuser + password: "P@ssw0rd123!" + tasks: + - name: Crear un grupo de recursos + azure_rm_resourcegroup: + name: TestCursoAnsibleGroup + location: westeurope + register: rg + + - name: Crear un conjunto de disponibilidad + azure_rm_availabilityset: + resource_group: TestCursoAnsibleGroup + name: miConjuntoDisponibilidad + location: westeurope + when: rg is succeeded + + - name: Crear una red virtual + azure_rm_virtualnetwork: + resource_group: TestCursoAnsibleGroup + name: miRedVirtual + address_prefixes: "10.0.0.0/16" + location: westeurope + when: rg is succeeded + + - name: Crear una subred + azure_rm_subnet: + resource_group: TestCursoAnsibleGroup + name: miSubRed + address_prefixes: "10.0.1.0/24" + virtual_network: miRedVirtual + when: rg is succeeded + + - name: Crear una interfaz de red + azure_rm_networkinterface: + resource_group: TestCursoAnsibleGroup + name: miInterfazDeRed + location: westeurope + virtual_network: miRedVirtual + subnet_name: miSubRed + when: rg is succeeded + + - name: Crear VM con imagen de Debian 12 + azure_rm_virtualmachine: + resource_group: TestCursoAnsibleGroup + name: miMaquinaVirtual + admin_username: "{{ username }}" + admin_password: "{{ password }}" + vm_size: Standard_B2als_v2 + network_interfaces: miInterfazDeRed + availability_set: miConjuntoDisponibilidad + location: westeurope + image: + offer: Debian-12 + publisher: Debian + sku: 12 + version: latest \ No newline at end of file diff --git a/examples/extra_vagrant_files/Vagrantfile1804 b/examples/extra_vagrant_files/Vagrantfile1804 new file mode 100644 index 0000000..bf50e44 --- /dev/null +++ b/examples/extra_vagrant_files/Vagrantfile1804 @@ -0,0 +1,28 @@ +Vagrant.configure(2) do |config| + config.vm.define "ansible" do |ansible| + ansible.vm.box = "bento/ubuntu-18.04" + ansible.vm.network "private_network", ip: "192.168.0.254" + ansible.vm.hostname = "ansible" + ansible.vm.provision :shell, :path => "ansible.sh" + end + config.vm.define "alfa" do |alfa| + alfa.vm.box = "bento/ubuntu-18.04" + alfa.vm.network "private_network", ip: "192.168.0.2" + alfa.vm.hostname = "alfa" + alfa.vm.provision :shell, :path => "ansible.sh" + alfa.vm.network "forwarded_port", guest: 3306, host: 3306 + end + config.vm.define "bravo" do |bravo| + bravo.vm.box = "bento/ubuntu-18.04" + bravo.vm.network "private_network", ip: "192.168.0.3" + bravo.vm.hostname = "bravo" + bravo.vm.provision :shell, :path => "ansible.sh" + end + config.vm.define "charlie" do |charlie| + charlie.vm.box = "bento/ubuntu-18.04" + charlie.vm.network "private_network", ip: "192.168.0.4" + charlie.vm.hostname = "charlie" + charlie.vm.provision :shell, :path => "ansible.sh" + charlie.vm.network "forwarded_port", guest: 80, host: 80 + end +end \ No newline at end of file diff --git a/examples/extra_vagrant_files/Vagrantfile2004 b/examples/extra_vagrant_files/Vagrantfile2004 new file mode 100644 index 0000000..c40a200 --- /dev/null +++ b/examples/extra_vagrant_files/Vagrantfile2004 @@ -0,0 +1,28 @@ +Vagrant.configure(2) do |config| + config.vm.define "ansible" do |ansible| + ansible.vm.box = "bento/ubuntu-20.04" + ansible.vm.network "private_network", ip: "192.168.0.254" + ansible.vm.hostname = "ansible" + ansible.vm.provision :shell, :path => "ansible.sh" + end + config.vm.define "alfa" do |alfa| + alfa.vm.box = "bento/ubuntu-20.04" + alfa.vm.network "private_network", ip: "192.168.0.2" + alfa.vm.hostname = "alfa" + alfa.vm.provision :shell, :path => "ansible.sh" + alfa.vm.network "forwarded_port", guest: 3306, host: 3306 + end + config.vm.define "bravo" do |bravo| + bravo.vm.box = "bento/ubuntu-20.04" + bravo.vm.network "private_network", ip: "192.168.0.3" + bravo.vm.hostname = "bravo" + bravo.vm.provision :shell, :path => "ansible.sh" + end + config.vm.define "charlie" do |charlie| + charlie.vm.box = "bento/ubuntu-20.04" + charlie.vm.network "private_network", ip: "192.168.0.4" + charlie.vm.hostname = "charlie" + charlie.vm.provision :shell, :path => "ansible.sh" + charlie.vm.network "forwarded_port", guest: 80, host: 80 + end + end \ No newline at end of file diff --git a/examples/extra_vagrant_files/Vagrantfile2104 b/examples/extra_vagrant_files/Vagrantfile2104 new file mode 100644 index 0000000..ae64d87 --- /dev/null +++ b/examples/extra_vagrant_files/Vagrantfile2104 @@ -0,0 +1,28 @@ +Vagrant.configure(2) do |config| + config.vm.define "ansible" do |ansible| + ansible.vm.box = "ubuntu/hirsute64" + ansible.vm.network "private_network", ip: "192.168.0.254" + ansible.vm.hostname = "ansible" + ansible.vm.provision :shell, :path => "ansible.sh" + end + config.vm.define "alfa" do |alfa| + alfa.vm.box = "ubuntu/hirsute64" + alfa.vm.network "private_network", ip: "192.168.0.2" + alfa.vm.hostname = "alfa" + alfa.vm.provision :shell, :path => "ansible.sh" + alfa.vm.network "forwarded_port", guest: 3306, host: 3306 + end + config.vm.define "bravo" do |bravo| + bravo.vm.box = "ubuntu/hirsute64" + bravo.vm.network "private_network", ip: "192.168.0.3" + bravo.vm.hostname = "bravo" + bravo.vm.provision :shell, :path => "ansible.sh" + end + config.vm.define "charlie" do |charlie| + charlie.vm.box = "ubuntu/hirsute64" + charlie.vm.network "private_network", ip: "192.168.0.4" + charlie.vm.hostname = "charlie" + charlie.vm.provision :shell, :path => "ansible.sh" + charlie.vm.network "forwarded_port", guest: 80, host: 80 + end + end \ No newline at end of file diff --git a/examples/extra_vagrant_files/VagrantfileDebian b/examples/extra_vagrant_files/VagrantfileDebian new file mode 100644 index 0000000..3f66f75 --- /dev/null +++ b/examples/extra_vagrant_files/VagrantfileDebian @@ -0,0 +1,28 @@ +Vagrant.configure(2) do |config| + config.vm.define "ansible" do |ansible| + ansible.vm.box = "debian/bullseye64" + ansible.vm.network "private_network", ip: "192.168.0.254" + ansible.vm.hostname = "ansible" + ansible.vm.provision :shell, :path => "ansible.sh" + end + config.vm.define "alfa" do |alfa| + alfa.vm.box = "debian/bullseye64" + alfa.vm.network "private_network", ip: "192.168.0.2" + alfa.vm.hostname = "alfa" + alfa.vm.provision :shell, :path => "ansible.sh" + alfa.vm.network "forwarded_port", guest: 3306, host: 3306 + end + config.vm.define "bravo" do |bravo| + bravo.vm.box = "debian/bullseye64" + bravo.vm.network "private_network", ip: "192.168.0.3" + bravo.vm.hostname = "bravo" + bravo.vm.provision :shell, :path => "ansible.sh" + end + config.vm.define "charlie" do |charlie| + charlie.vm.box = "debian/bullseye64" + charlie.vm.network "private_network", ip: "192.168.0.4" + charlie.vm.hostname = "charlie" + charlie.vm.provision :shell, :path => "ansible.sh" + charlie.vm.network "forwarded_port", guest: 80, host: 80 + end + end \ No newline at end of file diff --git a/examples/extra_vagrant_files/essential_box/Vagrantfile b/examples/extra_vagrant_files/essential_box/Vagrantfile new file mode 100755 index 0000000..20409ae --- /dev/null +++ b/examples/extra_vagrant_files/essential_box/Vagrantfile @@ -0,0 +1,11 @@ +Vagrant.configure(2) do |config| + config.vm.box = "bento/ubuntu-18.04" + config.vm.network "private_network", ip: "192.168.33.10" + config.vm.hostname = "client.vagrant.local" + config.vm.provision :shell, :path => "install.sh" + config.vm.provider "virtualbox" do |v| + v.memory = 512 + v.cpus = 1 + v.name = "webserver" + end +end diff --git a/examples/extra_vagrant_files/essential_box/install.sh b/examples/extra_vagrant_files/essential_box/install.sh new file mode 100644 index 0000000..f776fdb --- /dev/null +++ b/examples/extra_vagrant_files/essential_box/install.sh @@ -0,0 +1,3 @@ +set -eux +apt-get update +apt-get install -y --no-install-recommends ansible \ No newline at end of file diff --git a/examples/extra_vagrant_files/multi_agent_setup/VagrantFile b/examples/extra_vagrant_files/multi_agent_setup/VagrantFile new file mode 100644 index 0000000..703a157 --- /dev/null +++ b/examples/extra_vagrant_files/multi_agent_setup/VagrantFile @@ -0,0 +1,39 @@ +Vagrant.configure(2) do |config| + config.vm.define "webserver01" do |webserver01| + webserver01.vm.box = "bento/ubuntu-18.04" + webserver01.vm.network "private_network", ip: "192.168.0.6" + webserver01.vm.hostname = "webserver01" + end + config.vm.define "webserver02" do |webserver02| + webserver02.vm.box = "bento/ubuntu-18.04" + webserver02.vm.network "private_network", ip: "192.168.0.9" + webserver02.vm.hostname = "webserver02" + end + config.vm.define "database01" do |database01| + database01.vm.box = "bento/ubuntu-18.04" + database01.vm.network "private_network", ip: "192.168.0.5" + database01.vm.hostname = "database01" + end + config.vm.define "database02" do |database02| + database02.vm.box = "bento/ubuntu-18.04" + database02.vm.network "private_network", ip: "192.168.0.8" + database02.vm.hostname = "database02" + end + config.vm.define "loadbalancer01" do |loadbalancer01| + loadbalancer01.vm.box = "bento/ubuntu-18.04" + loadbalancer01.vm.network "private_network", ip: "192.168.0.4" + loadbalancer01.vm.hostname = "loadbalancer01" + end + config.vm.define "loadbalancer02" do |loadbalancer02| + loadbalancer02.vm.box = "bento/ubuntu-18.04" + loadbalancer02.vm.network "private_network", ip: "192.168.0.7" + loadbalancer02.vm.hostname = "loadbalancer02" + end + + config.vm.define "ansible" do |ansible| + ansible.vm.box = "bento/ubuntu-18.04" + ansible.vm.network "private_network", ip: "192.168.0.254" + ansible.vm.hostname = "ansible" + ansible.vm.provision :shell, :path => "install.sh" + end +end diff --git a/examples/extra_vagrant_files/multi_agent_setup/install.sh b/examples/extra_vagrant_files/multi_agent_setup/install.sh new file mode 100644 index 0000000..f776fdb --- /dev/null +++ b/examples/extra_vagrant_files/multi_agent_setup/install.sh @@ -0,0 +1,3 @@ +set -eux +apt-get update +apt-get install -y --no-install-recommends ansible \ No newline at end of file diff --git a/misc/all-hosts b/misc/all-hosts new file mode 100644 index 0000000..321815f --- /dev/null +++ b/misc/all-hosts @@ -0,0 +1,11 @@ +[control] +192.168.11.10 ansible_connection=local + +[database] +192.168.11.20 + +[loadbalancer] +192.168.11.30 + +[webserver] +192.168.11.40 \ No newline at end of file diff --git a/misc/arquitectura-ansible.pdf b/misc/arquitectura-ansible.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1313e10c8d5f55be11c827db61c643f813c40f2b GIT binary patch literal 863701 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Ðc}U}nNx=}xM_Ma;y<Gm)LjTEQN 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 z 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
  • @mxV7ia zD`w|y9zOPY0017JYMfM`oyA>*XD-Y8ka{-mTQCiWr(j|RKxZ@?Y z)Rewn_^OU=QsSiw^10(d&|swh{;J!-17+@KOn`ih074!JtjG_Awg}xg1H#Im;c`(x z5OM>($D!z7yXy9{F57U*;<3{P3=!Q?fAaj% zlNXQu-z#qW+8s0Z-7CMWXXH2Cj+ZHJVVEX?n)b3&QfMpfwP|Ao52r5-OgN(7mqAVMd%~^?x4Xs}$|z@nvcTGa z2h(ZTUV_>pqz36xW_{FH1%xv63b6I1CQyaV##WjmM5*05IB)ZCqvKd1@wl*?o&AZg z&fr1N6@LblCGJ6tq9D{x4T>hSjv#(DWEEyYFBjCF%GxWyv%|V+PocBd9lkj?kxM51 zb+z_w9M+fx$aYzvTjOM#rn)GSd>rTF46Rry_YRwsLv(L0qTCg{((r0>IF?Jq#FH+t zwTs^(^t%W%N@O(1`bJhW10si`K7-%UTTu*`xFJx%5xfF(9KI}$A}W4u9DC7kTe0om ze(=^)m#znk#^LQjYiRVaexbu@d^wQcv&yqeb6-&@LM+y1;6=;U9`r|v(}!T3P2!uEiFy`rvakv!&m!APaRb|G$N-qqD=yJk^I~ucw(Y=6 z3WFlR{soK2o_y)L(=S_p>1Xe{ZEENJ_wK`?Xs6M_DF^ar@KSp<%u{?~3)*esvTNDZ zn6K{u%SE-B+_gWdMkBOV_8>cimm2h+3Aot5cMl#+cj(~W8@KHGt1nN#`Rd6xuAHzt zR_wiD!h+`k!UdEZ!3@W0&~~H>uLii1V--0gp4qU{B49N9gCzBXRpIloaaB9=DZ*@yXfMsAcF#KyICuQ{4rzsuiM zS-J*yFX91u6MyvCtxpuf4C{S_J@7LhSpU+?H=MP+n(5tfm^IC}_*|s2gyL}J*T#-n z2OkQ6cmxSDfb^#LB@UF-`wh`a(wfI>W$)vEN3}-`7jN- zLUwVsjNl%>BInp`#`Cf7J-F|-$=z3cZTq>`O#Y{pa@4tk6oV!~7#!r&zepBM{iR;? zfm&jpUhQQ-Izv$~G#hlOdaMq4S+R;-BaiQpZF6V-jFywJQiL)k7N-1sxm@)Ccds#@ zT1j3=z;f{TT8nFB5u7@Aii-z|6; zkeC6-aK$7a7@m`@c!HRL{I0xF(t8ml~(_=~&kYNjD?V&dgq4do>O15s~<*?6y z%+tNp%;XZM!{@U>F+(eY)K&4DO6`Ntm@t#91~k80i)bPm>os=?6>&`FWr-8%L4&Tq zZmRzl;abHy;)4pk2qtiWQU@gmQiHX)5kn2?P|2l~ikHVR2CmUUQ@N-Tr13r1$piO( z4MpG27{j8xD~m*i^(H5 zc8Dcknh*`l`Yh*_$iIf9waGsP#INIMbs*0duif?pV9T(|N23Q`e)%{kbj3Cm7G(Hg z?CJ2+!Rcc=4^$h#1TGd)kRXf}m;j|1*uYLoAMj!CLCWl?0N;%BJ1d1CGUMp%6J<=p zUazc#%xK*_8OLn~G$aR{w{-l4OXN7m^A?Pr`-xjWfAiFVgE-EyAHPx!Myk8PLN$+( zyE;v+x$H6e(rFI+-uQGhq2cGoqH|1@@q`d*AfAVP2*1aDXy4S%J)c^?{SU620&{-b zs>yQ5*%2n-#o&klrKJwhq4Y(;E)|H1L0sx`5I7cGSIjJ6_dS9aAdOJPMQv=MDP|F~ zp|Vv1fw7i(iNG{0!!GdGWP7-|+e2gGL_>tbC$kTr&I2 zzuxhZzrIa>)cYo2wLjw`uu;IxUcjORcgE-hrl4%lFIb0xvpj_)hRM(_X3r)K`jwMEHwfId1XC{>X(JJcNUpr|D~kbQgK-32<{$z zYjLsxBWJ<9TC?a1u}mKU&5GcOMK@|QQ)#6?Wzi^ptrB+;Vhh?Jq99L=7zM`!b^=cV zn#{Kbkc5^wR7V!CfHDU+voWR0j10jJMZfdvZU62go6lG-2P*IwSZt(sySEHZmd2-s z4q=~kcj~OP44C+!QH4JL`BrQ%`2B;O<`krr&WVnK8Jfd((JLCx9w;_V5nU|QYWeBL zKlr;{!@CHdC~$p*^}ckufl?l~|0{*$Kf|h~9;+1i`nvw~hIs1rvf~XaaAr!McJC+G*Ub=J~$D!po z$I|itvigo2w`{-fkQ|D}#;j0i-Lo|!3eE`c#>tpRNxFS*&Qg+c_ z3aFslO68eCX^U6`npt&Xq^VJT^=YU^P$NR-w-LX9s%g@@R+QjZi(F}m>3fO5G;%Xl z7Oxc9WM7g>*noFvB=QW9`OiLZ?;}Ksq5Biw10c^o``#O0v0zN@DD;Q9$%ZH4#nCS~ zh60_Tlm4YlV7A~DAy=Tg-kn20!!ZkZOz(kpVjSGY9TU7;WYdeRK&{HOMgWR68q83X zU3xW)MoaMutmeXGzG56j<|ul_b6!#~y++f1Bh*JXN|E-Jx|Al=`korC3i&wHJ?s%d zzZqF)`YM(dpk%BcSt;UOgcq%zRzes+K`=4gD3GF@P!ScV!dC?^#n>oxirIv1K&dH> zOCS~bv%}r$DLE9qcKWTKzWY^I-g+7iMK1x1ZnyEJlVwoFXxEX<-s9&5fggu;X}&Zb z!tsFp=U0EQ=FgF5)d{+$6mVusVLZS-1G3oEFY9VlA!b^H^L2peKmMBoPdLI16L`2i zaN6>9fMUIKum&rI6b?ThqG`VS#8;@)xg0dIMoSyUHn7`hfd(E*=7_;m0UWwZ1Wcbu zzycOW38ic~*;Kw-7rmsYgQ8Z-Bq>-e`JF`)C(T*2X*7-T*-OXq`te0$|LW3pKYhi9 zC12cf`_!)c4(~g12#2DN!br84MiBbwZi!J0pd&Z7UG9n@7ndX%pZ8-Jq8H*FHChl_ zr{L6yhcM@Z^1g2C?o0n+26qU)euW;`7=SziT%?GEok0Eq@+>kTVVa{;6Q7sHz$0J* zz!Z?RKq%11DzZ?*_F`!)H*ldP-BXQT3yZo!F_u-&6U%1BK1Im!g1cx|=|kVyVjwFJVR*g2*IeK}t20FjX@y_Ce3At{h5a zTbue4vx>@lkblN8!3?r8s+MmzBFD$qSlXq(rxj4LihR&BFIqJE)9;htA_OBX4A77v zV?~nn;9Nzd3sQ9;g{b0q$_$w zRr|Dv_?HxqV`hrgXgH48{r*+M^L583;?9-T=}SjJq0hEq#))6EP#KE(=csf9+H~e< zbV1{kNzK_Ef`p0z?6Qw=-yx|s2P_{L$V=h6klr%6a&aO=b~=C6DD{B^%^)uvB=W1BoF`pEu!@j$o2 zQ8O29VDQb416XxF368p+YRQnh4HbTRLnMMbmbN4f8{SLlqZF-ZYPs;5N&M#E1)scqE(jQw zoq#{5p_biX64%I5|`!cg+yWqw%XsURhWg z0`0S4VU-hBtE5NP=42UNDwopdVvncT;qvu=SKUQe06~Cd@`4fn!=E9Z-iSdQRul>_ zAqE!Q(<15($4aTuugaNkA!J^L}nf&#S-tmgdZ^BKH`s<4N^{_KY zysxr8bvS#;hG-eg(f@FF{=7Q)bEHuNcz|$OH989l9KF+8v}a>WZ$$UHOH>M=K6llm zJfeU2@5Jc=9D6={x$aQ}FU7#KDT#sC3{e}C9GP_~7^BZ+iJ%zbmd1f&oYP&*R9Q5U zgGIJ4<033XXF;ck%dBE?sxZqOl7;v-yj+Odr4@;UoJG%kQl`(tj0y7HX@6H!*5f5Jj%A zM|0RkP~yVF>D4Ff#db9~^pOL5?mM_=a>wo!H|_Y-&radM##{8jMmg;qxKV+XDKo-k zGdYS7=j+_E;FaMvqE(P3p%m^Sj;tC`x_jVWlm-ljo|ZH)_ncvt)eH%6X{eH+Z;ICN zb|j#_-4#t*!LX$X7D{vAFUI=frDsAeUNw2ar?!GZpE#H_%=BUO0Lb&{mw)4wt8O?; zxRd-Wg+NU}5I`m%NcDkW21fx(8J*lLd%0YIbYQ3)R%C_isHKAC)>0G8D-J4^msIL} z9xkS2>rBH?UK(b&^dd)l!9okc_=R0%V;NL8wf zJXO{pq0u6SrND-SARlXFWxiUqxZ@P`zrk-2f)nZ%G@+m%o1sv`4KM0yI>=_06$*t- zg<1@y0&=jIpsv}Q0WYDX<{CN9fv51jZRNIK{>W{3rU6<6qKkgRA8oBa*;o@y>F-Jv z?6cGFXu9)eAE>&+gpv(rF54prG^N8hW6hbJ7q@gm-@cVcgy8RJig5*+@ zS&LsvGLA(w7O*vtS8U0SbcY~$##9m^?W;@7rnHkYL&3L^C3vR^St+GlhOE1m2rOVP z`ZGUpRB!O-Ig6V6n)ZS*jG8S0X5fE(TRuePPU5 zA`CL$joTjOct@t+hxYHmQ=Osu``dQ@#TV__bd$J0!nd6rE)wrG4c-++E5K)wd&wDQ zm=WS!=$N(iSR)sR=A}k!fi5W}eiJ-0v23N(?UQAS(3l}0W46gBFEf+(-Un`24=@u7 z5}``t!ZkC%5 zfY~4(m7)jP3%*zB1rIBrW_6hccU&BzC2|5)VMH~+T4}M79K87wQ!zFN4|tc9OlH8e zG!gP8|Q@D$b+;9=4#Scq|cUDBf48pN8%S93`YH4C- zvpI@#6-CxAvP-Fg9VoK5j-_^NL(RN_kk<$xpL-3S{5<@d;G+(l$6Y{>=QEbAKLd|1 zSh)VoC8KikSsL#BbpV+3e?S*2D4&-IR0|LG|XfU5kGQpM2$4a zClzcxPr=o|UdWdPPgcnFguMi^_EA zDAdHSEyc#3)!A#tlyYgv$X|aBX7Y7^ch}GT&CNItjbAE1!@5`d-1~$bZmWNcdHJM7 zwwI5Y+>JcHk@uftb%;Oqwz;b{o0v}ar2-8nxYd%7cND^F&QA>X6>cZKXnlf8OYXy56wmdN3z!#kq7C; z%;Ek5j@bwZ1AowzTupSF+))hm#8!vXfR%u4>QKQL^l2$D}u+#)ScbS zu$s?Hm#u%%lJS$~k3M_h*y}&K=`-uL?bx;FTlXKpb~NZK87w(%=CP^-uYS1Hy0~=0 zdZ>=xH=J#w8(HDR_WcL<-gjW{?UTDdxNiH!*G_>szXi{xBXcHb2-OV4AkGAU5J?hU z?AX(o?j^WxO`Cz15}g#pP_IVg!!E*xW+egMb8VZwxvnhdWI`?*DRc8`#8DU2Zm-np zV9OD+DysRjHZANuTj}8oNAPFUiFc0d?VI{T-S=k?fIL6%Z*F+fiWO)3Gm#XI9P146 z;ysYZAWKlo_=e)7AfCJwKWjAeq98EhsIMYuk(pUhsiL-|qxwo+ft(Vvi6BLuGZvQw z>}H8dQzn$T&D(74YACHSRn)D~GR%3JO^RQ7*pwv*Kt6RcgSeo*+Pa_#x(nns_K8@# zQmE*M(n~p?7v{SN4Xg+wUBUMm3V<|Fxdom?yP9thTB7&s(xVP5U{5W@_ha^!|jd}1DwxV^bJtxvzKk)kmE2@ zwDE82Hss941})zQ3yyDOn`T+!_Y8PPGgu}RbslbjnX3~sdv&H#+7%I`rLWmnIl$Lm z5e>fH_Ii4%mo_S@V>Ig@d5_(1Rw2ru%F-3;3&%>S6^T+;E}Z3D` zi2+8#EFY~NSh3>SAO8DO-uF+hT(VK|CvZ}6#x(&-24V@y;s_k^Fwm(G(I}#?#0(_` z0W>PLx^iiHL)x&BXdP&^AjQ$~lZ!%WT26*?MPKV2EV5hHy@BeaM${G6RmPF9n8h~* zi{p-JkmPDlTOx-61uCtg;u{M}*V1h0=$D!>9{%RPMYz^MtYD)+1ojYWLR;ZjXTO4| zLN5w%v{FV0~+Et+jI3#_HA@}V`+D^2xGd~2n_;j(X_alBro;{70R(Y(?c zjU_Q-&I-t|akC_N@~K0>qG9%&g=0^fKl+Nx*Z#{vb-y0*Fo9bEIx54xWEgNKkSObs z;-Q)eFp3a4yuI>!6(nVcING?c7Q@ZRsb@LdmQ%w$n#5= zY?!xX{XA?Sq^(ZJy?{qvIz|zKYPK0L-ryuI^${F_)dJTkvS3|;VnaDIkfLN6X%t38 zGb^HTcBC@gdt(BzbxTC6%Pt}(td63x(5QjLv=?jXP08Hty)1v7HkNg*&PN>c28%mN zf7(kb?fo28SuJY#p{_-vzj&oQ*%+I*fQ1@o3V9RwN-u|z8e0mKDflSJs8^V^UKTJ) z12Y{DJ(E;vCtzTy$5C_@SsrSQ$3&x1=Y0BZITWqW>pMNM=+aT%d$RJ{mmqc{1b&V< z4f0DLx)qBE`LpzfWnO1kDcLm7P|-f*($(Dv!MDA~8Uv4jO^?m*Ts8bH@8cL-HMM8` z^{yvfGTYqKiiw{GST!qSDEjcrpkz~+Gd)>qH07T$_kARX3!;feq6JXEU4JjzE!Ds( z)o5k>n?d9w?k=m)x*HX*ZQQ=Pg)o9>17qPZ0w1Ybd|euHrIaan+R`F@QNU&Nfd9sd zb(-S2Wq$TDxvvn1zMi#k^j|F){kK=%wEQbu@1EZM9USL4ybnjBGu>^-tq|bOL5^&X z(yl=cGDoQ$*Z_0JLpH{@?ppNK?dPqYJZI%3eoPQJ1AME{Mq!~s3>akSpgo1URDJyq zXM#?SGo4!0T?`mM0;XG@qv|N~RO6EF?KW>yX|mV!A}eMd2D-h_Q>l3g`BzJ?7cwJI zkQSx*a`+@3LK42>UhFN%G;sKBBSRcM-f{Rb%@5@HC$5v9Za;JB2D}=0#Wl%{HWW|=>vUuzTi$piRbUD|}dXsG~M zqG&EHC(m=AvH**tmUvMPfjLNxS?Lg`X)~G%O>U7)4>np`qzYXZye+5&KpmJ_Y$O5Q zpiaO=bamgzq|H{5-;a4Dck_~VMWvzf4VjY{kN?<$QT*h}>pynO%5Q7~_x<*R2aX)v z=jSOh@lCRjWc%0Q(n7EiCH|RZT>1Y=p&QHl5AA*E@ZK#`yFV;PohRSCa^kIcNSf?& z1SA^9>SeXxYx+Qph6yXG)LfC40ZL+HO4e0uO6?8y8jLGCi96xlAkOs>uvCG_p{y#c zY7DewR#mA)=->2KGpWm}2ruL&FRnYGuM%KZc}+A+ExKT2>Y|ZJJVtf+cfd!ElP7$H z+1Y1(W9Rc%-f{Bc8_&R>@Rn8F(g2FsNP##e2DXE(c;#o|I@kq!wG0ebgd|XxunK?? zJTcV_m=;Q@ro*6WD06jCd=5O%i$X+;iXyAf3xKPvkX!y(+1STrSre^|Yz{9OPyt-3 zV^IWAWh9v+h=H;`cX2K)8PY6*`01Ls)OJZ%OB47)DfVXZ*tcK3>UQke;~<>j()a2~8To>vg47q{gM{ddEO41L0wVOTx9vRxgsdXbpa{a0b5= z^J^cy<7Jm^I9Z=@$L_MO&|dQIDb{0R5Fb4>e*T%i->rF;KWKWAsdc8w@9I*P2_~5Z z+Nfg}^Q*ocnK~aI*_x@}yKeX(j^h`4@e5XGFW!KAOnlNgHg<3(0LO+O-t!PuC9tJz zS?dXhf{LxNeM5|xQZ;c{5x{DpSFWxp$~I9{)$0a%13~MRO05-90E0cUDL@R*Xe z@@EsgGys{#scDv>yys@dL}u9BlQ6c`$4c!u$MYABfknS~+4#9DZ~KQ^X6`$@|C{$8 zz%%a1do$66vgfkcRvXlfrJVZMT?|O15AWam(2;$(rE&Gfoqzhd>9?$!z*C*i!xJ`) zJof^NDTyHoSQIxLoeV=9N$8RTLe6wi<<>se(ve}@kktzJvOVji(o@n1-O|QP4a!P{ zQg`NxQLrDzmG$#O7t;hKHFGIsFz1)yPOk8clvJimC!=u4K4 z;V~U&;!ob4zqlC;+Iw&e<&A=t1zH=7GMFkbuBhcf#4#->fwu;R25u(vo%U{{5g4sF z1`8F9(rj}q?n)^c7J>z#L0o#fsLy|IHJjo~Jl95vOORfxNLnO`37gGT`@Sf>8X=6C zgA1v;s(YL1k8Z$dg;~Cx7@7fa0&ytwNMX5;}`~xd}AZ}^tuyruSUm~Psh$b16O(f zAdp$=Wu+8yi?R#@Pdjj!E-Gj%Iz{TzUl9@*5%T=*wL|{=_(J5vscqhpn?Rw@tWgvL z%w7%%I@2MGGDB940A|4VEVysP!DUxt;9z4r*KWpc4={;W4r2Cv2eym7AV~$?+#KLR zXba1Ci|Oxq0uI1@%hvG9Yp?sq4XojkPnokNndlaaV6|6{+Vig02sr5hlz8r zefbqP{kQAxy!GxK58Z#@{v-RrmU(L->8>*9#F)vml^e^Rvu#kTAcYJ;%Md`)A3D4T zH!%Lg?YsW+OVikJ26M(yX9XMqv=$8K%q&9ze>zfN90=xUnhe@BHUqwgWmy+;1PK^`Y{`dxS%yp_mhn z&7P6{laU$x$^NJAeBj|g!qE2nzXw2`@hIIhumyeDD3HWXj&+fTC={>{TrCuurQ#Sw zj!G32hYQ;4u4!N?46-q0M2qT_7WQq!x^V{Ev?E~+;k#92@1|6D=2luHRWmE8w=GKU znp?I{Fs{8(pkBPJ6=8#g0Qm1qKol|0T#K!DrpfxOnOlB|Jfva_zeNcCY|vNGl7OS< zDB_!VfDgAR63B=z(J2clRD+zXjz~of@(DEVtQ|Rc$PR8qKhtYUcE%e!2IqWg>o0uZ z7Ti?$qD9j1y3=%vuU?2@K>pl*#bBdQk;>A9kfEvak0h)9NvUe`zO-3G_~%6{DphEU zuwGoaX8QN9yYrG8ZutI(q!Y1)v$HQ+dDj`2VNh-8e&bee94mWXW`bug=4?`!Hpld;cjdQf9Jsict%G) z;T+7j|Nl;&n{yol_%n_=_9EDdkd3vvRs#cjS*f`+N(P~x%$8o^=sD1(W8l@%fQt@;n~QK}a()$D-*%uk zGX<>L$gnifH~{u)c|z%$Dg5T(Z{2tp6#7I2r(w>Ibq|0%pSfVeyh}FE!$!1$TiS3i zs1e92NGtS1Ub2bNFp~mzFfgy$w^nxWEqi6zYiD(JhPk3{bv<#a=Jc%~NUW2aM`jMv z3Ema5MdS9NshjWlCndA$3T%QE6$7cdCgdrgdR0_kG|>vAhyB=Beef1=OXG(Xq7u*o zpt>xYe+4UeP86bh7OXUDvfM2VV3hc@WEC#Na-f%*3E|Ws6iU6da0a~eH$Q&oPhYVS z$G`D=zV-p3GufYI71qzx_;b(wgG?p_=?Wwemymn|_|^t#Fe`I#`4n4}V>48~V1UkJv8kST(h@epi6NGu=&CJJ+I(2I8wby#q+WYJM>~;2e-}kH+(;Ku_joY*7{`xDAop|t(-@M~8nRMC;4WyH{^oZzaTV71x! z!r>KVB3P2`j^Sn;H(nb;<(U;Y`P_uu_$tpU4xPO2_On0#k?mvao&YsoEG}L=|GPV1 z`HRQw`K5Luo!{IA;gEA&2--}|NM8fpfvJRJaeOh^D4}tSS=vy;OuFm=J=VK_pNLm! z=$k_H8V+C36PdyaV;3fERs|{z+2xo7vNZE4GpG8HDKyEOeq~zxyju3$%4)_Dn~HUe zcMXR0mENT*;EB{o2>!0WPS#z6Y%cl}! zT-R7R?RSFXHCEcuTkP#!PS*vJLfPaP9qrV$w>}^#_Vzz{ zWj*+X1t-^?3$h+b0xLq94Zg9)l|z=j2~|hC5wYuS^s1N2%icv|4z+=H{J0}V|BNtNwuMB)td%$YtK%xD*8oxkN(}a-|-FCAHDX2 ze|GfK5B`_9oWp;!@cjSTRnWW;+8&el|9#n8AO7S+|Jz4T|EmKhfBb+w-M!X67$6pY z)^gyw1v6Y3*LW;Qa>3+9mE@KtC=gB=ZI zxH7`EFPkCsX9~k%l1O7Yiqr=!Gj1u3jr%ks$oa|-o%osC9BZONq|v5O z_mma09fZMm{6ie}OR}wa{?_~c{29g>7kfH?`(yrhd8Pek%04W;UVvbRVHwu{v}xsb zQ+NqVx>IOlA-6$^&+OGpM-@W$RH=kKH5FF7)N#^JF6^b?zSBI^sOj6rZQ10EUfL|1 zreSYj&VQ5&v?$%<3U>2-zWv_H+mF2Foge?dK60-;(0ZajX;-jBUv-*GS>K+l}_xB^=*jcM%@6r=rF20@;Q_(oS5Euuv*H<>&Ot zhD{Ty^ffPI&gSjlF*{Rjw57q&8~aElmZ#Hd&|SfY=rUyqUJ~EpPqFyn|MVIA;cq)< zw#VGrGf8T$^8a33zwxK$l^-r7|4x;#25tsZ8mrB~>EY96Q`({Ly$1F-pZ>{@eCFHk z{lfMLdY4T0^q779ZTH%}*v6Bq$DaO8+2X(1w7|U?jKTknE)*jTN?G#M>*`jS1}=cO z>U0_rX`o(|S9?v#msvul%kBk&F9pEv5-JlIc7&PtDnt@{HOI9t7n8U_H0@LN^X#JN zw;%ofU%m7Fe|Z1nk3ag?b~(r6Jcy<+RMmR3q1|uzl`r@cHts(4`FH>42mj3>`z65> zmmQR6b^1!LBAK*c!pIm+1z-$XDuGZL?q1VE6E+|pW$dmwmyY5KGbE5M(#sJ2K_J34 zTPiqZMSy+250{0U1H{niE65nB`BLZ^X593R9grY6?jTeMR~+`Q{QmLw)Z*zO)8|SQ zE1tjUqo1+=IWKCS2-1o<^#85&z&-Bt83*%miYBMcl zc9FYAmQavg%FKtt&W>ru1eO_A*RB9Je1gD%3^EZMk{*Tpc&j;!ea|+PJhGrheJ9y$ z@M0$JRew0UqT_jQKl;2qM=!tWQ@{7g(_i}XzNHX<}B*Cv)?OtM{LI?cLiu z2cI!~`z%W2?Afoo^Tglz&}qAz!^-JkB)J1+!Kf1{u}KD73T~5ILvKBFTna>B7d0*{ zb{Vqh(!Mpd5u|(3CJoLd$ft>#lSpRdd`2l7g*AH&L>-}-%)Ghy2#_}8m$s%P0)?yio^uo+)<7;m{^KTBE_@}@2XZFA`yPN|TMcc%7{VYVm(X92XshB|*V> z(>p(pQ`ls=vtE+n*{qkQo!A;FsR1pSNeY{|Xad}k{g6CE>^zp$Uiwm4HQS9c5OQ)9 z?M3^J{jFcT<9Yjz{qG0w{^VyL`isA`A6t2JaZ$9LNc*Am7fFvzqD_L9?rB_OA!Z3{I}5h6aw&wi42_l0c3$!AcYXP}O=8>8UBDT* z?(Fm5@wu;m=O@2r|Nd9M>n`%=Zn$XG#z=|0g!-1vRr|aIq6m2~wv$8D%%JfFOYgFN zPE3Q^P&^MoBNJ*Y0m{rjHRFLWdnqg(t!q^YmrY&kdQD8_>yO!`3$Om=<3EPqB3$s2 zk=t|wa&oNE5npRw&5G7bOBLV+jS@9&CRoSmGBUFQb55442%#J((KLZ+O1qrnnp@8N z*zbJypWOJVm+iC5Iqah7qxSpV-}9?}{f0ijE{E@q<12FLGkonu7jJSz+)%E}67=QL z;iymK({DL^@|wdByz&42qOtk~T=HA!UCzMSvw!acr@!^xe`vRgVCDKsEEeLbOkw+U^U7(1522FZ2wQ0+@6}}?Zoi4TnweTce%_vA|IIJn@tyDb_zk~z->HWm`K!P9^Dq2)SJ75F zTSaYk^GurQ7U_Kma zXyS5|`jlbcNWO5-(Kr6ar>%x;#vnD3i>NWep)%w=_@w~^<)sx_SbC*5*lz;VpyJ{T zi7wh(FJ$LQrOJ@AE10m?h7;tC%vSUPA0$!2>m9s(mU&x z+<`)q2fq{krlx`@X6hHLyN08W?CWIKEWOum1v2ojefyEW^-D)C{k2bi;EofI+eI2* zdCZQQt#bb27~eoY(Osx zQs1srsz6?2l^~_8HX~@oQWta7rUae#f+6(eqRkq}9KH0x+s@u@KqZCs1j*aw$bfiFn zQjIF9?^;(1UBopTn)y!QO-my(kt#Gc5m%}gV4*?WkooOo4<~LFv?|)ph<@NV?tanr z$NuqqvVLw-9gvHAnH~f-8C2pnl$oi4%EVDe+DEUYZB_lXw?6c}#~y!flg+bYbT2sc zfIaq;{FbY%mUA_YWHuLR!f$2ob(+iCCG?fO6=lgJt!ad04~AF@?NuD2fwY&t#)K^+ z=N+?BV+SWyhA{LRIZq!tXk6(H_E46Kb@8Q{ugl>D`@vw5m41A9+1_J+^Ox@Ux_2D; z>EFKV_wPFMiU&%ID>{#Zj3!e<2HYTqcPfBf4 zrteggj`&TUOGned7*GZ1XA1%{ASk61Fa-Yu!9xRuEe_9#q7B_87H2gQsA7Ag!8m)X zfT7H-!En&D=TjXz^D{R+Y9;iuf{V6EK09V0s_4J@iKwE_o_*E6fkFrVDWdcJrPz<8 zH}IS74rMSS)E1!pMi3Z#Q?5^#dI?Cq#WFdXUP3nr6CU@1b`%4`a%icE!502}ph2j1 z7fkYV3)0*8OQmUI0*SA`t1GcsgdekCwYG~Ea2Mgg&tQ+>Te4Z62^29VTk-@4B(d$V$V z<@^~Sa8x-oEB1lx5h+Y*u&D-^*y!qU!7{q8JapoULyy>n(9aIWc&=u7-PsrYyL^U$M7rd$3~Mp&f+2nVETw zflvD#gmxE9+Q%5Xc&0IU5@yWhL(bHDHh5B~56PyWycPpngctntCX^z52SMhR0_K?BR0G%4 z)mVtE0-jb^Co|01pzN69n!^u1SJ`VjuCL|{SQUNt?AM<8$~S)av;B0tO#~%8NfuI} z-v7*FvI`@4;P!WND=)CmCZxAw$qk*pO$E zd!@@+O9^U|EYwHJU3W~&Mg0staVRh%FR?bw#KxgPsu&CQowxc$(Fnwyi}YI>3*^W3DDrfYO zX5ApT-4EDDH0Hca$)Suer%B+)2M{}kzsAgwRnGY`!)cgEd&(_SVnm&4OeTg?8CsNO zASy4p;n?4>XWaeb9dCT!JwI{tX?r%^yk>Qo*DB_6UJ4+PI&dh?0T07H06U7}QzqS^ zAlJCGQ9%t%wl3As5=w6}v9i<>bh2Ls3@94~#=FA&nt;o7^$YX}p)y7)dsYsilIa-} zFPrE5EF*wd9XffnJ%Y)v?tAE~Nio~l&+QqAD%yV5Eg1>qQ?wIQ7FDG&)yRZFM>u52 zvXc}yGgZ;4h9GxQuwFX4((6wvHM;_D_u4pG0_+f9`s_9#$`rd6YN7^krd@(YU%JeJ3Q8?AH+DsynS;q0Xxu4A z<7slN+3wS*t$FbDPuzCu`?hxxeihl(?i~D`&)fafeGM2t%g5>q{_&-%3zOe=VHx&f z9~UfLz)JuDV0N)q7svK0WoQ=VJ<=O&NGWEFSEn7du^b2&lN)$O6pDs2^#}oKb-6N0 zer8ZPdly0@vth3IPH>x?mV?8)8C}+F&H8vd2N=73QDtkwmr%?Ee;0eV`;Nb1?~#A@ zzI%S^wg>$(Gkl27RnO%gMQO9aP-bTdr<_pdqC1fu?M=w)agLJi6NjjMfm9i3G&P_l zxdA_nlbYZtBZ^qY(o$Nl#dWg^+UXUtX`-f;Y8fDWFH28snkBc11mXlf!I`JVH6;Mi zJ2kDU_dW5{SCL@0p`ZIR5cPAMudY?9N?+u<+GUEU^UT@FY9ub>F={|r6N7oPi{Zve zW2NFEKq7d!P%84I(WaSAE^wUnHM-fCL(9Uxd7C&Xc-g<~^{vNVJm;xqj3Ooqy9ttv zx;jd0-@InPw21?A`z@6>{>I&Q=o*w*ltQN3fpFM0S9(RB!As;`Co5&DI3AgK5+nvQ z$pLiTP{diapL!Q@b9WQ`Obi-z54r37$-tY7!HPT521~Ce595G!gWLK&hmRfz=~6ePHD?33TBcK|76F=U1|8#gPQ z7Sdk2pc(V*;drS$PM0;ceh&B8CS*$KQs53!a!$V2&vE&R>0vKk$UjHQULe@JRnGP$ zf_(_GJGHm}wli?yW&ri`o;xPCOd=AFS{T$mQagegG-VB2kMrAPwvpuumM)Fyq{nhJ z>Q4}+yu*v{DwsUIfQ-cW4i{}QDBR;TX{c;rJb_P5vq|?7CO%&=pk?fvG(bKt+H>?f z-hHRtI+s5eVkKPANODV%PtsRit3X0F)|$9?ATi;qK_8ei<54v>#Xyp8GZQIaHCDMNOS5atfzg>2CoQ|oK8C~hg{35rGhmxn)zAL7IOV@8 zd-Smjx45^+JIuffK77AD691KZeFY5M_n50u8Y-PhF;ed9eHt^>=gXqiyh#) z>gkIvHethebp%d=RM{Dh89KWx+*k=K2;}f;4wU8q#WW~*9lmq@Y*W!yZlihJ+6ahd z0#Y3`U}PlP4D42MLD`ouN;}bO~^2Hj!^7+@YK}@Phb7p_wBI!w_V#AcnW49>u2E; zBf8?cW~7CNtYt!xRi0)zRhB(_6ROyiE?Pgs23`I>ZUj?A5;eR$&?>iACNx7zKtrq< zIjCC+e`)3*^5J5_Y(Uyn8nD!4+8A-UanxM7LEx-<*$>pdbnnq0vfm=SHJE=Oy`suw zr^OWoc~CGMAWYx=B}oF7?_jej76@FsXdeRVTW$o+ehb>Pphb_ee;G)CXU&g5`aXu! z%o$Yo4pMO`Emm$5ZNCYVanoSTbKzCP$$cSn+yC%e4sP!vdWPOp;xs2te`p0{Y^ORjP3%4>!V5 zlkpq`1jeRWh3er{8iOWrg1&GHkdHK?mAa??QU5(hYnn5`hch7tllRp5K z8SovjYH5?h^4c4ZU-SM?pEoUR9kw%YUNgY!H-aslYK+{1-$*+YjFBjZ&`e%>qi9#^ ztGe2^duwB&7meFS(ab)YgISf$p^TJbCrX6gl{zcBQ(!o1R(C@d?F3($u9`iEs)Uz9 z2a0RFt=SsQUxrVEoP;`8vEL$mo!>wYQ^>7{$q?!-H=nV)2(Q?`{Vl@t;;g5@`0Mtausa7|jl<_!q+Y33X=h8U z3d^W$i$-D%CdKJ`)T+;MWZCv=6{Y#QyN0t6;h0@vj1bgBvspKi^jI)3%7T4FtRy=` zI}&h4K!&y#tQF5RW<;a43@t;8=t6xp5GHA(o)YM(E*ynb;{-P|8&?l4CQ|~zY{gMr z8tQs~mXZDX(xvaecfEdIk^ngkUE{m64GnmzKsp-GnzZ2sN4&FE2V}Q3-+X#k3VD z;(C&&uKD0+tb~3Fm|_dDoq-)@fc0~ckFkn!7n)5qPV&XlQMh_nuxQxy#dX|JxSOZ>r;;`l=C0yo!20e$P3@%FWdrHC zvYd0&21o;+%)!Qo##fs;RDShr=g&6qH`{L!-cnyal3`2`k{P(Su2Re6+$tTNen)q! z58bA4C^)%=B@xg?{e&}$35DS*8l7cT!Ta~r^4ZOQZn@V3|KuZ;Ly(i7$paUhSkrhd}vQ>AJkx~x1jtk~A~>9X1%q15vkb?^ zemv@Dzy6umZ`eA;tJn2J1$7o}oCcoZ(r!nm0x##5r0TF^eTXmqpzn7CO-czer$+Np z1Hw|7E>i2#7dFux(iVeGOq8A>npz1nVhd8q(Dx}d^_K0O zgHIcuUc`Z_ekKK(K%(n9FqKj7jdVwQBG4T|8x(1$-kMH^Mcn}l5V*LEZK6^#V|Eot z>{dmUaM!xj&9LKOD~We#I=ynIu?Yp05uu?A(r9HRPXiTZ;~EZ!uLeCKNHt~&XnaR* zw6se&>@LDLy!X%SH$-qm(1mNTlN0-ri$GjTUrQU+sJ+R%?1EYNa(^-IwX>8wPEq=$ z@g{K9^ZQCFJ&ISY@gh0r*s(ig4sMN+u<9sbZ!3dzQgj z+CfibV=&cFZXs*P%9fO30~tBfFyUqIbk{(Z3H3V&>asNRC^hz}*P7G_NGs6`Gk+iR zpL}6P0%z~i3th1Hje{G_luzh!{l=U0{F#ds!h#2ewa;ENRyllwF^YjFSOq^vSJ7Ir z%5*xdJO-|7O}cdb>?xt_U$R`JVHX~cry@}XPeZFrEYJ!o>Tu|&LKvi@>X$O0>I=u7 zVOUykjm3m3?6Gx+PFe~5bkoW<-bFYAsGs-v4-q;CI(>EhOuBP!OwP|EQ}7bKTqype zSM|1wX+Ud}0Ohi)5IigG&3u5yxUnVmQ9}&Gyy&Pwf$SQ(>mF3Hx+@Od1ED5Oj)UB> zW|EF7xIslxv`L1I8ygz_3gJax?}`W6{lj;C0(TJ(j8x1M48yDDs>l@nS&|Ysw)KGG zd-x8t8C_l&ePMBRL6iy4#o2TN|YatGu{L%e)ea{__UWDB9)f(~(58eIx>u!IAlOC@P zPWI#Kk|J&b~mQ=aWIAx92O!-PZ#f@(B))z}lQnzI=}N@!RKH>I=$F@sTQ!yh&v zN5D>z>Diz4sNX+m*FUp<#wy18ee&;)7WF4!m+ws!Ue+qz@ixO|7#eGmA-AJ9t74~p z2+3np4zS_7`kEyXCNF7{T^&E|WynNcKy^N411J!?zIQzzmf5t6Lom1HZYL5y^WH6; zeznN;B8!{n&%;(i7B!wx65GUGNm*6hk-ne@LMnqiH(}C|LUG+<3s6R_xKnyO-Ocni zYypg=S*envnDEPHLvA+G+9?vDHkWdAo?n;a1P0*-8yTryF%BDh7WAbz-D^kC^>tgH zHh|EIe}Zs|ZM;ipFy!F9(V$swG){dOLteRKTA?ThP8~sy6b+jWRD_HJXClmI0n%Ri z91I_pcXYq<}3mJvT_E zQ&p=(j(Y$0FCA68m3T5fBl{i0_ zhPcq@`bzM%J%=m?Sj=b*1KZ&~to289g@ETZ%WVPg| zkw|B+h5f)?POb405I2w}<#Z&VFm2WOISS-I*cV`1ihG7&T!v7g5bWkerR90N2`jq> z12tM8ph;M3h8$_<3=BhP_fuCLe84#We|_&4FLEk+dWMh3KEL8uj`+%w^+=gZEH$;j z2mAV_sl5Wqn$%#ikD8`I@2z#6ma)3ky%)Hx`ds)@qDQf+QQ(V+#Gzo8s8@?mqG0y4 zQ*g^Hxtpm1Ef3xuK?bNYx|mF!uG;`>j4-x$Kl2Y|$R5b^DOz*0F$Xs*kj8hMAsIAj z(BNgJ8iosd8~*Wc-ghj{pX>P>O`F0Gi`7jwE6%9`n1yli0Eq=`MsiSoXd+@D6G$u+ zpcI=0u{0wMU2qZR0XR~^J2e?sjnf@u=pnQoZuc-tX4Z&u^#wkU)TDK`EA#0IlmXD} z-ISEa5LX{M^V7fm`R!T6)5E3PD1PJ8*|R7Dox6gUNKM*YQmazdQdYE}sbsvR9Q>Ii znGtQz@}qCrEGn^d$A;p>%U2ebzDJm`?|L%=Q-YAOWYio*@1a56tClo|K=8~^U>$AT z0%#LVUL|o+efRpP^A@Mt_3Cdl0$Oz20_^Yj<`3L&zok;tROF*114<;D)kpXwK=M+V z8I*N3orXbZOgZa4Zj)Q3!RQ2s8A9m6P8fiD8I(fjP>wxJMTX2YmH@y&KflK8(xK6d z_9d()Fet+}H5+iOw_Qe?s}7&M^7a##{@#~-F>e1|;2HRakAB7;`~0erPh#=LcWqI~ zP3^QYmYQE*=Rcl4>0|bT>KA#CQ5WqrN`ihqs zFBvSq$}GnsF)+W-JAEb3+zTpI=HC;75iN4?G_;E{1bbgbiLNUTpEe?W%SX3YK3`xC z-NJJQq<$uufU?LoXvTY6XYAQO)X7Qf71Hm*DTqb`8SJNKCWX#@-V!q{0dv!q| zhD)!-HspG46VpJV83=h8uK3I+g)tdyOpNZ1Byb;WHksA**+d;3Uu*a{_(ISO9fLC2 z?jp1!=r{bj-$mG81>&nTG7rdy1Vudv5X~So<4a8l0aD`vu%R zA9s{92bCqRf=8@6U~vTbLq}+-pZyU=vE-AKs$N}?Osx7Q3TqaNT3PG2f#B!!Kn}6k zlS!5u>xELfl)+pc3>Hkt3U)9n8U)ou7jl^D=e~}Pfy#xPZx0JXN`}A}vT{s~3%L-6 zE-3pwwiU5NdO7ye_s0ZAX@tni_4b6)GgsYq%1Y=9!yQ}H?F=ktU|B!gJ?TQTMSAtf zASbAyo^)zb))F~=$&E>UT}%!%SZ0nE)H=C4bNVaDxyiq;ps-$&IgHCicvyy}y(Ujh zM2AwlmRYga6Y%7loV6=^YnTIm?J25U?uiawFIeik#kB|7ecL-farwcMZ{>sRlxIjj zCKNRpxsf584CxgvV9N!E7f6=1MWN;^fk3TEfY2w^i@hYHISgLJ^fEqfQOqQz_GW=S z=FiNBvz-FO==5DDN5|s%5P1@6Xl+k}=;DUu6T+^Njrp&;{p>%#Yx^MR1wlQfis!%M zb6<1a*;oDY$8({@y5l1CiYw|jt}=A7IV`tY$aJ?}u{4^B1MN_vD}$C}E^uKani125 zAlOx3?+tgvg-u(gV-&X$v|&j&B{+h}3T00zp`+<3y9>us0yPu{D4H==37z(sDyroP zjZF$u6co(fi}{KD!kVrbBf>GBzcD`l8H<$bnrpUrgG{w#6(^|ax2NfzLXtqUfxu3@ zH`L)_resCAnTJpo>s)fDN=qJe4DLa*NWOAd@+4V~6z2mJWa=kjx|BM4izn56lsjDL z{jqi1AMAcg33Cf}jv0{pIq9V+Zek>B!eFYOu?sja$?KfWf@-gFX||v4j(2<`!`d&9 z4}!uMm{DNo&IMT$qkS2B0+XCJMYGlG8=`lO#~m>C_qf+Gn`z@N;$AycjiP;h>I$E` zQhi2HGebj@LPhjZTyp)f7w_}C2;YWZ(IQuacItS<32l^$3D@wB;G_dy&b-IGXbL|C=X(sUWWl5hxZ%+Y&y=L$QI7@njRo&9aXoP|{GdwqgFonTe^yQY;6if^V7?)ihw? zgeJ()Y=Y~U-qP1JjZiX`6c~D=z*ObWw?sA#F1Ut-Mp{<{9zRy|f| zEq^OwQO9;cSPR@O%ghBXZPlwX*k+<8MMyR-%(;FJsF_AIR^`yCLQ{YmYhCsbRlaKG zyy~x@Sog-jYa=L^9wY2aKg_Kv(=2LrJ=md5#qG4ME0kB-4|d)VNiih0OpdDArYMOH$C{wsb--O;OZ;5h3}{11NfQyNVG@)AVLb?c?eSXYxjQG{n2 z$QWd5&CoVbYixz@-{Q?Z9 zzFnkI;PurZS%pG?Oas(r$mOmPB?0I5czH^TDRrg16nxOq4jlh(~JZu|gAM*!-(17`kL z9e&_vZreV#?z{+bYy6~V;GFd{n9yhzJXvLM(p0e!%WQI&650+j?CC{;rK$Q_ZyLy9 zuednnwoTRfP%4hfbWcawP(mYnmXQAnLQI9C!DdAxJI>Mu_WmAI?Ypg{WcJ=QYM6|5 z*+I%BHyr=*58Qt(j-Z2%W`+a>E!fh{Oi6-*9PbmM4Kzp`!V+N;U>V8*Q1li(*)rl* zQ;4_pnQi!*OL{FMLbLQrOMi58M|8B>P|~qNqss#=W(gYVO~Bzv2%cxX`V$R}Gs>yA z96o86aD3;z|8;v8;gcq{4FJD;+AiLB#SJS3CyOhrzFtti`uuC7Nlya`FnGoF{Xu?m zAxPU&q#Df7ga)GMcV{OSz@A|z6U4PSCC{yKij<&{9DvDz3|?vG zfmVuS;KQcUAX<;8V+pl}(v8cp>{SFAvheLl&U9P~ znpGCS=38enI^L!4swVcnn*3o$sEw)S5TWfZ!WZp5^8NN(gty6EgkYYa$}Imv4mvFo zTV*FIh1Qb%sR5K)P8xQZpk9+6UQVH7F+7p#x>wb}=#41zCZ(Y%(;m?koL$%~tm!su z)3xH;d)b^u;*5Kl@6Pr^DscpD$E4eT7h(o}^z4{w7pW=- z1{jg0Yy6gtX0?_H=q^F6;ydxu1}I{dUu{u2@M{xiycM8EK1j`4O)NgX6eh@b2 z5P-Ydp)@oOWK094b`5c54pmS4$$e^a|0>_ujP@O~dttu)U7xt@z=>;au}e6LV5{&` zS_Vc7{;iUorJY_XPiY2 z29kqX`@JrMQL0OB`s_fHDNSsNR%3 z!JZJ*jI!Ek=#vK>L&ZxO!f{c#r|nTMo=LRyItUrnmUWIBf2 zRX5DW-nmvptO<}!^;IRj;(aLW)n05mLl}%^nK1E97!8J;wJThj%oTz1!hS*Nbsp|> z>!I`7azzMzrU9Enr>?#6xEIg%+WvdWXCUh5<=UzB<)j2TFGz@{_J;3VxYA%kb~Gv5 zyje_0%cX{0DlE)~I#Vr|#}VvxkjlqoVp5>x4nob$Gzr6L^LYVUEZS4pA%UH{9HG7` zAesv@@KprA{#ouH9N42y9(1X?%(YAbD;iBV7)xmMI$B)=R`z}^1VK!2-{~a=Q}5KA z91%j_Cxd0^odGpH!U9v93IhEUR}Fwk4eZ&}h-)BM9z1#Zfd{OFe#!}B3%H$ubIib| z`guY1PCKZdjfM1NS(M1CaI~U)y=D-;@Mltb?bnIp7b1-qz3OV67+Cy{MnLvbdm9WBf+ysP$+z(d(t7I;xyF z;p=**$}HYi%tjpM0D<-HZl_Jv;f+On$O8!&O zwh#R7J!d8x4EnD&8OVk;Ws9a?zp*!-zY*6zXZ_5DIjvS*^(s&HRhoiwYrQ+mxdx8r zq6m}BUJ7P_DAZ7xeA$eO-MyfJd-s;!H9@oNngm5amqW=wfJ`&GFE#8kfxUDW!6qvI z7V1Jde2p_N`_N-gj1sn9+ZlLLGf?%jan~mL3aYeSW7s%gPZr(eyGmBGa-`x3YHHFK z3Gf>3R)F{mj+^2FLLIpFRvEXUII>M-GG(%WJ@)Z-X>cE z554R}3noVba9>S^O0!W}qf;*elSB@k)tr*}OPNQq)&wanscAy%l|GWp(rni7+LCbG6sQuja|!=RQw3oc z1?{Cg^{zEzj|d`7FJ&zqmn1+O3g&BaHb-`4G8Ed&F+G8uUu`dzE7x!MVvJWT*p({I zdbyTiys61G4q_45rVjO`JcMw5TTNqyj>>W93fL6{*B3jLV-Af?3TCV_Q>DP(r9c}B zW>e2=vc!gLm4pdJM+o8mqx;W(&maHQ>Wbegw=-~IXQ1lmojC^;U~^hA54n0GrD$%T zvUBpGP^)Ie5PeZ%rJ-g|Mz-NF%6Z^a!tQIbHh0WWV~L!_HZ>6J-CqShrZ-RZ%i}oZ z4R#ly{}y2smZTsG0~d`pLsx7Q!BoS3VKxOd-%+@9FAZ~LY(juR|!^u1#Bwn9yTTi41HVrzF8GH0Fz!c49>c=BgI@|o{D{>X)0 z^%p0))X%Yea-oe&X{^5Dax!0lvF@-EVXyLlAp90KzBVVy+UUC@U3e7G3$My9`yBwS z3%#U{rEzF7&tWWuzph;8qL{!Px+))FPBW9rDud@#H&o;KOjHjVOt@oo9Sia6{=xeF zZe5|gUN=^{vx+SFBn0IOld-O;tYx11Xy!E=>|#W?N3-uj;&7dh)kFt?~e=}I%j8a`5l*ckqB6GN~iwLE+I|uE+;RUC+7rb4Z zoc`4w^;-Q*rX|&oXCO>Xnwd}+$PL>N?bR}6ZZ}4H!Fx2G(lC8@6|qk?o!6;a0PzMhyOP^Nw2#Mn#5%%>wP9jBqNAN4%neCA*L z(ZkzIIG%cDoa<*SaN~r2I(@A#|DYN#y)n5jHsb>4>TAK4d2t%eOmI2YK9!8szClfC zutEh*U*IA-Dkhb{N7D>wLjieemuo6{#YrU(y4@`4dN3okcJfVJWtpSUxSf*DfaM&? zlqG3AnVDWGM9?x8_C{8nl6TP;S^4>M{PNUK)nh-gD#vA8oEA$vNrr1*gd~bw?BESw z?|l*1NG7@V&3;KKpl+?7i_GWT=v&MaMQIUNCF5Qpcao)H^v(xf@@`$}s9t6eO`DT7 zx~q8uj#=UrUK*OMD^*p&n-2Dtl{X9{M6H(DAyIe_<^am{a?jxE7 zYo&2Bf3av-DyNxTY&qC;xNxcZGc$qLX2&_Vs)6CIrysPWz%*dYCWW+&ZAHB(Q*f6Y z?1rhRVRC0QUw0pdHq3S!lq0ip;Re5i>72tTu1Zb_Gz|#F59O!XjpvECbG6l%q6h!atRe#cKHE1Z8V;mCDFD?m7v=+MD zokkQ*=`|N*rSH03j`~cd0@JV4DY(coh9Mq!-8 zEUnji1HnUU!m)!4teAl+XU$M{M8Ybrb*>mK18eQH{|@83t5F)r?zany3-YH zGHjyCP0pMVoW6{glJSgo0%2gP2@}miZiXT94hHTu@h6gW*7C2+G**Q0OhP%Ngy@W@ z0+=&gIOO=S5X4ychDKz^C*T0p{JBz!7gVKpa{Iud-ErU6>cY%`)Xz>P3;t~WDI#(@ zVi8;RYGydxXp*~>U`1xFNFGxT%;TD|FaFe*GPfUzi1d5u-}|yjYTJtH}%3T=iUK_{8li zajeH&Bg?-RZxz5A5yrHq5SJfBc_~orO`*8L0Eey(`IrsOIxFBy!HLk5<j47Xv5jO62jwd##!5|<7D5K#hHTO znMAX0g6>iGSkhjIF*ue}QHSj{CuUzkF(<=#qYHC__cVr!y=Ol1LEzA-%Mbe9)~~;P zd-29a%<5m=p`(7@bBF(|fES;B98s(_AANv@{GIi)a2mYQ*J-f7`h=rXSuv!WRVmxO zGzb<=s8G@d%5F-+LD4Y^$%;%n5UCh+6xnEqkJ*?&Mr9NJlv{h%NLwQbgfdToG%k!o z)0?BME*Co(rMz}ltV`I; zxKvHRYf?6BksCC$UkZ)@T9~P3uEsSM4ilKe&@~fOpG%v4<%8>9f}Mhwps(J6rn;;4 z4$}}SU3>`i>H^s44wh*ze-0v0=s=a{N}#FB>*r(s{Egk$&x<9Ww8j-pp_g{?Cp0vm zpq8N|FOlw6_(y8;C5e$>2X;k73pWYTv=APJU7b}>6ZG|td+i)c?CZ(E(L-|p_qI{r3tavy`EGhWLGl(N_DpMv)SS(1#zPA zOE_px8lM9#LUeTAvgc?HXk7zfu_7_M*OIAnx|NYnHzQ$dPOnDulDi{HVm@8)LRNH9 z0fGGdS+9SNWt*SMv4m@FCQ-0C320J@T2x7Za#{LWF_kLd{Mj|Q(qlGjYU*&a4UlKc z3f)Yon)x2Xk<&)YMquVsGSTz|ARL;D^MU%(*CNKNn?9}{MO-{%htGEL#&z%A9zO4a z`nDz)Xa-O}7l|pcgj^+=vTl)*Q&aIOSZLwCM)=~Am9w7YU+2HJ$F zS1d1Wh>YE5G{9G)y?Q(Ekg236APpecZ+TyN=)ubl z+<$=<{Y479>-yPNkgirVxva96oEfxW_G$pRltELrZ1a`%UiHq7ac}{pGhq=U`A0}E zj>nBg97+igC1nwX8!Tzi(q1T;k_nVo$&iDE8SNpouhV9KB4Djfdrp+Pn37Ejj5rA3 zWQ+x$1?uBK%$v-urXhb{$KQ7}pTA+}&$wFzOIy}{u23%dsjFybxIsINjYFDS!YiA~ z4}?XPsNm9744i~Bv6E*w8wXdbvJz-t|FmAm3nFyRR3^Suw#aj=Y}Y4BLCUMMr6vRm z-RYUeeB+gRG!LD&=M??a`@d)<^hL^M+hIQwW?;2`1}Skz5at0DH|dq7u~596@Yy>M zU7~q!7NR&`4ZS~rNckU1VLA7zd?2vNaGrqVqb{&n)x-`3aNU^lAcc;T;IXiIWwq}_ zjg8N@s(7i3W=lChg5hn3cXR<%+xtkdE7hq~4V*y{#h$`px5n6S5ngK#f({Z>V(j`Y zx{~^m&EmWoa*$YE&nESAliNVl3{fsC{5-}I1JL6tCr2`ROXCcpqlhz#HYiwX=8Lo! z24)Eww^{0m>LFLo&_r$yt~t;+N^Y;)L(>}pH1duvd%xOn4xYYx|Cwh3Njyh#sQNkA z(Rj|ug=5te){bc?K#mXiQj!%TO_qdGcPiBwnRr#%9IGr;tJ|o?7q}lIlVBBRkS8k8 z;aFGoCQa24kclSga%VMzF3kRRN%Xefoh8T~6kszoLpj-dQvpj(&M^cY1)$a~%yuL~ zb+wD3Q5jIyWsXx0b;RA=KG-0omzwfbpu)&ToPA7f7gwlva)lyi;!FtLNb^U^}+FWZ0j9p zGpW+)7ss$kZo>{z+$&0iBNIYk4%Va`5%K+Xxx zOp}m7BM@YNZw7PT5n65z-S#uBG!)|*9} z6(S=FS|`i|&|Bc^!`Ve|Pl!a1F~(mcPa*6yhdjh6=ZC)?kd*qcj_-_&V zU4+I<#X>X7MOQ1?6e=TgHm6O!(e&PlZ>#9-6X{iadQnLH-X>-~SIdwG5=Jj$v8fu$ zh^00hh<3ri-l2^5oDg=Yu<8qUdtS^*(FUH>jH$*9b-8|fSk*-mN{1|^^D~;WUS(JjG#-XW!lag?%T)O@bVDj z*L)o-QVp|Y_zY?;78kEEXG5b6@hM<9JH5x~CXlud=2ZObl9`8wHtoB}GcDD(<^k@! zenabLUEo-lvCP3m!%}^V-GI!M%j#4#+B?9KLq=n{S7qQC`mWuwH>MPIb=nhrH5`>o zAsy?q#G6rULqFMtSknMf)W!I=rG8Y5`x5=^FLtb;&W7~)1Ur4&#V((%G zw0YIHlw{`%c^7va_MAiL(bO>CC>Duc;s!eepn!CwS$J_OgzmE@#Ps6w6+U~?fPkp|7K zfTI#jswKTl`Q<7?r2fAT<-Yje4#%bK&ym!lYnkE_3BZed{iTMoS7rK8H}4 zlUXx)GfcCPMiDt!t5S-}IY=);n3-5Q6g3o7iG0==*sngXVCF6wtrt+~Xp|VG zZ2RK!1CT!s1QxaKfDklDcNfU>U`W2NZYVI8E)u&(DJZ`f+mY+2Jhu!ebN9&+FY%S<}|FSCVe5_4Ys!GockxfZ3E@ zD2GddsJ&*GaU=RBz4=BLllN42FpgMASS#chAch(BvmzubdT-ARqXZzw#ppdJfC{r~ zZ++{Lx}UK_W&Kq{CfK>!h7rpniS^;1^n8vc&zy_7nNTvB zO^@iMeH&LMLs!n2Uu_bvrat0GMcsUBy@?aGIx$n=C|an`M6pen8C`Jw#+%-M&(8I8 zEcPO_Sk&N_Snok-y_~s7vOCewa3B$b#$FrO+spzC$H0X=FEs4BFwyb%SroI?y`elc{VZ6HrMCs z3{?FLGVyW?Y~!4kC&?rk|G@6O-UaSb3Ze$2xBA{t#$BW};W2p8Yyx4p5`?jlTkS`- zK@^DC6njrmK-$1`uK+1`CG&u)5DAh8AYF}{p1vHThX_5pVCGGqbKLTuvkK(pdm`AM zX60;$nB4iij>HF6pJ10ECJmaXqUSD_#C;B*vC0cWz~;hy{D~rX znb|1VH^NptTM7MKrJtvDTyp;GYs49&3aVfRtS_!RaLBY^(Ho3`HCyFe6oC#KuQVH* z=tWn)W9`d_YuH54nYbLe4`!QW8c-M&N+v@A?43iSeau7KfJ;ZVoB(_3Y8r)dS0M%x`rbR1iuL_42IlH)Ao5yMG|R7M-eV&VLun-oz-Gy zkd?eAzt!;bB%utn0=G;&+su&sDan)&F=lR=jku0HCVin1S0W-!?3vSJvPIi&@XO|vYG z<&&1ndR_pr>6qo!mczDw-b7#Lr622OEEz7zSW3xw*2R@&LdsR7aji`@ZMj(8=%PIl zCR$59m_!!uln=~S&@^swre*~aqay_;J@pk?-8b2&ezNZnoW=l$+4R0PuI6x0e#bd+ zl8h*0P(FpJp)_I0as9@TOa1&g=n;!Lm@o+h>sRzx#Z4Mq<7U&PY0Ak10EuO;^x{y; z2H*jIU(g-91gdk0(A}&GHlt@&OR|+Hh7aT=eubXNy!2$+oS9i4hR_F|K~3E>7m`&ABOB)q)ylXxd<+Mi zMp*O?feMQD-YZJ#DVV_&0-8xlkfr?uMfVhP%d2fDj){5>Ejm7c)VLHa%%X0uUST+n!>Fy9mLPq}G8pL0|R`4xE~*G?~3_FJ}nkPdA7P zocj@6=u1lxyaHF`yq3eud(TR`Skt;Nc9GIsuLdU9%jZEbXH_tsNaAKpF)`bkqDuiub`hKDNK8XQ)u^GWidtt?+$wSKwKeBl@8 zC>x}K6M`-30->Ox-5rb}^jnrr0*kCBX2`hZf&#LX{)rp%AS^I*fE$KW2+i|}uLGg% zL#`K<3t^Z;OmEmQ6AI3C;L-(%r9rL}`DL(5yqhxrQxK$E}wS(DZa9}Nq6KW`a-C8e6&9Y3zhGZbz^`iu{-ewk>K6nu{Q-;~;s}DS|y>swM^WYZXshfd3f4;*h#h9e1*xAV+ z*Ke`=7NP9%49J7*fRaauh7|j?i1AZy> zZ>O+~^5Q*5zI|~Qp|KxcOJ;LT(OUN^9}Y712(L5K7`<%PS+4VKk>`qWd3mWBX475m zN!LJ_pvrdzb{Ww$Y9Dfd>k!sYmBX<|fs~Bl@j}|z7c$#LpbWj5RVed8+~yd?^Y#R$LN-B_Nbo5f^4| zZ)~7?mlr`z=`W`yCmGrg0@=@NU}iE1v^$+lgE6>MO-e2fg(V;)Ohrozz88Z z+_0W}Oji>uF#Cgp3^_AFKBedL>u~+EFI%il7O}$;c3MaSF5$AbrER@<`7%#^Gl}~G ztz4)HVeT!2de{*oGNr;vSOxcQuL>}dabBWhXdGV!4mn_1v}cl2tf{HUD#MJ%+N5%6 zKWZ!!yL0eIKKiBYor6!B3bz1H(F_dNZwT*^UW!P`awa4@nE+slV*|z9f?m( z*?SaM_FyBf4@ZWXBdSqX#0eG?%MgaZ61ps9$JdW4O#X)BFWq<4eop00H{EM@5q43k z9JMNw-zb=w5@326OUJfSS3V4TMA;7{Y|3>gscgehzue?r|@A}K9Xw6@&Fk}5(t0~!_n!OUW z`pUJ8<=HDbjm?)YUyoI$x>p&S;IeQ?SkBe2D@PLW#FE_dtRNic&)O^bk5Du~sw+{- zex@wyL%@g{tp>=4>Zz+?#1sH_N(1>b2fjpbv7Yhn(^`R|Ruex%iY zKc%mK=F;Y3W)R3yYNn-WDiD1gu&8)cW)AFykRgPMX|Ne;4l#oG3=o7}5Gth@Q4unf z;gT#W?w22Y@U8FrvX#)!CeGRB`rMv@v3_2qJ2KTIs4?kFm6ObGBwH_JxPnkb+V;V9 zo0>!rVPnY(5V6$F!iYB=X|O4%>dn};9=cFan{&uDm&C}<9Aaz{6pOZM5Tm{TUXQ|h>7HvS11mqI3t+}1`1OT6Rx8(u%( zdL|i(hqPFau^5vIxMoe@YBfRiB~R=zAkalYRM{XFC@W+l426A`)xr6W+k zDx)`ydw^6<0+M&7eDy|~F|@~}CLG6PYChpk%eV@~p1JX_KlJ4%#QA%Gf?&O zL_1_W>Pu+eqm2pHTLvvt0|T|+B-4cgEjMYXr{Lj)go!W+VxW$&c>?wG5~OYpTG^F` zOll(-5&WQAHIyl=f~c}A`*`Q&`}~)-@-9L$C%F#f7PPk93&`73SL$`UQ9v>wU=>{G zu}PKo6ebsM%6SVw2B_K{h%gCg@?G%tLXjS(hbv-dAl0ZcV6iC-8ys_>F%wW>9oENd z#q-a-dwT@^B9WgYcp!m<=QbbmT>B_NhSgfAP@uwXwt@%A{)W3bL@1?OBWZU zex{zuWYFN5=necj&}MEXq;D6ir74ceL*0h52`r{UJx|LG0@LFpyxe{x)xH|rd(?_p z>!pEDOR=;nbzIah1vLw({9Dsf4RHMi&!1QCVrxQ>HSS8TSzXAK(Tk?bK_+ZcAczV( z^rDOJfgDskvY#0M&@DH1O}q#C8pf+x8PzKk>5<7yg85DwHsw5F-bXaVLBDhG^1}~r zA6xe%=x^(K0cN1;XOcE9 zxYY2RdCIO~ID}nhvV$hQBtzF2@(4a7)HX5d&vDW+8doK7j$s~u;hrP^@ZEP_e&EDg z{Xx)qk6!Z|c~U4244nK%J%lWq#|m>vn1oGXWOB8qW#J3|2M>n<$<})pDbd9TNCOI+ z?G4JG#vCEU(X;IXZ5R*)#?kD3Ct~IF-s}(D?j$#*L7MWZ$tD?y+Bb@;n`UZHhJ_GZ_kQ z$usRWR#eOB{=r=AT&l4odkIgA-I{7Jc@163lYaZjps(hn2PaIHs8gC4cmH~whsdYG-&&oD*;t7z=fUU*Hu_8sNnQ&--8;(z?a_6NJ4IQeZo zFUSlm>SrY=Wtfdzv>TSI>XGLOj534>mW#7r)WB<$Yc_RqVj$*D1PTO)fi_oUqQyY? zOr*(o6?_G4LDcS;G~R>S0gbyDY}ArnvYj>NS~7Vwq#*WNgx0jX2(Qt*2*GCLG;Nw3 zgq9VZl3SQ157XBSC_|Xu<;+2eJqa23S(eMTLXb453S7e(le5q*oKA+8Q+lu@J}x6E zrH!uZSlTEQEcw2)iL5dW>s4Pju7S`IHUJc*-9BT*^K0+?;sxP>ivjcr)z4T~x`LJq z&3enA*JEke)xz=vHI0|xrb+zyfHz_lwN8!`;Lgp-chiS`f>01gc`B);w3d~5(Gh~Z zzijW3?|#px?6dr}x1IUn-@4B}+JDpDBX$<;mvfwJXCWUhk(ro+FnaeEUHkd7U;lh> z{{CRB!Cv@Wv(sAU@?0+esSC|8i~4q~UFpt1bT`3!lO;5zz$vn&JrPu(OtTR37}@db z1p_qImN~NezKemTpH*X&`gut&oDPMf%{_$?W`nq3O2W|FO0 z&jVY! zhpCXu;gJ-zCjdgK>?`7lRQOaFC9l(P9CecJ$BO& ziUQHRHwHpS3Jj#ilWaDsA-?+FeDdo3XI^{vm$zTNJ(I|En@h}q)X(HPqZ+bJ2+6}# zx+RNV<1V2uf=mL>0RY0LnJKIvKG!je>WM~W3B5Bqoq#eQ~NjB`}&1qgA-lhmm3a46mTMP7gb%T-5(g#pc?t4Bmj3eNmB z1S<3VS$4M}H`z_-VjyccwJl1u3`=>RH{1!QETaNHdBveqmwjM+5#ST0?j7pqE(M({ zmg_FpFTSgqme^wX`|1nJf*L3&p_EBhWzx%PZzxysW$kaE2;oE4rJJ%s2<@e89L|%0 zG^?4R4U(CfR9c1nT6-e>hfcipRwp7`3syzH?bb6t`N0QX|EqUdX>Ckp_iK2dwMjrw zM~k?+rQt5_Z*n&8Ds!3EqQyfpBO(1o(CiWlv1;njOo_^vFB`0b9Lu6h#)< z>G7Z+K7adN+dBuJDDQ3kF5C=E_4Ddp5Zp!nA^SmCeV>fwq#{dM8Z_zU@x@Gc6TUgp zSGxv1=rqzco7sNs4THSHZni804MbUuLykijcfn~)93U4_n*r=?!SE)4GkbLAL^IMOkIjh5L{|POA28uht<8E z*$;W!9Wf?7gisQU8pLtSF0?p6?^vD5;k9dZTzS% zm~saPyolpDL`f-h%?t%$rG5tg__u5hQs=shYJUfi)j+GtB?!!Lceb(6OZOf#7K+Ew zSE=bta>||#WXd1??a%&q|KU$wviE4*T3D%a5@hT?pUWCM{+gD91;uNb4>dS{#`B-~ zk+!L0b%9fi61vksxHRyYUk918 zQZLGCWAZWwC~3B8Fl`^1n4`trD4+Z1zyIL&@c9W*-qz^?&%jhalbu3v+9|3B^$q7L z3s&DmQ}hL!fwfXuh2?6OD=kW8)h-%Zm=gx}?t(Zbf@s3hHxam0h%BU`AGld%x)&NB+^fKY96qlXl=USCuT7 zjmOA)BMmm+P6k4K>8l{%e7C8fum{LsSyT*T+J|NC9q`rn>NNvqNCEkTZ}+;AaaE{P zC-)u{je!u8*2bC@aX*j~c%gjlia=V3YMBJwh_ z7@$f@ELC%vyw;bnSEOFqPR3{s`eLxja)2!x9-?+{envJ1!>4s)l5?Cqgk{=rP#~O6 zEM}miD66<@@jbws+lW zRkXccz6R(Ugy?%L^;h5wuWlvCEzY0&`e%#lYq|1)kfm>}_vQ^Q?OwU=?g;1t4$Uag zo*EN6C=7E!`6_R6tq3CMC(SsG>m<$Er@G!s__ zw~xyH5wX_G7zqWzKd{79SaYhM+a2>`W@YKA>K^CKo<@VRy9n*t!b^YaKDz|Ec`P|l z_70&tBX*pMEbObyF5dG)1AN74f+-17Thh#yForvf3#xY$f`niQGYA8PFAVtJIS5XJ zh|(;9jAvLujx=Oj(NxV>v+c2@J#%m<1gZ=N#}ULWO@lp4y6jf;x7>Qt?nb}ByzpFv z&-%Ha|2(gtk?2q^noXJY<mA5UubWc(wo=f{1zr$R9>)@0nFb6zy`Vl~QV)%hk5SNf*>5==K5aKL_oWV8 zAR*W(v|SW!4-0zZd+&b5FMr$)qP^-Ksm$j&HJ(G@_nef*^^jFVrGF)t_YZn8k2PD% z(<@9Y#$1(Hk4Sa--m5jd*rcUtC{s{!pwa|)uM&3$C}Prvf}*J$1_LQYZ)?~r@UE6i zlLM((?pv@qhZ?cuF5s8^cJuHM>8tI@b^GtN68gEwN82$y`)6SD`7?ROgd(Wm@M71b zqmj+PNbXXvAhfX=E|USwNN8+Mg&(|l5>idzdmU>U-?IRgKxx0?_{eL>qIv%IGq*%9>X-t(t+&V#!MgZhf_!JKvdUNYgtnPx*xRI?<{c{eQDx)GesTpw9_&Tb^MWL5%bpfGpUlc2A1)mqwEaW^X4Q*xIgtIsJhHwc>W0&wz;+=|C0M@7@QE&Y|2-r;+$I&}Z} zFZHd*b_Sl78Ca{In|#Q$W3>i@q)k?UMMpDJi2)r+&VzAS4jLv<;AB5SnWkL&95@NQ z$Wv^(*6sXdbY%WKI9kLNsQNauxLUeM>4N}+$~H2Q$w5B;jy+M5?=I$Jj+S)rT=6(c#Y1;x}TlMFK`9sC?Gie6?1utP4Y|__j;#6382ufoJ*gl+}7kIbXS!0 zoyIzy(y=L;Q20<#2=e9HqWJfqawB=UG=Xo(5YfSh%w!N`IIY(yg+WEM`uWPk4_FC( z-Yb3Uu$_UYX9lExCg(HyD0r6P^^Sp{h&4wou4^_N_4H|899!*6{0np^A?BDXNs%tNtfgjSsC2gP_gT%H(YS(tl= zGURS#P^I7-ui`2Z5bU%KWfXeBQCSyVp-ErS2xOhE|35oF+~Wy(bk zVc;WzWkbb4dPj&0q!kA)^g>q}2tnyA#jg$G&Ov9MVO376153%4YJ3-FRW#14fAD>u z{uW#mz2}HMDf(443MLcz#Bii$_8g*_>B(Qsp7LR2$lo8tvQ4&$9GVA~8O|C%)NT7% zw#@@I-efrrP@@2FBhSQ))zx%B=9#unW`!sMDMq5+=QBZ)26YITl6X-=FWR&ErDlVm z^k~`k@Hg3;&4*9C{`mG@kLL~nKLc3=K|WEtW)V2>DtnbVa|>%T%Eu)QA(sCqqL}nhlM)M3nfF)H7VIS0kJb zqxQXb7VXGTLJuxv%Zg<) z;F(l1h}DBKGo)GuLsx;A(*85}&qdw0eb&$g<-{%clbZq5&wl?PnRyl_E*gl)slE&E z8D#2;5|{3iFf|)0LO2g&Ly0}bjQth(@qMD_+z7r6Rbt>(9bI}2n?lsCF%Vpt9QM6= zp;`56a&=*L+|mrmlyceu(<_qUU^wdTvh&;x19Qr?TovhEDwE?HOFrAk$a7 z6o>jyW@1!MAceM)JY57Fdyvne^_Fi7(-yOgb@Q34Zaclbi}3uokM(o#gHwvEh+HqF z)RhuuUF&L>d$Gg~w6QloU)L)353S=e^rmabEsK;qdXNB-HE5z0OYmbmVDU~zhe9}# zQfYugOS;1)^>WOs_OQW5PzX8FOrS<*O*<~OiuZLle##D$ap%SAlF6kJtHX;@d+92$ zXWZR-#@yfh0lz5vW!E3KCq>(J(G|Ukt_Nbt*Iz2LlCkIY8+JXm{f5iIDC1E{M(ECv zO(e7FT`A6OlCNgY40n8^mmx4x43;v5Ib6}8=}C_?Rv{g$_Kq%(2t6ztyt37g_T$xV zJ&*|9#AQ&0vqEm!RcTLg(Zu`VQ&%1S+z;tS#QIU3o>tse;Y&~=wV%gTiSB3DIpU0&3BqtAh?V-5 z-oW9q*&%uKR&GcJ-0tkXK02#fr>nb>GozbO!yE)LkiEV}N|!JjGN)tM{*WUV|z1t6e z|D%8ZNh{0kmsRa>8$msK$)WKF86hQPlDWmuSU>;NcqERXsEIEvMX2tgYLQeRW1 z*?4Fi$KyR?3I!Kzd`k5N8#88G!0=ayv6PaQ357Ws6JWM#Q;zlvUq`>?hU5SGgAe$F zphvm`=_L&oc{=?hrcVyopX!pH;&pb ziQ8R@cCB@X1_Q)<@_&6WgjmVv@w5p(elv0(fYz?*3H0_kQ+%_Vd2y++UR)K~<^l zZ{2m*KKtF%`~J>;_CD`D_uR6HLrR*w)1}x;CylFG7+P+);6y-p{AMs_5l*`Ur$DJR zOclo!mFA%_>mMxwiH$cMIQ81QpRgACQihvt?3cj`RR63fN7^ulFJlsdNVH__vJ&K> zNC8#HwoD9lQ=O9R{jjC%B?J2{>7DVg*07+^7sHF*wJRe87?=}L5qP~Y38+E(C37I8 zq?*kN$!3T0=hN(q5py~gJ2hpJb?7AwrpP3rO?Aopbm~<_)~tyys*|vfQ|+VAAAhI) z3YcM6VI2@J;5~{|fafX<76xVsm}J;jo8>UxaGi&>A5tD0sG;KTj^4HF5_WnhipAs< z6{HMCHK}<)v4)nux(tbng!ge52-D#ZiF9Y`^fD1y$hu0pMf%&i+-5do(Y)Hm{pvd>IOoL4nXlPU#2_##- zW-;;SAOjx&8Yan6dI5(U>28fsA1+b_a9vKRPMZkB9{X(1aJGjzTgU5YvpntNY-bV$ zF=on~EHQeI-xO^x`{C~&`Mrm)+4sP+_So$l_^hob#Yu*TAfmg54CLu6)phB_QAScm2ticuQ0>tc zD@Gh%T9{F}B#_4=UvHAdT3TQjLxeSV8x<7~HA;!S+xp+O|M6QsxJ9<}Mz*csg<65l z{WCGpi2#}A7z8PJI?erx97=R5M72Yz*HG6B9ZK2(nKrY!rD9>ANluF3ple<6C>yyn zMGH;1{b+a5j*1tT8JD8wl8r8%MkF1-81G6=CbV$a%qmIbkbqMj8sT)6^&G`kRYjXJ z_3!YuyjJ6xyYK(rw|@L4`xYU8i*P`^5$Jr#uypJXLq1>=FbkD6F@owu&|sKKXx+pd z_~H>ZVS)CiL&_`(066(jq%Y$aC%^PJTDIwT>7iEHw4xKQShv*$gkQdwuPlP}1zop) z+M4H^>{~Y5zw=yy?4RxTQ{s9yvW7`C$MzJ#Y`?sSj|~au>}~e=5+!3@dT%cj)7_O*Aj|+VYKL^|5*q`GDd2=~ zAYY^K(*F+O8xtGm85Qi*t+7=F+uon6}(|RkmU4aX>0*n5c zsN!e?Y%KV7oDX^gpKf%yj{(J0FFSGQEoHd~x&RICFjN8!eQGf1*l2CbBer{eY!0oF zP;182L(pJSo-!l`6%?9iN27HYgN5GMMm8q@%Prr&Tcg2Ew@`?v1&l=d0NdflU0O(V1%?mk9jLy< z-ZZ`#HU2`ly;MlPeKd(tu?W+`t75~)pk2JW_AO1-&PmIZ*<6j-gM#H@cMGN}&Otqy zV5|TR6ULaXKFOBk9Z&TQb5EnTJJWcH_|AnLEX~HTI%ybNdzV^P8e=yW4&!ia-4A z;j!Y#|H$r|&fibL@43)y5a|@miX>Az4m(tiRy;NZ8yzf!o!ZmRIS#wQ{>8nTyV)^$ znneubJM5PiTh(|;0I^DiZ%b>d#%J{mW2M7qFrgANt>9y*A2C#t6{`IE0z!j-^40@S z{9hm5KDO@C!q&?*TJ+Cr&)*1Cbm%LhtHvfEC882DMI9&_zkw^jRmSJKFjx?IM?X8P z0-@@IN|iY>DT$C|3f*bDZ~(rH=Jb_An@LnK1K&Gg?mqR>nG7Q-n>LzNCTf;zsSFOu zSsoh4UkoEIbHL<6QOli{ByB!@_x-4A_~~tj>%uxC3htubCBG1oFbh5pl@L>EcG$)TO-<10)^&9bA*6~E z81C-!6F&GzMo+*x?RCF& zhkP&E?y~*~yD9q3586hw-KAD>c6gju>_6M{pV#)EI|jL?M!-Jg*XA7(g=@o{b0N`_ zbt5yjjH8LYZhu^&J}f@$6M0;PYXV0Sn-7)ZMq*G8d2%KKroe=+rSTZ$BIt~O&*0dJ zvFpCGzy8s$pI=IErM4?@L04e0{|rb`cr1_!cmzTgdP|Ggpak908c`a+E>I5yHeuBY zW|e>fc{ey$mZ&w+T|=Gk^u9`j{j370HKJJ4EWa(xih~}zf?0LpD^q3E1YjSMN>kUF zB@bc}Lvg67620QW|$>} zj@ZtpKMnE?tzCl}LIqk^v_!W@>0P&XRwZpB$(Mp6k{t#oBF5Vz?TBtyC}Wm-E+CE6 zO1df4-Fer#v@*O>^yb-K7`3?{I(@_4k6lm%xpbV5{qyuukvCWV@~qLcaymFnmeo5Y zFlz63!2+3bXz=2BhoRzQSHYOocuVG*3>&}H62x;0lE^T~_i~gT=~NAtOyZ#prC44s zU^NP6pWu5JH&O@=Y zOtdO5+_-hob}xs$e&K^p{HWa&eaCUXox`3K9eBtk0^$8Le!u&}!y~CPNM;;;X&Tlw zcp*UTHj9i!%NZ#_x*g5FY<+5p!eH(Oh{4ny*C&^P0r!H}dP;aL3?^b|fjI{EIJs+K z8{$7V`~P8flcd=R4wk~7sdD(s)PUP;s~jRsY@!*A5->P%V8NLc@VZU&E~OTWpr)v0AFbM_oc1lk_+C$--x3}hitF2a ziG&63g@iL&lCK1;!GaZ8`O_-0fov&rmGsk2NB`_*E3FjYUo=yjxw z*K?xAs!`E)k%CQq*9n3joSvWx7+tzIA3pIKdlvMeuU^IwcHUDT`{(Rqqh0hYW8Y{w zwIQt>Ndg&|I7$#?+?t?7sTlNi7pjWqrYnn0a?P^fm_%NFtNq4Re<2&3Qf4@uFg*Hm z_sb;$vIV>>0ly>EVD{S08%JOM&d=Bv^x~}cTr;B2@H(aI+|K;1`yA?=uYKLlJEVrG zCs8)z(D$Mb`(E_*A9(!x@A|aesAfMJWjo>AHo?TF{<)({BNh$2Ib}9ut3%$r z;e_IY2*=9-lYv+Z zdxh!(jjI*TSBd%rSr%Espd>AG$BZ61L}7b$>i6Dh-y%F|w-gAG5I3Mkl^{BonB=@B?X$mNYxrjm3#c*_O~5AW4A`X z;=PX=%GpEj?YW%{)uw>{*?)hK`_IfZ5^k0`m`$nm=K~IyFgXYV>fp;{Ij=!}6fT)u zmO30=P^Db7LFFJA##UNf)t&`qmMX%*e_>V^0XK+4_~Ot|ETV!?;NYnnKXk@g=yT`t zR${vX7sCp$e_k|TfWC&ug#d;Ug{nD(mO>LP4BHn0`>Z~cPonA+bq8N8B@WSE-O};^ z=~49tjuarPAd4aPx(sIaE_J7eq^wYp#1yvi@oM#XRr}-PDMC@Kf;etxsZ-J*rbG8` z(;rvB_GJ7M%=i`|u+%$J1HAyZ0Vf*?fsnO(02qW;DXyR>#At+CBv_=HvnWzAWKsFc zcQytAk9Oo>7Wq!sPDDYZFo|-FmOBi(&D=$SeGy){;*e4ETNYSSIe5w*1Z~ap%Z`8XVt|v2ItKL5dvGlr&26Q?N`fFqq&uYy6Q?^6gVshIDRFE_MfDHuTc%D!FImo&B17nyEq z?=ibP|G~F^`d0sjvYgMF#W>+}G|uoE^)tWnQByc_s;nVRASN!DM7W&;H$}hvU5~tQ z-|_Ew(-H6LW8(Gvy3fY*pBL`vy&?(Mm4?H`ujr0RJv!w?is1>OtbrS zT~$%~97Uuf@k%jlYot5YCXUKysdGrOjB44$YNqU;HwG4pJ_XcDEthJCG#uHs%n#o6 zNq>qRL6U?ap3#AO{@ow&<2_3NAhF*AQANyD)?l`QS4N9TYp@fC(;l*DO_i&nCAQPr zk`VixX3i19F3>eSi-iq|Vn^bif##4iWz)%br^}$qhn=<$t!9cA)!X&K)3@Dq{9k=+ z+dnI=tubAptR2%QYg(NvaANu>fESUB1jBg)o?LKNxn74Dd zpD=HyF;8Ycjq5p?etPGPxOS?umm5xdrT{Gj2RTxi5~vahGV4YcZ4hVQmHxT+Klaam z>yvh4_IJMNi1*L=`-2O=M^c^SD{sJ6VV>5O2uhxzOt9dA@mP$?wqKD@cbAg%~>_6j8_y71i@LPn@f=;jr{Hqxu*`3ptWrCEEr^zK{sM0D>h;<;zmNIdOX! zjey{xi|uG+kX&E|M}vsi7C_OF44uk4AXQs5BQ=7V*2s4GDve}2^7h%S+QSj66{_G3i^5Fmc#`}%%HTd>_df25T!L3RLe~KNs@MyPZwm;6bTNI&>=TFLS=|e&k_s-8~f+BR_b9Y z`tY$#IKTb{rloWn5dp~f6^%WL^XxAi{KmzI8{3$+E3jz=HuTR5t-67kIEhV}Sn;Qe9iL-G614rg?(QS@j469=YTv~%LL&A{6Fvs=lOCy_U!Xf-_CZvE3W{YN3~QN|DoV3j_3tBQ?S> zlsJ6yhC^Sr7J8@r-HvTn;9^^Wv41ug9FS1D-;s|_EI?8|K%`6&*{~6Qhc;5a!(sxi zVy3b)p9@o4sF2EqD=Hn5>vfP~OKaeWDT{m#o>~(@vm{cWN)mc<8@=ZCW7kIfyfI_N zRBH{3Ah8X6TA00?qeYosk*W1GJ2rY%JZ9<@_8SNOjMe}^2hsrv`BNbIQ7N!-l-XDm z)`S&)q1am@z*vP}qrv36jLsi-a!6+3?v`ea)4~fE93`<71}7}bjAZpfS1&rcmtLAR zYhkKOT^Mg@fp2?N5KT2WAEe1H<LQN)-wxSH%&gQ zxy*21--^wU?8T8VV0KoaUz6NK>kws>a4+_xk+7g1i?+`TZ1?5|@890Su^DI2qkm2u zXn4ubWyoiyoRd)SOyTNL&#AjX;GDoX;u}C_&8eb+`Kk}y8uvB?;Py>7a58B~Ix}9X zXdJs9w`W|~HwS%RmnV6hw9FI|qs-cMuBE_ahiOt~Ez1UIf(o@-zA?cvEB0L_LtU!` zNI+Lj!ReA;$b(31f<8yOCP7mqbcjsTogCq?-f5hK`=WZ#J*2zD;SSplF5n+#)xGGG z(}j_oPQ^fXW~Y6H{q^86WdE!Kr|jDQ#gA>jIk*|Swj&qk3T*D50hNM>xvATn>JPy& zwCo|Yf(y>ot52C8?QAka`+@ddN}6wW{!aa~g@@u&0eD>qPTSlxkzs1t&zlxr(-d@l zu3h^okO|PE3g>P-eT_};q%t}6NOE4oKQ6R})l)l0TfMvXj^p;ER=Zy@K)7HZIJt_4 zWELc@R0_%v)x{v78(K=wc3dS(i9$5+e^7^U^|dKB343tSt4Yddh!uE3`L*#NL$c>vX75?4u3 zjGTc$r;18Zg~J6_F-DU=la?^(@88nAz%{W=4YH=1aSx@aZ zWb^(Fn^X#Sr8a|9berSE-Cg|K(b;MjZNXB3Mne;maoGfh<)l1-kfGISxjOEhkX-XyH#P zMHK}WN((FmXf`cSi$qFRC0b4#0w#|}J&0cLIK1`16LAa2moHkdxxj(#*grE7?EG(9 za&VbDM1Uri;Dgl51VsNlbkVIVzLF`r?j47L8x`Sz9+Rn(i9R_4=$=`H>q6TnK4>jM zQb|}S`MfTuLw97f{Y=SEyz?{m3xIy+&u4q(yY^Z*^Kp7Nz0fUFmRXrx!v(BcwnjI5 z-LzBbiNo=oU9ksQ#*+??_lo4J?!<&JnIuYOScecEJeHWa_POhGFB4ru*Q|{O$2kfR zVU=7M6Y(L^@s9|8E#_#4QGr;7O-=}OR2gL14;P$o`Z{#lQ0t|S{M7{phpqeV3j94* z0R8js`w6E4fC-6;lQt>>jmAq{rNJbYl?C7&z&@MZ5$(ltHTfnV_S4RIXSK+8z+_I- zfradcW3m(=({#zC9VJ#qvnU_8TR8NRLA6LjJ&jnO94{TUp&Z4;hqd+pT8swa0{&{1 znv}~dS_O#NgX~_S-y$4fGiq4@W&&~x6!4k=n0zl4DGgSV3dT*00#pHWIxMk7X^iq? z$4QunYw^GW-!tH_KN-i6F+0em!SN6}z|@Vq=yWAqmCA>C|9y?Ldq<64{|nD}z=oNEmCm7Iro%uJdIN)&w{^al}OKQJQM8 znnDca%G78dQc;Lu1xg)GYwH-O>nqb3Ws+sT2{D_O5|9DE96DwfS@#OBtbX&g3Z&_-s}gOBLwy7$L2NjEj*&8OE>o zKTl%Qp|6P+uT7<#bE%l;;;z*#<_pUjTe_~za~rbXJ9w7=7UAb!hg&!bBn>$mW=ABn zyXGeF?Aqs&RRyS(Hl@mNNVk#%x4VHHnTFDMxquiky6elxhggngB%v#`S05gdFgu|2 zT_me!*?dKP&AZ2-MvP7|S*uB)WWtNf4?*5@`sTY{1STZC)4EB$kx|DF-?%JhlO zIa1h?BJT>0cG~d@GR(L&KyapfghU)g|Wp&h;XIU~_(U(O28DrIaTu5UXMgd) zU#_L=mbYDji+%;Fe_jHn!(&#B>Yod%9W52Eiw{Ia6-as-S{4_WDo1X)O4Y)GS2wtJ znMM7|p&bINU`(>@RIvz7&eUfoov;s~2r>XS6}#V2GSXVwua+K%6({Nr?%(jKMY(ZD zLEC#7N%cDPrG}WxWB@Kh0q4WlhIfumwU3sakp9`^pB2AFXx}2V=Q}lGNB<1$)e_)% z+b=0bhO~GMWlr!JS}9Z2(3quFL~)GI(b5_?9Y%-biG4N-Jbg`jW zxIuLU%W8jZG#ybGGCYhL6qa|Kg=rl+dDGpt1%39qquX!dtN}0jXZ!u`Ax)%-byVpq zWn>L=XGoU80t~L)O3}In0&WD@)tts04a`1uLQ1-kYUxv8BSI!nn3!p?=Wny2$f&|{ zOkeFw4-7l4j#&o;xqX2h(rz+ zVmgu`8YIDBz~NyKIn5GAv_n)TM#U1VYn<^PQKPXSbsso&51x9>!P7T>X#3c@HL%+9 zE{PSW{#iki80gHz`2_jI$q9#NL|v;0RWFF@>V>ouS{?X(LsM6Nq4W@T2_Q(ki-1L? zfdySrL2OV&{~TSVM|Hlh@>0R1qFD=$_0N6_N4yphmY0|;owislg6)i9)Zg1tZ;|!Z z*-++K;(hKg+jb-*V?Ni+`nL!lU;h?iL1@BwB5>8L8g0}y%p@~~t6C9G$tUWPlWl4@ zt3dUH`lu{pB!cj)J3?q}^&sIWBZ<;82rr6J2Ufbq(TSkx9n6ZPs&lfqHc=HCB%z9= z#ez-b-+lDapZwU@x3_Stpzm`3S<}Zm=lM1#q)Dc5B?u3ZK{$*&LdV-6qXH=gRB^wR z>|s`Iib0og%cHQH?W_+3(8JMSS{Ru=Q&Z6w9F1a(WN;TUIyH~5m}V1)_Sm}byYmy) zR^4)_Qo~NvI%z#y`>ZY+0(w4o9tpOT5n2NQOh{%MFYl(+%tn&Q$e=z(GD~t4@$k?H zon7(e9%lDGM5{9@d5bnM%@+;Ac?bbcN92bIF2(32hG0#ew$cBcVOzkx*U~M0OY??huHrA< z*cnQIVlRC)Qx$>C#YuP4`x!?qfc6`Pi|<6u!bZs-d+DrGIa$#)c~NO!=@fMhJGb84 z$}|^;X56&w(H00p%{HwS4J)6)L{XNBjC1MuJuuz53U$n)y>Ljn1142pNYp{4kvk@sQQ6aow`0W zp4cU9`~h~xjH@ASN?{Y$XrIQ7h|AT%<2+jXrOIEY1N!JCX3-InA5P0-_s`zJLdK03 ziU!9%>Vh3laJnwxg2!6kw2!;WMPB@-9T;EQH2%U%b1($&^cObBA#)Y{l2oEB!z_qG*30AKoB<&U&sJ6=_8Mm%rfvKE}< zEHp&vmMjb8#1y=aq%iu!sZ>peFfuSry(~mMrTr$dN6pVzoj+KJi;mD`*hcJp|1%}w z#ST$$orriS0HO~^*Ho`)eL7Qw)HOb75@0@O&(ZI;ZxJ3iiQnW3cq}9&9yTNv@{>~- zn+QA|78=hVbW*H{24SesepzU6o;a{TEh?5}4~+CCg6b;J7Xn$Q5Tutsh)tGZB!@yp ztu0l`Y0o`m%F8**+^+l1{^XJW`w{`5Z(*3#KiheZS0+fL4^Ms&dKk245SgwhNtb+V zGSntEHxQ`RgkK2D_Cn!U3akwwR1;_;p_Nlu((a3(juG(kt4p6mv z#$_L{c^_~k4#$h>%Ov%3DA zUAl&M22g?ZN=}?S?2usa)xy$`c2j%I`fj<6q= z;WzC}vC%d7;k`Uo{jHETPPuFjl`aj=r6em9Rn+)O3_d9?g$E!q{$zu9ocOi(d}G(H z?H2TimeoI3BE+?SB9Aw;mI$5;mRyVU8B(M2-I&T(8ZKIZ`CfQs0+4T+GV4Rp`nr(~ z!MN@WYux}ZhI~t*cNP3%yoC`40uFbc`*j#}#E_f{(v}OH72`LOS2uIGYB{B`VQ)XFsXO@LbPh`mtMUBLS z@xoFl-I=SdL5H2r?nz+jmjY1a;U;UeKbpeCSNx{@xEj<|A|(r#I)GU7I5g1ynfw0y zC7<0swr<3z?a`&R0_>j)7>Sbrc64G1@?KmDT2&qZOGK^GFq`{$VsdY z8Dpa5WB*Js5H29E3`4@30&~|juO?uj_*4PGs^NzVnTp42mdamq`|-GcW8B;>bu6{Y z8(pS)LBMh0nh{in_ZXtC5u^t({ztrXSlJMJ_MW3ZaM!1-4(7KA0gMHJfwXI7i1?YH zI?2?b)yISN*(ETR?_q&O%6eUIcZ=EeDD7j&%$DVe53`|;y1=HLF0{(eMa>o4va8S( z2}VxBhLnb6a1j4s1d>aY(E=wv$3U?lZaRF*n&*G})@}bhV)0u4jC9cKAgx(5F?nd} zpqIjwal&%E(|pcl8u4Jdb#IgalLirU^t!l*xsB(L*^w)5RWuskOmw1xr`9Tyqe>7i zOa**$p10?y-M{h5_kDi&4b#e$Jo$OTZ#d`k45!$VaD&+!r_D;tIXlz^?UZn&c3;tV z&YGlNrM4o_CP&>hzEB+T%&t?b5F-vV+BJjb9rtVu;NX_)1+8moL+b?1GqCp;#)7E@CadQRDR!gbEX#x9A5uQ~6 zys|tY=Bj-rPj&UKepQCTF0l95HFx;^&)N24!7()rAU)=Xp@RhsNer9(dTiXn8ns#_ zDmCq6I@7y-gWjs`t3U8qKFBU=L_@9}3OMttD1nm>_-s=f|5*sAYZjJFas=KNVD32V zz9>U%UsI=;ZdniNv_pb+gwQZ_m&s?r9kaHOM2L`5SE=Im$%Va8Zbt$8_8%;(2~jN zn;$Be-X(T<55_y{8ZA^DgG4Y83(44*NcC)VHDIG@GcDuuJCCX_|0fmK0!|`$L{(F^ z`@UYd?}1l+;BoDrdH$n)s?*yqpPe30em~SxnzTZSx0)k#aGN*tqRfhVJ4%_ffOyPl z5{O4-7@;zyP0efkNsNa==zIf_*V!S6olT}-+TJGE{) z6nu}|Uj_RV&~>Pv{|@1ZpJGA4^}pT!m2Lk#pwsr?Qe1)PpRe8H{qumOwSD2>FI_Qc zhumU1kOFKS$xV0_r31zVs~eC_UOL;v@TFv!h2N5iYEtfesHV`yH*j>OGcEI~iN`(I z#aH7MNlqCtFpMN}eLOtvpJ}JW%7{5C6^{*maTUPHl86a%3TCQbT(MCm{LV|4!7S$Z zJo_Gye~a+pcnH-DhK`WH#sJmq^pZ0pe_?OHZ`P@#%SfrLTL|dJkiB~qa8AdN%rdeB z`OsZ2bAta`fUOHdVUFdIzH!uPVmQ7u=Ms%FXri)q3kpUYz3 zm;aRypR)3F-F@5b9RcO)pYv=-veY@BiDOygFYW{6=SN5}D&i2CD@+Fp*m0(Jt??ld ztl2xws+i|Ea=&~<`qTK%MCpcwu+IQMEY%r2CCTxytAD1VGx4gG;gDOXNs(zkn_~U* z_1Qn?IXRs3=)vslMP@DD^JFGJ&hxYY8bige3(0^88ZY~u8Z>A`==KGErQuGlRlR7J zFM5Tj7%;RH)&R!D*Nk3Id65qRgfV(FncOaj`DTQmT{6%n6|s6^YIRJ#?FGKT)0VshS0MW5=f3fi4U&bHj*SVMRZXG<5GPvzk_&V#o7p_q zVWBZvbk{0J^e8cy7CcUV{SY1z)o7%JV-&8*RGZG^9<}+>a!~Xf`4o~*B<5K1>d1>` z@Qtb8ADnEm4tfC6Kc|>P=$xv*W|O{1&@xQfA;nw<^>JJ-sxVq`Ox|{rUhLl@JYhe= z%K~AAz+Y$xfslmI2{3`EDU$^b>JG5+1#?ApmKZ0Xo9~Urtv<;VIJ-f{Ln9j4q!==E zJ?m!hVskLn{H})dKJ7>|7!b5G@kPC(GGT;GE$7sZSz5^d(X9tg+ASQm3w;Sf(l;&S zwf?!!d`k_!Dv^!jxf2)#8Zw?o@$yk2I*W~2S}sY0p51JiJ9%M^?=)+i_Ekn=blja5 zF&Lp%yM_$C8x8=0D}MDg8xctrTa9z>pW`geT;{1OXLx4oh72o5F!?@qdx)AdjbB^fD3F(tpH%=4snJf76g|YxrBW z0%yDwuS=MCDvpP7oKB`{n2DwLUwPd2e>BX+nYLKph| z7kAW^rF|*3Q*j4^@+2s%9P>qY?wT(are2nLP5l06%qv#Fblrv5*|rJeZnh`YYtE3u zbxtK(t-eb?%d+e3(sox?@c+67OwT7^1gaD>*4b`Cu z^VJZIQHm*H^zudd8j3saqCimBWNMT|hsvtAtVFBru6kV1EK;1N6O2TOMM$keG1%Al z7)meLXP!nUvo&h{^Q-s&zuO|!NSgig19paM9t9oOzsy`oJthS%EtxWt1$NFU?`Ys? znYd~+j0@J8q(@R3S8H^BvWrkz|O4}j& z=i&YhIYrSib~4rwkb&81MD~^;u%2ahszV*;d^FE)IhZ8uFzHH-&O2JDFkCmSxp7yF zL$wC``A(ZVx5V-)pbkxP@D9GH^k@vVya65C^76|7hD9h}#w@5= zMwKg*_9YCP*Q_P(LcXn;uwB>x^!Dzu2Bs}_DX#!-;n;V-?oHNImC<&i3gEe%GH**|B%W~8f>tg|_<=*BgMoMSj8e<-`L zJ`BKJ)Q-0?tss8?+dpM@1=yE93histqYyhwfS`JFMj1zY!Zl%*93zV9k}w$W{uuun zYCaT8tc#Zj`yGI4zi8SIBCZH(i1z2wFuGecYr5-mjF4<-7&U_us?&^tM0^N4@F@me zKlD|#DwdyR8~vd(+fAMUmlylb$d^uYWPyWKe&W{2(g`~ze(@`t96dUZn9(#?sDkXS z0MusXd+BCUm)X9oHdDxSB16g0YzvRpY|0*FboDLlbLsdw_X+?i9V#r;X!E0gK7RfC zAH(xEcuSI==aF$Z^EJnd=9$0Djy~ZfQ#u{iuFzLi)CFls;!tVXNgnc-enq8jCXw)H z--rrk0D)ra5_P^S4APXiMo5D}6;tEj?|{H69Q3#=J|de>2e4BYJ88eC88fPXs{!NP zr*AxT#xCuD{13MujSb+mJ-Ad?Ao}NLzvDjZA%Xlv&LR?2iL^6jR&|*9h37Ck^orqY zHfVOrRJnFo9%xaFwlHzKTr`Zs)WnA=Fi}L*BSzUe!gVsoFghx9=25~>k5WG760~=} z-i_})YWHv8#|ND+Rj;kpiWz5xIjTT_;X&n`@072KKP>O6x&Z4y6u;fVan-)#KmUIJ z7NIw&im?Rb6{biIxH|UFrWm7*|HT;`O-(7oU;uPcn;|fm9d(RaXbVhzULl^^kF~ z=%NuDwNfl*K_&?Z^PPMW94eTKWx+J%9bQ^EhOB>n!M^C9{ZcWqn`bEwc}fRA60J^S zNXE%;e0}w)zO<&v61{FG;10qz1V_`26Xn-E!m@%73>Lpr(l|aODM@t-lQS8?ApnOm zoCs~gjx_TbKLaj-jw&tJ@`gY!4&^7Y`7kGie@7cPbw&#n7-Yb~>*<7vCjUcC={p?Dwr(t>?JC1KVG(i4jEumnc4WssYwDPLua z>gc-52%;M9+!M)eo*}Q>FHsQdM(zyTLxRj;-|8v4;wT5O?_v@2nmgF(6{Ad;jnVM9 z)BVrsD_6-B%_HN_7%Cn{>%1@@-=C^j+e5U@PGmzZ|Qjprhq0<<$#Lr8kecn$7YYqEBf z)0*iRIi0SV%2~hy`t727D1!;JOIkToB;}g_1)KHt`_KHq{a?K>sB#f{t^RpB+lO-= zAG=sionPl!$>q7PW=RuXjFZe2h|4UdmL+x2bJwb&QaD^VR*ysLKh%PnDL}j zV2N(^UJ<*>eovBDA0L9w5{~wa_x@_^~h`D&K*hioHd9ebldkyO9M@mv93(WR{Y} zZw#j{36r50(7M$_u^`$`S)Qj4c^{4TTh&8l#R5u68Ekc{@`m;Ek|?Vqhc_0O6nc9P??AJS@5iVZm>NtgT;H1oE$wEC(X9DA>!DI^?bYyrPc z2jqIR#c84fRy$3PyV=u@1PuE0*Meyy;&d5<=pMgf?=e1qV4J^BlK%I1xNlQzOlq zMPlfmCkuKwR7{_s?=YJHo7kYeUlpz1!PYP+;DlGAnp!NQPMOVfN{RpthP7DO8Z}NZ z-7Hs|94a;;|E%F3R|egV)46DaDb+2%&)swE%G-~LS<=wPszZ(Vw zqb|Y@C3^~G$2sb>EDTH&D85b2s?|##`TA1`s{R|M(*1K|MW;+;mL`P{dH36?r^1?6 z%4aGW0h%0&omUE1sxH;rPPsToFp<$4;<2R|R>R#b8fnImMB?O%q-`eT{Tm;6ES~>7 zp0RTFW-8^mDk)QEFVE`QRTfhwgU$`YFdIy2IYAD@RG5*7Or{>Ku}c(nzu2d)c8{yZ zMUq)*#Kv#iQC^}_cSh&BnPhmJ4%3U;(ZC2zrJlwi11ws)riFn>Ov|~rK>%R>oA6)j z@I0iG*YAJmg%5vidqw}>fMQ$Ki*W_M{UP6{dg1Qs4-0aM)g&DJ*G7r4l$;6P6rnqx zfz_$2{3;(XG8vx^T}F)Cp$W9i*bq)pL5#vAx`-^Q$z*|tEQ_n<%q-*n4Ytr!1TjTo z%r>a2A=Bw-b-pTWw8*E&UaN7TCPg{C%AUfJ-y%Hy%ZE>63xbVe)*YfN(R)ciCf~gh zbt!@HARrZ!qf49033bHdcbJH^4l?A2O>Y(slOL^hxfD}wR>erWjI{0)3*8PN4m&og z2Qi3wd+&wPnM*Nn=tTvbX)330J@CYj9QpFah&bQ+n5uu)tnnE9q$P8)3J7P@t7Wd_a?Pew7^zhTdR z_OBb`yj?v-=hHQE3aMd3=TuSkReG5A(Ee zr~cOCb_Kq2A$<2i&8&S6}~y9xY$s zlyQ%Qv=MkwriRwsxxqXitbe|G-vdAIzeN~Z&;pfc@C+(h5tikzhk&=hYN5N4CX5?F zaHix$Oovcmx2dL<*2K66kDVo}0^=4F=Q2-Wa?L|^y24y*uuZJA(hC%+&cm36M>tGp zI_!13|qOP4Yg~@Ly7*me|D>)UIK!GJO1v4F*e5oAg z=VkOV37_*YOeGrh%_QYQe9`HE2^C2*$m;A*W)EaQ}gs042e<+$q~oG?C_7HRuZRg_@lq@o#*ZCWLqeH>aD=pv;W-#kJ>GQ zSMNQt#Nj9$-B&AGnlKLur%MaqKp@_=scX2lp&g8Hhy)!uC$?2{NDG|OV~0s~4bN%r zEP>#L?WoRrn(MQpBMZ!be^8B&*32*GMWQ1_3=&U!7dtD8F*@<5!}cPkCgzoUkJ`_9 z+qVeuv21NYXX8f@9tsB`)M4KWnN$!AffKNt{d4lA78r+OA=xOM{3=80E@%q|FSo$a zRe}NwVxAfWMmzl}vkBlu0dgjS0!GM?H1IvOw67{kQ(c)sTl4(uAKmWxtl$4Uo#c6# z7s6{_g4moOG&Lj_`{w|MVdy+e(WVj9CEn_&(whWm!M+r1G!ID(MnpjQO1ol#UK+f^ zKdAEOZ^ZsHb7#&zJ6#ti>YOzupkg?~Mazv(0vIi33hdCPinWYKy?|bF=%pOF?y4{) zefv75Ocj@}?4~YcCTkdl1xy(Ya0u5N$F-szn8IP{&g;yOQf&O!OrvTU#uAK@Z}o*K4y{a$!X(73fAS00!tC3olzUAPl*Z;v^+A~)#cbMC-|E%YHWlE+@e-%P%Oob(YPMwhg10yt{{TvH=RkbU6igG5}#7cc2$W#H^45l^DuYdbDp1R0&ely$9KYP|xvSWr6sK6=@gDC>8?m6Y>**SCLtO zn&6Bt%4xM7=&3v{%_;}9h18Cs==fnVQzlz?gdxFHOJ8Cfa>AHxnRP9gB_GAkD_T{( zQmL=)vlU;J8SLZhhqiO|krTiAuCH8@kn|)5z388(^B;#~I#F4(bE4@e)lJv(&JLU7 zY30wBA2^bmYG)Jex&>UkhdI5R2c)EA7-1M78ZJD}^;fIgywsgtfYc%PpS^$96JF?k zdOXsBL&yT=$aKiNAShr2WX5+UT{Yg4ywshH>!HyQqgiT^pbR;ih{=c_+RFIi$kTW# zLN!7c24ehnMr=3?X`T=#F;7Oyqb*B=24ol;h+fd!dU$6OuCskIbkeg}MV` zuQC6|dI2VCOIxq$7V6T?rU{--EJ44Bkx|4h0CC2qJ zB7#{o6((8nU~xjM8UqedtSk?uO&0+I_}AF-dgZmJrkt=Xpo@8a+9L--q4v3=+EW@3>gI}Wtp7AqJQzT2o3r=YblUir4 z!GcM03O!%KOT!0!agDd?rJ3XGvJiS5WsT&y)GM-JFg#Gex%q9VxOroWIa^MTb zl{Nt$2H~ctMWUF78;M9UGz7e2+&gDY@O(@VFVEe3xr4fM_;TH0YK)LFj45EU>b@qAQ zaSg2SKr-EPiF`fJ5i>E=Wl4JVruTj=N%zTYFtAGZ+3*P#q@tlY{*Ms;&BLg z;KPfw6Bxa6&r$m#;mhCY-y*yfI3GAkeD2@*axASvumEs0icuF@X25xr31YPo1<0~# zGlG17>zX3KIt@2(Ufvub2g=V1lF+3gTXUj>L3_m(|onl&QA=t*H{O=g~K zNZLK*);z!N-X|^yq+BdcrGJ)8Dfp7K@>4zYC1J-nRB>W6%2Bf9-9pjbg*IpMTaHvf z_nDD~1VaD{Zd&ODit=&lz}expLe)_BTr*Jz3U8Lp1pZB znx}DN1wp{AO{QQC%*c^65=k_>C}tWgM|0+uwK;gGW7OWuT86|!CCXF_+bAu#k%BKu z7Lifap;}m92T0ocv`UC)%?={bD}wSe03#yF)tKUMr@kP!-hIaIAN%#+`rC^I2exr+ zSKyns0=v#$vG#xy1?6_nV zHE4Nku}V(JG7dH)+HtAHZ)s(m8{)wzoj!Z_k(b{2@f#1=w+Q362m^{6y%$(IKyg7U zm;hm|9SO)Krb9^s`C}t%#c7Qe=0`Y4`{&~m|Iqfr%nFv%9t;no*`x&O{Ekl-Le_#gORm;W&y+5YyuRnn*Dun>fq+P3d)ZN z;WxCzIEOSm(y;6@0@u_18or7W#6=p6%Q( zpB4C?xBZ#j!twk&9&lhZB(L@lXqn)dOfMhu%0o)>14`ZZ@X^3e#=C#c>LUx{T9owuIlfyoZQW3SisTpp z+6n((R2ao~`}Gf^dJ`){!;-rCVtwc|N2@qOvc5(5dA|kPVKa+SV!rfyLlp=lPv9-u z068(a;MWW~2LcJvLj`GhEjp!+Q7v0-t(>;;r5E)Gnp)*zC}$i+(Nr1I^io8Jq%umI zq#fc_TFqGwL1ui{t?cl4=9Yt}Z{2_9^1-orri=br&vQ)#<>Q=>(FQj=T)sqd$SGQ5 z)~hbH!i6@XvTGel+L8{Kfd(FiN0mb>$zDTsfp0N5T(o)$bdZiG!|X6bknzJ7Nbgj) zVDkPA|NdZHU*lxv$ysM_x5^mubdLLhDH%Csr*7wqo02|IB$3oE=|)a=j=Q@8C?nFB zG^mdP>CdorUw{mRA4+HkeCjrIbFkrutT$*qbqht}Wd7fSON}MH@5yAqQ zOCl%IwSykhI4w|jy!7ye;{DGQPP4L5oH*@pTiz>|m%rL3vIP-E+T;>xzg>>T|Cd~q zP~9X!gDA!Hb(NLK-A8`lw?A!w=|3@Ma9ZGOw4*KnmhVL10$!DAlrDLWk{Ar8HLHnL z7S-(JOKX_~IT$o`8R~c@Q+8O6P%MT+3ZKvAgI2nl^=y;ANYDjUawyh;OvZ`-MIGL1 zzeTwJ%q<5_KSe?7Jf=1F&rF;pffF8l9W|PV#697xA&Fgk)`vuFJ1sq_)u|eZ?EJc1 z)ifMvroYG2ZT28ju+WY~(wM?;h*sBFgnTcEb}i6?JU)dIF!?L?9(&=w2d-cIez*5p zJclPD&*Tu`nXK}~T*U-ym}^tlEqMQ2r~TlujLhkO9{ivgdB8Nzng+?uM09iaNLShKZ;M@CTlbjXBQ#Txb{N@9XSqpt0 z`MDL@uE0}d1z!A?v=V9GBJ^803{D+F7dy#-Q@%rthuo}i zU0A5nzz%#;u|vFIWIBYMVzS;z6)5|RA#Q~5nx$rIv=!-YNthy;>beZ}{tUa>5=*Cf zI9zlvcrlLRI2W>(ERUixESG=N({ACo#~&p16alHf>oorKPviHY0@jd6V^Z@r3DPYVpQH6*;1A_N$Y^D8T$>O4x>{G=L7;*}%o(}QE^Lkl)d*rHN7d8F zFhTib%@8B{e-Fc;EDnM5P~3R`vz?-mEc|4|&fdtfJo)Re0KtTp$%1s_`%-`$$jD)K zr^=_DB08ap(+NezX~+)E3z_gZ9R@QdTayZboIVi`S`xFHAOiu;8S66$lP(B3!p> z1);72zF#0{sF+15uEbNq7{WwgpTc@by8CAfyNq~9v63v`GR-Qi5U7x7P~E`@IV30y zBE@Od|OeNDJKNi15c=X5cEyCP_mXBEhp@O%pK?LfdmQB5-DGnf9pT>eu zvngW;KSMX*eE@lCkrM@yJEEvVw_!uqypt)kSQjo;9c(cfpxd{CLH0V z0Cf>F4jI25hC$alblRHd+dh1mev9yb{0|?uCji8^6)NL0p?WKTS)*rupZ~R!?3^)! zAfL$4_=1^R{k^{@byC6gJ^NKrw4l(0CH_2JuI!<5HCxZbvJ`|CcOe2iDD^P0J za5ui2E(8dhc1YA3`seASU7V|RGJBs^bfv$Z?L4u?!hj)D_bAz++tGSGi)=!End`(T zIuZ*$l!ww!P691c!V+q!3sS|X`!ze0Bo9f@7lq@qztUDt#UDI$)t*1a**m>6HIk4%nM0l_*i~MEK_KCr z*Q)F41|!u!BLL^bi;_+VykNAzr?xCAya|xgMcGVU$z|ar#xelt>LGT9|IrvKlzIwT#&33-q6|fcfU*Gv3?c>gC z@5oynCTPVW?!I%{8o9BTGiJ&7)&vg$)QY-0)9gz_%wgX+w*UEkZ~Mfn-v8K-{NBS? z-ErJ{IRkCj2@KZ`yekwPAsAXloNn1CGVDcX*jCYGg2{|J#jX;}e&=dL#f0&xe`Y*M z*eYr3K9$ihsIFbh1B+J#w|dm1Ovj$8os+6z!w8!Lj#*l3qU zP6T#Bi}fo?g9k7~t|}5n+caiJ6&DdDHn=Y4GNeH)P37f-FC&e^f?v)=kPH4zcgJt( zUN#tKC-4jQ9kUkNcAo8woFgW;|n!kXD>bgKP_ zHRDjs1Yb+u!Us27H2nr4pT~J%c+pfwf;q}eIpxH|$#_bd!I-Ri#E>BapZ^@cWzROX zQmjt$&W<=s6Ak>TFq5m!`Q}viWgF}k%37uXt{E!}IxmAs8`_KNLANs4y25Ghv-L8PF!2bQuxbsi2V?%UB73j7( zK;F7Ops0zdB!mgD93tUE(!Wu%_FG14fNO6uk3DzK(eL}MPue4h4M~3XeV;e_xqFY< zbJebrNZJ~LjM%0K5eb-#Y9Jy!PB3hC`Lj5)_|CI%8QMW4cF6vD8gk(0Gz z0?iT+YZiu?0X~x#9NPO3GlUUaS<96~40jyQ{pa`l?{~-98!0m-&U6Cn**i&kF4Q?p zF_oE2K^T(L5Y;(K4%3!H>LT*GQ=3{7VJb_`Y7EL;s!SYfQxDoTh{5dX*WGK6G&%Xx z@A=%z-u8*_c+>sQyZsoxr#btD1$xQDT1N6gY!nXp3Z|!TTE!$%C8z#VhMcz^c;d!G ze{L)gjmm)5a+t5%5pZwsU=s|;Lxngn_^f~ zX1iO9VQEC$avQy3?@@XFhMk$7hIv9FFUHGEKT(UHM4h@g#HmY}b7zWNhBFHWFY2*` zBf`p~F#vZ>j_NMMCP(E%#joNQx;-_>Q(c!R6kmJqnO{D1>gWF8(SQE-PvHqjPdE78 z_rRC{Ju8hO#)@ZWdhH6Oi9ziROmhSu%W z&VL20d4AsQ4?b_NKL{GH1kVESL}0HP)v8sqSAbmnK>kv%YE|fM{OIVMUy3DDuF1FZ zQT_9YU-p{^PWwjmq0_(g!6*LJJ05w#n;&?l-Oj;{7Yntbg?G4UYZZKQLSBO*?doIK ziXl_Xmz1jLU2E=9Rbk(rUuV0}h$KDMA(?KC@!M!EDIyQCu)LTTEI=%cM>!6I!`eDW z+v%7B)i)AY%<^kr-n0(_UjEL{*!st3i0s)&j3tA39thmEl2{F3CxBC)9H4jY&8~ny zRp?^ue(h}ODpNAbSruUICgCdZCBZYEEb$D6@fRn(MAaMYP?BaRf`_#TFxBxOFp3r7 z0zq4YZO!v5KKkJK{(dEKu2UiOARd9k$?_T3H3)_6z`Ga^p=%Dy^{F^Y3Ovt~?5 zrh|?;J)!}{l<-8Z98?z?iON$(eKmqb%mX4tsM1l-_(_8kvEsDgYdN&!4B;V$!jRm5 z&b}^s<2vpARId}Vi7D$%pyc}lpnAd^6L2Q14K6LJ4+Q-(26q%$+(UNg9Of^xrcFV3 zhxZ60zqH7x(uIHzosvNOdT6xY>g*r0+O5t%^1BaNEx2OO5kp=3kJxvAqJNJ2H$3b$ z<6$$vA!Z5}{?5Z7;56P%cxBe6LKzwXrw+qQ{O{}zF?;m);S<(EUqaBa4RyN$Px=b{ zlQ%wg<-Yr$zi-^k45&;9^`5F4$b!%%-g1{if!FD(V!`*ePzB1)+=y2HeA0jgd2PQX zZL~FVuiF3k5B~P2?F#)FyN}q9O~V3g+WSPnU3z4j8YM3kV|KhcPz$u2>SY}Key<{H zVt)Td74#O!3Rq=b?9j3ahwEV-+CuDH^2Bq3oEiTxt||=&CzT*@wgkB;(z- zuaDWK%J<&+3A-8ZR{T~1ka@(_E;C$o}~K{9x9)Desi7vqZwrUmyt zu2{ebtSyaC96gNw`S|s5{|3%{Hj{Q{T1skG)_E&Q=K}fw=V<5h)GgeIvwDFWZX|M~ zvOrU;62Y@$u(q>sWD`}4fStBhK%^mUk~bM28azh83$w8Zwkh$td%tkw!IMAnuFt&i zEf3nl+RI8C{wdZ-+sA*e`hfM%^$<~D6t6WjjPzS`*CCxzMp*Hvn9=;#fDc7tOCFxS z`OxXx_CNk3_kZPr1Hv|d?FwAj75GQLapq~e&T0omsPx_}Dn)Y&-aWyidF%d7z81$)SYns0ivSv{q!w8qE%cEG(c2&xshvR2G(JrV0d&XwwTu-Sz40uA4K| zvijEKa0fNK$6UPTI-%-HqbP%;eB~71zCw7*Jtu$V!>2ARwmga6pZiAprpEox-*d!T z=u9g~jp?ke!#?4YBR#fphTK7Flt8ATpvoc{0|2L#$-}&KO(PX&MWs3DJ#D1z0w@e^ z061aOAALCn18ZuNbRhttAP9$R@d99sS(_qW%YY+12{`6rnD7Go{gk}_xiDc$r8+H{ zr`lIffRHlC-%?Dd0dq30hXNy+l1r83B;c64!6Qa1cV;6~-qHBnRSJ@HNS@R~Uf1j_ zfZOi%?`6LtZgsYgQ>|OJZ_VewAhu#`opJw$fA(j7B|=Q0CgPyMYnDw@bG}$0T}J#@ zY4kcs@hxqJx;e6a1A9>9%O3jrlbGOJQ`;4|Bv)Y9*(=}hu>BSxTQ%aa6Oqxy8Tz+k zj-43FP?eQUGOPtAkS~D_1`?D{3%Y%422dW{g5ryVb zf}Vd7o@+^YLZLC{ik)#ACl<{>&o_}w{+c_we|Fs}ooWYk$LW6YqC2m@{aQ1^Xx)xY zYO(CfF}ke@tuiTKzVIqBGj7Xk8~(QJ2IIMLq!lMX^&C5~#BC7qPi#CVQwgb4iR3&7 ziU9H_wnsTz&{Z$dQEL%3}bQP(H1l4osqH`|vNTR%R z3bSNcHZORYKnsT*24fre);z!V@X1ROk;b53{KikdVD|%8?>=fRwB6^tye7q|yK*wu zIZT0N7NB?4M%rXDUjz_b5r+m-%*P<$H{Tr`I@i*Ua2NoFD4dcRu)%C}%hEqnaU!T_ z1YQtGet?p4R7Ux2Ht;Rg5s$?`PQjWz@1OJc2T$|c3Y{Q%GDp`38t3`)y-s_{%>sNm zz5P5_UDJ}o9;LO-gbCx7`4y6F!IBF!|atbexW*V+E_FCQ*A1wK^D+m$=I=wCW;;$QyW!*7w}mqX;M@tLk7NIvZF5QH!Nd~}!9yj|xU-OD{E?bi)1X*k2J&foo;N34au#x7Ci!yr2|d3x)~yvl^Y z>JXUhV@)zSL9D8zJIPA@qJbi0st1=11knH=fWG38ALFLIn%Tss?6t&t`H0X@ljymvz_ETIguK1f$1l6o}ZEwet!DPPjU!TSBa8Y5fiP> z6fk87uBWEg?q7!jqNH#W)MvF~y+0VHQ*H>qA_h zyHD-9@9eMr(e|-*mo&I;gMZRi!0OZs_Wp@|i}0G;9{{>$B9FaX04aLu-Y*5fCdP_9 zIZjl=Nr)(7+-Oa8-{rO&o8$Q#Cv2ZNngPeFenqBR(`86y0=FJIWlxI!fwzCkKL2{g z?xTFh9cB?7Z$VQPVQ&?O=#cX>2O!aXzjZd3eBEyj8FvQ?AR4Vz| zE)I)1?1RO{QFFvjOweXp=$%8sfhoJ!^orf~Ey72vT*kKu2e{5+Q8;Xe!O8mKG=}Qm zSJ>|LrRez2mWAoRY=?spS|j0>%ZnNr1jL02XD~)2oncdbl`t*g>om)tc%fuXyl3I1 zFeGU(WM~l9R9^k2FW86iRob7ncjD%|FTpSP*uK_%XaA>zUwhsg9`akA_t?pKM9$dN z?CU%o&VQWMb#B{`_J>T0REgY7x>Vqom&_VQ4pn-JV&6A1$WOT+ErAB zoqVO$EcprrYo7{jOc}FQ?wDmpw7icl(4bU0AJ=ducW60_HNx`UZ*~6g7i_XW6}LLu zkAgjCZNuWKke)nQg) zVw_HN0W#sNGP(k0eCnT}E;6i5a<@$R3NaUOLQ8oq><~;ab2^KqHVbs>GUZ~$LK*J` zDPdDg`}S4MHyyFt(QmM4qv5x_0jC7j#`A2gS(reeU0l*$I*HY^Nsbcg3;f{3e?JNz z)kngeioDUuaj{lxF*>E4iNnK9gernoNpdJA1g3*`4co(`SXwI%jhE#zVxP30xbEmz zE~SrIqjUZTfAZHJ^RBZm-0caKXK$UBnILh81JiJMVwV^)T2eslq!zl$YHllW)>=)- zD6nXvInKyOb(L8gV?!invs^>60!S>H4p*%i)5PM{&;(}MT+VteyzoVgDln8e!W#BP z(bpO3b{6v#H3EDPI7OGEl;O})l0#^ir^BTM5$KdLrb@z#_0QVs%Y}a`hM1=we`mb_MC0=;eUVc=M6=l6Av}A2Rq|GYv(YC{7=dM#rtRf{@~*?>Q?;p zGT;MZFqySrdTJEo?5N^98~Fv#ywWe>o9{V&{r)pQaQ}b3#QU9X_}dkDGFRXqe*A>h ztZVo9gY1yV_HMKuE)$%RN{Gq;<{_ittaLankT(nLpL74&^4GIFdIs$!3L*?Z@PH1# zDf(TXG1$S=IXDID4-uFX=BRvGRFvT?Ac;fLERLASidIz5sQBHw(`FLlmqRo~UmRKx zwrIn;QMWgjq==Wnp&2NqEkfRTqFy+P`Qp%iyvDwy`HJ^GYDhj~HQ<*ZT>p_3ppK!u z_TfKqRdH!EIF9O8Mz!iiRke`jsKS>sX{rKCW*s8VRyTR-LT0j10&O`s7L^$pJW|r^ zY&2rGluM<9nEKUG<B276{b#suJACHnKk&p4zWvkB^+#tf z%T3{VoXNV{_NkvdziwF7oHavQ5)5)VM9xwMGlBp|i*VpQ=#X;lL))7-zDYQ^HG65U zz}d6k_Wmzk{gxxvSTco;AZ?hO^bW9Z2%zN*`=Z5xdKnxceZ+t3+@gQ}WIunyGP<&O zAdv4eWRLo>E$d(SkUdNDVY|lvE_*tMcZn4|9aU6bYm|0@0yIvUT1C_>x~_p^-*3Y6 z>y`pl)aDXK{-nY~5+&K;fkS~LY&!FdGETp6s3{~7oKS4Dc1W9aVGpw7w+O4OpnSwG zF8&d?z#%>>!T%BNUMPsp(xZ~3(`J=O&Xom5N--m+iy~TGC2Q3EF8N@} zP#RfE!j8&|*07i%SzBAu{Hx8S9egi|(HaplzA}ftdfm})T+lq{Z?nY zVZ)o}J|U-*mM3Qr-3?A+Jav^%U1y>Jj*J-il_L|Ahah+u_A}a%xk$INY%07SR~4lh z_Db4{9f~PIJJAe#Y^&~6WujwmfBj#8`#12r9=ZQqr(9;r+9^6Grk<`7J)P|sotR4( zlMxW?C&>w}^|1P9`~IN)eo8`CXR*Qp?}AgN zJ>%}MKjzN9;qou;`lQ`yX1$+npCW(?W37R2eA}t;t(7r{O|BFCZDI#NWDOfgPyt;taKg;bX zm=}L3*_<#Nid9V_jDb_Gv*PF>X(QAfX%d?xl^;gjwK69Q95w#*q89n_EupZM&9fQr zsZpMUD9$nXkZo>%;orRHtGjkxy!GzdT@QW7!BbX|?f$W=-dqS%o1Z-WK;X3G$*F|W zlh$w;m;c$3#upMd*&MVg*H)QyZKI?~tg0weC6%U(M|w?7L1dzhOcm}~ z(547`Fm@RG*!Ghswx|8CfB&=JZI6etFA3UHo%6PzVO3?dtu*Ax&!xuxvsE#_f5YMr z;~J0C;Cmemx()-k{=^D1=b_KR85G%0j?6}8^uIW#y55pOv#VOGOsWh7t_bWw zc6*NgxP6PzzOcz61xUv~LTUMr7zhUrXI)E7UZ~7`3Tz@2^Yx2GbWH(TsG%vOt|=uj zR3EC7fMp)?B2GB71zIiwXX#wOXaO!3j%Krz-$2+c99Hsv?XHXR^Va?Qzx{Xq@R|EQ zW-at{-}uR^ynm?vd2^44Gn3~hPUGot_1rcl#f(ron#^!5Z7Kx@Yxwj{#C9^f=(^W! zj=>oEal@JNB!*zxek@(&DFjrWGzpD)-Jnl!==2zp$=m%K@%!C!|Aw7@bz*NiMcH1e zWM_eF5n7$`y0OWH2WR-w6~D;Gto)JxK%4 z-^l%EB=x4$j_jV$!#ZcY>|vXBQ}oN<@yONtjz4qvQM23uvjAaNsty?mL*+J3b7a<# zw|D8EeXUmPl#9X6f~nPNGBO>immI3%zG9??N~=rcWY!Nw7}44-<@WuT8xQ(NlfBwp z{I#Y!yJG(P3YJ+nNwmS$DnKtax^B7bYmKJmSp`v*K^Ifb!s9Fe`A~1mahUfZ2TkuY z0sHh4uG@|+W^h&~(x#|RU(l*U`=u~@SnDhP@S=NItKH%JPk#G9J#GK~Yxn%=^Y5@8 zW2MdTTMiZ{VV&fC+lFy?_7*)L6-P&Fa`K}qj&r_+msz>scwXd9Af4~L^MR&FAdhx< zrz8j-?x4~`fZtd&Q(S!rUJJ)uCi~N&3j6<}*4g%-Ul4s=d>dk|ZOhXy@9iJ%j?nXy zXD^tmLuN|F>cnm)I7=DYoCIir1SLUC@~fjEli6x?)EeuY?QUoL8Sd+T=bXJ@0|6j#FZu`%8ew|s)l-FQ1e$qwQt&gr^^2NzRT2MY|g&oy(Ex!`C{`ms- zCtKIs6}YHZVAt7a{>H=C?7kmRNjN1@soe!DIaTH+$?0&cUz_%Ly{_^5g9aVmVlnGA zsmW*hgK*)vF~C2+_Gg7Tvfb;*_Cvq@X}c-fuIuv|cWn4kK&9d5OhKT07(L7=W=)O} zy#G11tVpe`jH^gJa6E>jvY}YDe)K zf>2Z=aLVGcA~4MHy!vMvA;Gy6$1VVSox$XL#oXI^rG@p$3zK_J-E=5^EbMcCeUTu~ z%kDaEUBT6FK5i{^?Kuza?tIe5MrdaN&-pQf7Fvs@WszS~#(63+K}uNtu4jjVhT}#~ zA@Z^5)u?u0(j5sE9+(wj3jn_Oc#yigyR|}~4+{s%LWIo~h*1g~QS@>4&xWgWKI-|Y zx8=w7vI+Br6FW1}w0QE9peeaIq229}8lpI01^AUXJ;c2BfUE6PF@`h|VbDUd>j=AH z?No%8oo^8O75<!7!S{;1*H(vWG#8vh zM$j?|jK=@*rUR#Ld(W4)o6i>sif+TWI9K314}I?Wzwuv~`$%?8YUc_9hVG_#&)K$%MUf=9Gl-cI{NgbttiKi>D~_r2}o_7P;< zlhy%`k!J;z*(KZ!@mmR#rLZCFKim6qDPW2P+8gG@a;X;MAu$J2^-;Ab<65zvOZ8Pe zcQGrSWA%hJi?+wF`@dr7pBe7ZZnTgqoJ2h~T5; zFn8_<9KK5!E6ZN$n34UK_igun=|_)V_`4RZbAIui54`BD$Bnq^P4)=K6~y2Poadh8 z2u?ztib$nCjHH{?d6>F+CTDh2SG!;OrLGYoIk!DNbjNY~;n7La_@T8CNhn{EGia=; zuO;v7A{0k!0#lnV!!w>jfQ+gRxd^sJ5cfa(^Ph+Na_y|s6IIV-4B>p{$q9n*kk@w~ z5`5qgEqH3=EgVCyXp%I$Bq~oWQ|1QtfcGp&Yxu%o4T0U|Ta=mg57(NMzSXQ4^ z0fLE*R{wm`uIn8o3Jnr500oKzmFY926lefO42Z0Ye$Cw{f9m%?`=YlzXjo@AMcY>k zGeWI0#bmj$s4DFG@kxhDwbXwa8v_KPqym=#WGshBL0 z+r(E6gW&4HyB|jTee;LT+;re8*YCfO-y*zbuWvhB=X}ju9<-0Dvk$~IVC4}{wmJ{x z#I_VLu?;7-DSA6Sp67!#OYMc1(CQR3r-Mo%fQtof7K-+CPG*UbqXd8vlE$B2&i51! zYd$*{pfHzc(i#qBQhjY+j(W->*6O1>@Xb43JWTnrV29a1zrR4B&)dj?O0iCX6429< z=PJ(9%#M2w#C3tl%`;ISioUA#9qt`bKy*D zYFt1ePTy?5WP0}Oi#~thufZ>pHUM%!jlXFd#&!kPSK$9=?@gmEyNWYG*6QwZ(;l!H zj2Q%C(vSj-4OEp4c3~F=TS%5bwlS{dUcFqdAH8a+YuR0vl!G!gfiOsb7?e^@ zk_-ly!PpFXIci9ykW#7lUQWtMLrTfy{*nE~^hNA_&V8AZCBSf>u5QMO9T7WroY)a@ z_TA^4qeq{9{hcQ*{n|;(W-<;~gpaUn0iSVT6cFCgxY3DHnHDZYjgQO0=ImY& z@NhvI#=Z7}9pMO7^zU6e`)YlODynFCiE1Q>REFa%$yW#4q;*)Mve^3vE5_1pwGvu| z!1JbT@~pjkYiAiM6L{-FN|E;BMY3>YMx#O3F0-5w!_5MjhQ`Dk7XsLX)+YK09Y^|epjwauLW)9h_Ss}p#8k%VP02BW za5mE?#~65%*({W)OizooN5Zw!4v9n4&Fbf_m7OYZ_NqA)&!?~c{%qlR?q6+u!37&m zTCxEp^eM|W*@K;{XLgR~O)@)jW~rlkh3w88GlCmODU$+;sVs(Mlb5)qGAH{az@^1( zvO^abQ%`wAf18rENhVibk(|6g#y*v49uP z%keDeoXax1W2ReJh;I$QG5rJSD=i)qBGXx`g$`@#=t)rD-<_e-7XTx8VqVwjuXEo6 zV7=BRS43TjrTR`NeX{*szkK;E*c2@b(F}2|!qCceHo)P?p0$9Y0wr6?*>SvZwc)zS zS$ZCmprfp3ywuN-$y1+RK{qg&x`vY#Y}Z;lVlTni=J(K_Wb(Tw-uG8FPdZ~Uec3= z0P#fdBvx48*NLgY*+HPCw0XywVuw|fHC6e<1eYk_aL)0-Sa+&PBgAwob*Zb35fxRV ziDa&HM;bRmTUJNrPSybxqrdzVaKt}gJ=jm;hqQ z7ZGUzSP*9PU~F-LnV}-5Xq>_N^S`~UdH!>T&^prxA;RMT!$Kt>tN;Qd;=>=@up8fR zxay8yxb!BhAs`sy+v1^zyU@^wphNQ}OO85T!$|#%&5$Jqrez{Mfs)1qkcVQcT$0Kz zKohlxA(N%B*N&?E?4n&KPx?4nT=%H#T-;`-cz_9(>)-gvJ97z|)@DT-m^L#G>gV>1 zcp|HT9dL*`t}|PC!AN$)^N{^6m~Oxx8E0(KrtM3%VoH6kRdjUZ>~$NbUCpTi+B%{n z@b%MrerQ6o42EgEX*Z=jd)?eQ*UkOOXSYwB^N)7J^H*#<`GU<-LN8l?QfvpMkEuIJ zX~A-l4%q|s^3Z)%tJ#>Cp!XP6%2z>_vcza8S>_SlzMDjY?u58}L`cj>?Ii;jv)evSt3J2AF7(zUK!;wWb~WWeqekEau{(ySjGlI`Q!xvB%`|5&sY}~M=cI)u4tH; z0^J-GpRcalv2?sjnJiVNQJSb)Pf~a#@FkQi5q*w?!0f^WCS_=gR}smB=`g|Z8rGLx zb~7@?2}|WC+Ec~N+~8s*vy}l>JlAi<)38bp-th}bsh{=z-R)+%D3UqS5>k9GN*%kw z{H_*@;ma5;5^AehLqBRIJZ%ZPDDQr>!^2eG)B-=W7I?w(ttTh1f4PZKeGHkA`3nbh)tubo!f}MW9digC#D1HM@XV~t%RO82)(um!k z2uD`>3QyXo02(S_^etB-mITgHmTTBVfZ7scz!+ZEpW|+(tQkPr77Ut_v<7ws#Es=D zBM+-emdJ{$R|Tq8l#p_iD-O?EBgOL{uABWH#4Ow!c+ygNwgyV*Q!R`1nXwE7QcU0$fkptqo1k!9VRC*{+6n%}W(Gexqba4rI`j zxFlVOeBHm{`wBed(*59*;c^b(Z~;fHtrSv$%1hV?*p~{i3s~zkCzLjs0-~x(aCSK~ z%8^kNO55rT8a#^m6_?+FXVX0s&!*F-Ey;PLGZWyMr858s*yzK&IFC3xa)JbJC(%xU z-lr-1pUeIY=#ZnR!?zK|caX(+%UH}l6e7FC3s<(fiE!>TZd||Pdk{CKT}&FUdLYjvQ9A@OtKy>njBlR<5Am_eM{0U*i$h4}70PZot zql(LkK!Md%dwS=uePrv&D>mWUABA+EbBq2q1Rn@S5n~*Gf42`)3W@HcjGmFvghPrF zfGg5N`%6Ifz-wH|sIl6mL4vB6t)_zstd!QZ&}$Z!b*jD#6NR;x)0S_1$I83qhsCH5 zGZc4cq(<-BRPhnR*6Nto(L?qrLP<q3En!5DM_&c=u{o{h^A4b<0BfFs7fht zv>G1YNfu4M{(QCUE3lg&a_)zV$^@wsA>gc6&13mp8LLZ^zyXckN+9zB$aY>6+04)? z+*x!A>%8#ELYaja(vTD|Og#Ja*FSn2o_hW4r8BsEP@AaFsC}xH+{k9P*3W542XgV> zMNy6s$olh&jc>a;-#?gkuGY{Ijf~gqW0V|}|E9*!+MXtmm4#?n=FD}w-gn*X_wskE zAC3xYI*K203!Jv%>o2O3V8P@lw z@H`1h-oD=D}B$Mvkf~IF2ozl z$K(j6c3LM+;K}HK&Simvpoqdff8;Zrk zQ9E1lke=WsjWZ&=c5SGB$nyv?eSZp`6R7nwbPiR;q%mGIf*$tq&}cX!|LN zGK^z?&L7<{4?8?Y5o0QLYJneC3!r#D<-!>$s5Cfqfz%H9-7i#HKB^&tk$(V;N{;7m zwDq%1a}6DRY^>MX9$T#Rib|sv%nU@r#c<)2ww(jf=Ji+I@zTp~!ggQT&Y`t2R5fd~ z(NaqV9c-zeCB?h-216Dh6$#$3m32Xzbd<*BylP~jj8zU6?a5^oLZm`xjIOPh`dtZ3 zd1?ZHVgXXmVTv$Uv(@~guaTV;|Z}`hBpK*Jf;Ku zmSr}Z90(s4fh-gS>7}fa0k+Rbm9EzXl~|{FOsMQdX0)pj1N1fLq%mb$gNS0HTMp1L zA;i0@LbReAQP@}-O0%AJF>1-$i`h^yWwl(5to8Gzw_UC8?}qz@n>9c>d=RugT&8Cb zm>eZ*LP3WQ0-u}B`g2UWp-Q&yIx339F&0k&Yv-Ef}^65T2~-&#`|)Ruc3{^^7WE2a5o-2F^kswdw$4jLpd+L9ver zkynq+qlA8pBF0qg)B-=m7I@lucf9~xI3&VraEQxfi5`Q1z<8UXK(jy|YGkm5sqq+6 zQppRJ+WWhsezsVlvs)J=Bjgsm1cVw=Si*G?qp}Db1q^w$7hH7Xm4&Bc@j>siMkpI@ zincUYts(WZMn8_a8>tXSas*&xinQ>nsaY!oK|+*ClXP5DYG!aD!_t$G3DN{wr~a*Z zT&e|=pr=x~NbJ(&M3;~*(n?aOO@MKM^Sosn-hjIZuXh8=d13f9K))>xPh5^}%|2X1 z&Ny$B?7|Wv*%e6kB$JeCLQIoJAju5iH&?M7GwviQDi~1}cwr!Zh59*cVg!x0su(d! z&}%rt)d~cGCRXHDUKflAiC)fFv-5px?tUzOjeXU*UwYw%Us-gCJU3q4#ynO%Dm|x6 zaL$6pSJi=)KKF|{fldU0RXAwm<2A54e_lm~0!m}-rh|PqJ%TI3TBRh7cht^{j*?;p z@ClpMRMXn2RP2*vVkOQ^j78_ZPF`2Fw2CIQ3<0r>hl>vIUcy%0Ksf3eZAe26t$xP) zQ*{4EEPJZ2`ZN!>hb!_UlO_C6fX=t=P-{PBDFoUiUTt$K9_cJ(0h?s&tC^LhN0E@C ziZay1eu9*zI`71;<6pk~R_x)opCI*K7%?e~U?!zC)c#HE6&iKaG`?Y4FXC03i#6ee z#_MOUKSR$loH4iz&<0h8*4sa<(U>dfVJpP*v)AqVz?BDoh%21w(54o6>@4ua|FP$B z=N`3%6psmIb~COTP``~>VhH1g<|%|4Lwc4ONVB*Nns|O))XxkZQWa|$DKp&yqsG!E zn0sW4)pBAGBt5HEBt-pWlN0-IwPD^UfCmw{o)ovO6w<8KlaZ9@i`_w0`RI5ZsX1C` z^nC$x7onIg0(-G1tJXd~tErjGG7A`Qd^e|qr-r8~&Qvca*t1h(sragG$N@e5%4>ki z0+?KdC41?Jxdf#6;(H>;hb98m}b<$$`A!Su17CZ+@M>SkVuQi1@j{OXyM=1BE+_CeF5PpSTI4yhP8AwS~7Mpg)_V~fXDIRU39hfI=X zQ~zq=a*o0{Vazyj<5 zamKUA7i~SOHoQsc0~ryHzDQ>Mj*gvcWuco|so`x(cd8`9)uh3wZ&fQ}teQ7mGCNXX zOcs3*^ann*51H}Nj9^EPKKD~w@sMY{AtjweOG(qx*X0zNk}v#4H`KSYX5u(uLi?V^LLr({*2sU(=vG(uqEw2+|- zlDY7hcP5j;!4I1u`?Y|EhzPChB7nNMO(EXlZRuy&|TSa8O# zjc2Z!dmXkqU$O-oHo84~G?chd36*9mv?fqm4bP?&Vg++OvvGFp{OZ#5M%<{V*D139 z8N=xo+xvK>sc>K`4=-*Fj=HlLulM6BJ zQ3e^QG@ANE0_=6W5YK<-lXtxA(wnd{fDOR7cT#`Xi|ni;viA=*nU{qDf+XXl64O2e zB*vy0U2@ZEwu&f?CKetfBj6D`h}pYv;bXagt>ugufhyCCjw!%8#p?rJd&Rb_pCc^8 zlJ;R?X(zEkT57WbudVtryOpzP+y5f#9piL68Q5F*@J%Me?nv1V0h*{+WYI2%txP!- zfnI?ty`(JyO3-T(T%O=^$OCC3JyKiM#L5hjp!n>U%2Q!1wOuF6O8@zT>(Z|X2z!KuM1~LwuYke&?bRb09Vo6|87mp_i7Z@# z#G#K!rbbKeSF+?qs}o=>I-JUqtugiNw;{?@0?6#eQoaKsSw6w&^dhYdI6b4PH=;)9 zWAv(3>Y(+rtUpU#N7phSoX~xqj!FPzm8NnTJ}9k(uEgQzI@j25%sZ!4A(#UE5MM)( zwL(eWGmZz^p6hCPF~HML(?w#X7%$4=98mX`MqhFQe0 zsr_WjZU#)F_i?a&RV% zvq)vmq$!yl-ARw}v$bdy(yVJ@5>J8v*kpjRNcLAi5`^QIZNMtcOE1}sThw70*pTLR z1L9mXcFr@>Y?iL4jIc4*Z)*yH(pRijH7THFF)|QPx6B>vt4b!jB6A=?ta8GOfDC;S z2+GuoWI-HaRZbw?Gu1_1+h~%*fGJk$fhxJ{w>va;*kSeD>7U>ChaZ15w>3Wf^LOCR zK`EY#znPOrwHbJGPNxa~msasxh7K<(jLe0oXA*V^fy_hoe48UA_9-LsU9wzf zvo8b#H?C)=!ei3JLnm+xG2F31{NtYX2YXe5qz$foGq5b;h}EK%30 zXsMs${ey0nY5^H+)CsH~I-{vU7-<)*yPqSlFxo2synUD;DnYDGc@8C| zNOK<$_R3;3{H{#`=U5V^1SI8VeT>=~SF3qj42Wg2Q!=`e(wFoyD#x^h6EyUzL0#z!YmtXz4*hyLLu%eEBXYkabLj(ZfHpAM;>=B*RFj&dvt zky!fGTG4&G$OJ~n)Z3+cXOosgRy3L%Hi_^Wj>uxYgr4lnLt@Uy(u=aFWGRh|g&oyH z7g7dpnk$XH{G|j^Q%RJJHSL(N#x*Lf2#g?5hh}g&FA!2KQ`P4FXSr$)?^2Hqzg1V{ zWO15sS9kB&gTX^1^Q%H3_L;)DfTl9deO5NTC=2J8Gse82s*r=Uf{^ul*WUf=kKVQ@ zpZ4!YhQs7|)fspwHYwKD6Ev`Ax=@^V^}rzRu3VD6^djE!oF!O)#yWqgpD`91+yIV_ zO|eqc8MbExyReiq7?NRRRL*B#xBJnF4^t^q3;YOMKwgD_>AzgoHZ20kG!Gbd;*c2`Ip0AsK%cr;h(g$yr?HqW(k-U)#%k>^J-7ICWay4Ne*o3Ky1O&oj zG_07N^dqf(Kz2s3C|4sV*v-y^Ce89?v1LFIKA_s7_1R0;|H|dJ$S=9&beQ#Mc1vUf z;Smen*0irmhR8jFZR{DoHs$=1Xi6d@OL0ru67a8Ya2aF(Ar4)5gwk z>x+jfZv%*P!5atD$GS6u+UWuqZaj0bMWu;c z(XZ-O>aGEACsXJ_W16#AmBT2N73oF3!;O_F&_#u<7+^(y`S_vrSn#9?Il?7pt)*n^ zbCzweeYp|?&C}>w?xj|ng%bucry=PH1Wow4^0HNc5~~YdBS1EFGc;!bShNd-?mxJG z7q*@J_Q$`0r#d5aKW}L~n-1eGW+~QFCoD~sY!v3tf;8GFS%;J!HE3Jc&`sVyc(v@4 z@fpp5>sWk8bZ5F!KdW&V!6LhbDI&@RKIELab{5v2Ecein z^Dv@BB)g!rI6yK3h$H}f2Orn^Gv+(v31dP8fngj*FyY4-J-m=br3tddcrS*Oj^sWU z(Aceo0Dc=!ioRqEUh4W(xwX)(#1SzmJBIlYR;n4Q;=_QQ>6$}b@`B6|8`4yc;j>i) z=Gk$Uv0kL9)ubb?G6Bo2lyVp0UAO_KF&)iS3c@59J#mI?8Nni4l|B*#kv)w`sNZtd z^i$=KfXE?+O|66+2v|tNE(ml@#0LOJ^4hpq2?CoT2eA!7d@sZryGcluw3T9;ft#o` z^Y6yHysw;p6mAYWdi1F`Y{4$Ca1!w`@ep`LOa#XiN7Z6GE(y!Unz(mdCyEe(?V~;k z%8(h|O^ir3Q-X}@iDH3NJ-aCoy|?VyOXW2hOcs$T<86lANg$)+yLz}BiYU{nAUkPw zhEg&CSe}MbMzLYGc0-nvl>-DlC>1lYetxdj&;I;pIw!m?yi5F(ur6Pua|XWgaC3Ny z3L5%31%k^NNdrLR!^kWkP3VIS8>so;^r`JH|KQEfy>J8GjfL=KmI?ca1NYXh7_n8- zkeGm2uhJ__jGZ{6apb_|NNn}9tv}1a*J%FYig66el2J3wBSJQ|3i_c{h1U$L7CUq8 zuCqRK=d|pZT3~8{N5uj!zGMSZ?JoEf6Y(_+t0Wv>UWHnQ4ku;EEbq~Ysf2RlnFD^+?lq2$oV0#IRfRJAHcEfSPn>FJ+oCF?>Y zM=yo)taW#zc>dF6_x}sy!_zkI!JUIIyzs`>Nwfkfu9XgxMP}ngNwA>nYA?b#(%piL z#zHOt>csoI>sqtX@-Vng#; z&ozJRtElZ3SiaGpzkzj8DY|s>(%GsfhtFr24UD*}vFLaH>eS-t)k3Vi5arUUD23DW zYf~_S9gL{?f9XRvKkvegC{6K*C)xx6VYfzW>aLZ}&;czO5}7-Bix1CfyMQQ?86frZ zMgE=|xATOdnK8vOAZUl|NX1)11ZGG{Q)6cuew;e{s@wmCkzvX{wZPN@W&wEw$3-`t zvf@}NPcu%5Ka(@vXl{*og6JXjv+UpS`q}OQ@rf_>z)0ng0l5a53Tv!xc6=?k(3c^F zKbosFQ^P}$R_SlLcJ>{s=P&rj-Cx|g=c50){Uw)d`tkE_eA*IumqZs}kK?di#Tqjd z6D8yAaflt!B;@o#o?;1f@+%%N^64*LjJpWuu(qQCTu+b`fl&(bEJSP<>jg|ZPXzqL z`5uP2%o+0mbkvD8ULy6dyRdR)sxz3v##@yajE^q!wIPGd@W&n?xT>~x*kMGnR}R)M zRmGve)@jlNvB@FcR=KM*>^!+*_6^tHkLvf4N4cX%f9}S;a%J6?BIYgWBvw7f>`q@A z_;z>UmXw8;VjZXzZz1b-unH3d4SfWtPLqgZ>}ymLK}vZU%f*BGXCl`?Pf(8bMWg_o zlFC8?kq`s`Xh{&*CzWX|VEtwUsKg>XMkla*gc5a~?BA&GAEav$Xgqmrsv2dbcW3tb zm7Y&0SK?-70b{Ml@qO01o!D;ol8ZM#WAO}bd=`u8pvr}V*w8GH#`J+_{G@GZQvIPs zY$XE2(_DD;LgM2AjMvtm-=_CzE>u5U`~GJS5fX>{Cnh0QL;!KXq6e#s z2qxNEN)F}H2%`}jhomH6l6h!AAfd@SR?WTPnz{e$b31RidGG!M`~Uf&Lq{GwwBgRZ zf4+L#&tACU@#oLr8J-+t0rcn8Qgxt-5xbCO(0+KxHbqY4jk8dVFPaQaTt`p^%E>|r zjdu}V^^LfTu*Bz~>434~Im|d>_92%M7nV426V6(dpj=#gfgA90EbC7#o>gWFG_q8$ z^lnJ6!-22e$pG!6Wy7$k!|0(8XV^sHEbooR4u|x>7>nsp2{=YYp1DRII=5)+zo35p z(oslw@dY=Jx8~QS_TuKE7b=_%r{m;hr!1ti`g;CG?BNdZ|{ zcA^kTu>V=!pR#JUdHzO?oTJl!j3A>*Z8g{f_@I8Sl(i#+(Yj{-_g15Fo_*iCxsT86 zxqHw4BljP;@8JFe2lgL4c;MR)9(wSBL!aHU^Ndg2^2EjKAHR486=pRKU<|n{m^&jl zeX&?27>B(e?_+h>we>E@I6F0im}JVYK!vMJJcR=(Rqi6hD_E1EW6pYORbs!sUp$zE>)RAgOuCv22a0(<~ z5<*TY27<~(7p9Rgl zFd8~Df#6kFXOA|uB`%>B#V+V~uDttKKYS~~^0Ss;BZqEZSI3|QV4Mn9TN#X2Bam;L zGCzY6=c|K>A@*6N*z z1}DxQ`2nanrYcM=@Iz&RXI%adr(V2yIO{Ep1YW~z*|*TN4k~JEZDb>%K8o*&s3j-yAP@|it) z=iqVG2I5+*Il0KzRUHe|6{V^3((Z7Q!;@?ru!%+uOLr6)j0kZul#ZPaO#dW(7mBOo zj@W)kGRE38iA8CwytEq$-}0&L|L!up3~L4-D}d`@JDc=}^^`e0c_NgA*vkp4)*9RG z9M7+->(3tRXs!xWBUC)$&bGt{V82N{!hrBYRqRX$Gqu2@Y=NKr(k*yUl}&$};9ayi zK4h+7LsTchg>(IRb$NeE%yA7MQu&N85|WI7h0`{+WKB-Ikp)*5>g{L8GuF(%ebwAs zuATkAzp(Qkw%v2zp#w+m+kdcB&M2X?kUntWfqM^p^T?q)=I{B-zxl>?Ejw$}wq9&%Ofaelk|i(Z?a`56a_QCN?DWG+n3E zr=y=F#M#^G-FQ1uJe(w|<-BGW|ojeDnAtK$`8*b$0cxoH0*+QOlmH}KBx zlLqfpa_1~AN9PH@jk+$UKzc8U9T?QKAw*p|Bs9ncopyM&Sa>IwKq+&C1`;TQKtGU_ zkdtu%8p^3Z4^5_5t!NE5e%LwGGntfJq%~o=;LXUcurcC(htnqQe{LPpCuVpr?-L}D z0RfBy7cH%PexqLhE<_m@$fn7pZ{6)6uasRo|J$GV#)~iBjQ7dnaU5xC7;xyovavi( zk!B3Dg9R_873;av4!wHZdCcG`P+diz|Gd%mKf@G0k;g~m!6YN)}F~($Lqyz=dSTpyo)lxbC@!!l}yJ^qfd-i|(fdiyULu2s_+fjYl+bYsBvDpNc5ruC&S}GCMIeav<2iz-$?%g-w`tpBXb%Ag8MPPJ_O+tzUlwMJN6@g8a6?%r9%eYFvs+I5HYA8wLx49Me z7~KSVp-fE}j$;4Dj`yzHMc+#R9vjZa$lL(dO2=-dRq{dzxpGcXIN77GhK4dp)?y%8 zgk!%Mo}P65uG6ob{f{5L4St110C}QabGjSjbf?m7Th5>n7@n5zxVl4t;&_eAw=qD-@nnWKWk*LxM$&7DvcTq3|6ulVREIqG+780X$&KsC<);6 zsGQ%8oub#yow;uA@~`c_W9PnaA3kvSUaOf0mGeHUq&xfpY>NKpBljM@|KOUL*|%PK z)039W{M6$0C^%1&R4(>(BWN6^K?p2haL`0v%eAJ4KB|QV8KxdZvR?viX*BKtcpen4 z3toSfyo*quVpmF28d)vO3!k(+PC+$(cgQ9Hgzc;uMv-}zc|uJNX-Y;eUKEwEay9;7 z?E2l{Bl(Il-A9EqfnD?(dfa3X8Sa*6@ ze;Nw(hT<`2P?r#Ha+T zp9_+rQb^zXU?4J4?t0~ikbJb_okn?O4RHZwnEGg{;&YeHe)* zjhu+U8N&;g#1p*f7#lXOoqNaX*}wYIu9-XUdFZ|a-+I8eI^!RQMi!sD`g#98)Ybd; z-+%9c?|$>%U3>Rk^7q?+5`I7 zV4UvCmA#XuaJd{~thIfY@k27CrIU!ja6*$QWG!Z5U*VbFb%@1bh-x}g+RQEfvmCy{MqNcNm$p3EibNz}3~I15J48F-gOUZ-_B5IX4NYVkB#f6BeiftEwax z0#&=#&zS6V-Nv=5n;C4B__hy`Rl@leAj5hgfmNYYD!5Up_U1_IX` zKY8a%FTLr+W$Up`1;Lra9|6SFd3iztvn1_FzzNE!Hw*}Z#{J3;b^Y1j-|cpW&M~46 zu;}NbwxN;IxH#US5G1>GJ8?Jhi*Ek*!~QAiN46ZA4t#2Xhid`dANBkdBXWz z*^5oi-#L8X(82xp_zLq#(Hto3fR;}j#=n7h=z)W{weXg^_Wap(w_{WElP;Kf#u8cX zICYrFkcbDlI87&oie1R4Z6nlI0txRSp}|LAdbJ`asJ0p$%i1M_4D=xv&OTt=MR@A+ zO>e*Yu6U4Ll#804n#aL0hL_WkWuZoXIoFl~NK+4ouwmj`T?JKT2noE%41vwrSG;l+ zwF?*ZaT+$cH0i6a;k8NWRg<>g?91wQYYnle8Ki8mLo@}x0#wOHgu@0iWTBkYM4rO& zyPtb_PvQ8<+Ychoc2{KP1B?S5fYJ*dVxMdZr%en!6F|B8F3YOLA?+GGSgJRgz~;NH zTS)9cOq1b^D?&Vo72YVMbut2PA7^QMq-4?%U>Cp`Y|}OmiEjZCfUALR;urI>l>j^S z9*g9jCgd1i-=BiI4*NIsstsQb-LE=%PH_66@tUKW5QFP?2+z3?7@s3``b3lV zTjqX)7lm!IwDUz?hV=(G>^^h#{Ohi~{j`g)DO!IeyfA}vV>I=d&Q?4G;4ob)EbKxC z-iwfHEcRXNXE&YH{}BpoL_7o#W2_+}FYQO^oqg`~)pub=|BIex`EYBADgD#}KWY{@ zdh}^m?R?d_U$TV=#DRt+nrJU#& zqOuyNSOT4V;#Hb=9iqhHE55+!<(%vH%AylK$Nl&8>+d}Iysr!$fS3w&rJy(=D+lx8 z31OuCP#&d7c$#`LVugeYe9)ctsL#xFxc7D}`KDGCHX)*kxwisMN29$f@ua>c;7wcq z_DHCDhCyr~qNlc|!Ya@Xi4-|%z+wTnhIOG)qQMxYwf5ios{w@ruumnE)_nh9*;i0J zDx+(O+cty53C$;szWOJL3o`xRS}SjrFf4{EB?T&rX(H22@j36P+nRYK9lTBTUDw?G zYahAoq~#l*hg%EB;;@8Yvr-9?Vj@5Lp37>?RAUC0Q@R@)Bh1U+CaiuQd4GzHy|qBv zR>##{eY+)N)ENzoc<`nf3p7#~W+t3eyVL8GD;OF_f1$;jEr)L4Wd^G;OG z*UtU^y17ffy8G7IecycGz&G!gh2vOtjz#2B4_gIoYtHSajwFui+Gyn))%g8~4*c^s z@5R>W&wTCf*MIEhrz~Cn#0&5wCEptpHjHRIW+hrx>?Q=sOG`>XhS||7;d)qd7{0F% ztoMHHdLRTcs}6vXXnx_+Ew~@YU%aj-3x#WAb|B-tbdekredu^&!O^29ti1i?<(uSfO5v8~2JSYkSBR6uO7f}0LQ$&-bJzS1 zPc{b=vF65w*!pr7_snJ%NK;%AntGIGcuEj}62PU}it~rseJ@1~7Ew-9nmB!iO&x}s z057T*Wo%8d5cnm7OVIk69SN_DWh@Rb-f9=kc#F=afXT5gdf4k{f3GyXI&W63&Sq{# z3=R#Z`{^Mjwa;r30N?U9G-Pi8y+Dq>{6aMZ`i;z<8dP|6%?ZV8TbolTp|K8t?Z^7c zZ+Xiq9?(&3Ld(G5Zu7V<(;B$c&#i?`hCQ*<%9YLxhMX zI7EWbK;c2j2&~?V`v+$;ba2*dl(1J|Fd9qv9Yl{N0+T%=YSK&7PCQ=YZP(7dd(GTm zesSklZr_V%Yv2hRc)-R!U3bpHmz8sr)Yil`=i#PkHuXXvVc&kNLVx$jz1!#SS@L(= zf93McKeKrK&n}jGz`30RW)Uk5EU7g>EUAS(y@VbV8(_CHV$#&?o`?-E6;6b4ZM8() zR@af2{Y;G|1>8dTybCwJ{uBBx!fNxO+3kFhhNsUk+_l~jL~EZ2tdbNVQ4CXH2Q(7W zZDNT=QoI+Xl@VO!u*pY;uLQbu9F=Xun8~Y16XZ|`FvJHj%K$c2O#}{>oDskTQis+* z&hD(WbAR&L?Z2^M-*Lu+Cx2a@8a>?J!?`a$Mu$`<=?>kc(|<}$7=B)T%pEdn?<$|Z zTIuyQspWSQn?bHg;*FQOrKnLqj}d{4EVWazvsD18Z)5Vta%IOwM#aaBPUGnGm&2w> zxTsPnoL!e8i&&lA)^B#Fx=HP)ec{_aRXxB-AF%J=xOxY6JLGnPa8dDOmZ=q~c=bSa zNO4P_s$Lr#vAJvOv?fqoy0(tO6jHlZ$`N*@VegneIh$k(&&hTU+zq{U{&%ms;}nM!8z<^CZd%L@XNh8LDi&ce42(N{A>? zx(fwz7~xl&nnU4@7;cow&t}dH!vyXUob=^H7?R&cPcA!U_ANBhkzDKuCQ5V? zn-J)X^!kdpi!f_Q?nWqK+>6E<^LcW49*I#PS9Du^BZ|DE02sYTO+6h=wo1ma+?rlg ziB*BpG>|5uqCQvRCi}Y%n%8QlwF|YveSOHhnc-f;Kp0)b!_pQ78I0M4d zZ`gjyvah35qkHH=bS%M{dqf!^G@vYp<|lNU3J`W5b5YWfaaDXH2c>l^HIvc-bnQ-? z^(O>UCIJ!N)-$!qyNg~-LPuao3xm?6(i(kA(bYvuTQ?BmSi@9CneXgH)PsZ~Hk(BG zScqt?A@;9A!kFZ(8g|G$q;P%NDBs`R%sV<2i#j@+xuW_cFH||X#50X@NUtoNCr8m( z>PC~F3N+=S2&V#slh|i26>F4{?HoJLxncL|tL9#N<+jr<-i)#qAr65KRdg6uPg9&+ zHCl7x#KJV7+FuyuY(heA*r?|kFgkkCicNSb2+DZTzi2ME6HG8mps)O582R{pr9U} zu#;JqnEk^tSeB)M1ls-tuumaTur0s6)wXkBQ#97Szp!Qg^sBc%d)bC3oj>z)OLMcR zMB2!GW-d8oSoYi+IkXx)0()a*KRa2O3|kwFWo_-w&MaC-KS(a8uGsYU&*WW%nIGE| zk$63E%%{zY3RvuvwY+^wjnkS-E=EsY0#%?QMGg5xk|jaNWRp@FSl>j;nax9F0sQs6bua;dXBVuE?g zz{g~@(<;DH)Cs2brEYQC{7vdWWjC)AB%MFJJ!(r;NoIt)sLIbSLN}2U{_HY~CPr^v zqg8>Nfb5!L6QFzoF*=iG-zL-h)u|m4&`Wj{1Q9A#6G28LZv^t)T7!%P*l)5F#m2~5 zHPrqf^L0^ue%**q!kyw5oW|?undZaY;n1;3U;sEc*Sl8k_|?DOdeZVuFaj2N#Awa+j`@iPMxO4W!D($uh_fR$#|L z0ptr!86|GWx{yT!C6L9FJdEg#rbv7eH;|iT|MR8t{5pRbhlGfXmKp#{Ex~|bLB`{W zS2ayYR7$KlNat@oAny|N{TfjS_vNou$-2rcP5W|# zhvJ+~3+ZtYSz`}GV?zg?5sfEB@7lBP<6qtJJ6GQPQ%g4djBbivq;D-T>xr$Hnk8x4 z$4u9RZn3$3I-4{5Bj@sDB@Kl~B)5|?nxNSQ0X$0tyP#il#clHQE(~s`!%mH#sW^Aq ziaiOQ(X3S|{S+6B~j|$ww2rsCdF83pq?KBF!?s(5RagE~FUm+K_(O48g}( z^0F&a?|UjTgTCm@UI28IO~0xPF+)n#q1oN!#9_3M?>5wa0V9o`wQByD!Q<46wrC0M ze#Mh+fERvVg+?tMPFRW6hns7?aA|Sobj5-9vPpnaF*1MvuT9zt0;&4iSrCV!Pe=%^ z>{^7xN9*~xOu*=h1no$=htHWnTZ>t~rGbj3-(G^wXGlg==O(Pm$ubKKT}nD*vRZ~ylnx&<3Ko~@5gqJ3y0U;y*bf$#*O*UO)Vptzz5%=+2h zNTt?DTi-K*zOIpeJ;fAPg# zU;f5DhYm>PY%dekk`@(oySce7bcYMb!#&cv_}sGTk=58yUCU8R0471%zI4EzkB4X6 zee3YSZFleefB$a#D?ha5C(fUFBDQl}INZ*`A|XlCiCK`*5_H>RD9{MkY&8@$ictkzX3c;hu;~sGjJ|$Xv9!QK1fjD@BfGL- z7xe4CyziJd;Gcrq23L4dibBzSARNGbL;WYbE@-OPDJ&Opol})Vv{HDK)>hE!0-f;& zy*VB|vjf=b0JIIwEh1I=B<_nO-GzXkLnpuL^E=H_X??=me zp3?eSJ$Q9o9upveU08R9;kVRsQO=RlTD>DR1ur7Je%9yL`HXh2n>YviiLcj{KKtm0 z=9Y9|#Wx%NF-`KPoOZ6EXg9`?=KB*`X+Dud+niIzrFh1KUT3uGRW_Cd@O)0l|4*Ng zP0_fi@WdrExM8Q9O1MhnEwn069D!=*bW1&tW@kKqL-%jAwpC?*-}W&3aP+Q?7=8{d zS`$+S`<~UivF-W4eE8l+tumMjnp$9Lfn!?W+@nvq*se~fAikmd-vn< z8V?+j8rCZ2K|!14Z5F-5r`U~@+ihX21hVTR{!*@#+AXoJf#X@z*c5%_{)0DSQ}o)~ zaU;o3orsTF#EAPWe&5*!z^N1%o%4 z5Uro_EIWA@p+0_)p?f4H@!V;gZwM44yi5uNI^>WSlzmC52{#zgk$p@z={K52x@(t_ zM^keO%=FaCqX)R-=lq*@93?p({q)gAML+Oz$lK?6} zvBU@fvE>wiW^(;Jws%6W4aIxIUF!w4&jNU0&YBGJHm5+tIG=Ld&qJ)aH|11m(QkGU zm|Qk*E?`4ukTsgyJ%+NKL)N14prO}Xx$Q+4ZAJ-=cYniN^*31@`ltC3mOiGA-P+d9 zk(eEJULyAoM*SQnf>t*6s$O8!wr!MfLkXA0kdPyXb9nveA6)s+^v=Nrg5I=gYJtbX z0#Ezc-{CGotVdy8RA)Uij_11?3IJP7u+p?hccPm4Hy#Gy9j^z@>^m2`UDkQO^R$Nab8!AvU=?DqXzsw9XJinuU

    zxn?#|yq@%|kbP~+T*4>?Zu<4)Vl*Mdyr|PETuXhd_M2X6?x*rALBPIAJ9>e9?>%*+ z12f;j4r&S;^^ljEcR(jIbP&7oqnf{W_1v$|99SS$pf<1)I{Xb&eq`3mMCJl-OzrA* zLJ%LpcP^^sC7r6FED^)-6EqR6D51j16&LK4Oe@IQ108s-2r^ExI#RN56f_cYTRW>8K7z;aWfI0!0*@>Uayx zqcU;&N$pL=A%Wq%@cF`40G*TLu(no$(J0Xo*TW);3SgMBg=4k$5(M}u6D2g_+dFhq zG=3v^_L7I2}r8kYZExw;wz-yJz3WzIyj>edMMe zyI?&wMPr*W)}m=-8q+X5ti_2LdGwodq*X6rOhU>jC$~Yy3GKup_%FI>Gj1NA_zMCr zh2rGe36&b#P9pIGz!O27Ye^I23Z(eSvE)P^iIth?h>1o4uUbV~5F{YkIkKv>MkSot zAMExC_Nrl$X=^l50d&M-TZZX_ipR((yAN|zJ#RV zrKL%?XDcNG2=+P$iR^hXW!A|;Gzi}K>FxjSLpMKn*?Lsbwx(oPk#fr?vPO(S{LwNSi_h4+@vdw4qJ$ou?^EQ|0#ge-rWSbC znmOD>$Xr%KgvA76PEleY@d#^F_^-KQ8-hP}&hP|H3h8ok^~7Z*9HnEh3>={PL!5MG z7Edd{hve!%l7oiqfw3OFUslK_s;hW8G*ciXaJE+9ul6@OMnUG8IF>fugV>T|;gyG)H7MW<3|qGau$gx5ZG zypw21Y&zSTB-sUk4)T1n6sz|UqYJ^r812w#NZA9a&oRc8qbut9padh&Kt4^^Mdha@ z@vd-hb2CnX0MY})9Ntv{UWAZ$H1`8+uqzkX?1E4`&E{&e9oq ze%F^dIWv~rA|ptjZG43Z<>IrxgN-!nSdr^u-VrWSatE%1~t?Z=);JPfvM z`fBo24eSP69F9<*ksKI7Mn;JGxqFSBg;oZKvVg|;7BK`-0uQEp<2AE?_PL#FvDJCs z0c_ZKK(<1R+#IMCa#OPo4zhT*B6;kdK~&FK2HO(#K#tM4w65RoFnEnvwsYKf=-@*S z96}*|;~l&Ibj|HB=Ht)1@hM9;oVFYr(Iq&$8H**w;E}$qRqWh;MlexYhfK-i9al8z zi8FzEiDc67jXe7cm)&&wsyK8E;2OW^J|U`)KY7AxWK z>Q0EThnLo-q1cKsxMHX$kPRHd4Os^zy2XbVq0XCSsukfW69n0XPRULUIYg%_!G>R1 zjF&8S7`pYnkZclx;U|9UM4r^D^)uF=%X5jVgSm^w6tn3}qyl+ui$k3b=Hc$}#Pn_- zJ33T|Pezk$-%39e;*_meA*&dHn;DU<(S=VdoryNV1(U6^R}EG4?_GQMtFPF0+C`hN zDcYZL7p`UJh3C$J$a>~WJa?#{b^o)hKf5x~7dr)zI>^FuyZmm0!gtGv)$B9Y>_qNf zv~~LAjnQZ~MNTd7*jwP}(WiWB&xXxToFoOqlJga%0e_n~m zx$yeg3t*m|JOx^-#qP6x#cpbJ&;fLLR3&+V9ZMJjDZ`(CthwvO6n*S)^)48-Z z1zz>Egtc_k0&RHD~scqM}>@hOGifX-bUL`DAf2tz?u-;#f=^(MJh< zTyp4hD)AJRT&iK>i&h~pB!kjgRczI{!a}2zM22u0-xULaeT<+vWM8d5AxarzbU-?9 z;qvuofBr@|lDg1{yH-C8H_NNt+FC+-&TeA~M))wj-C>iU1lBY%U#eup5Ox}39aH-P z+>u!qw%A@Ng-m4{ft1j)Df;azcl?JB--?YKC!mTR1X!MzG`l!wEW3c+BVRJoYujw1=q$esnGH)W6(^2icvpVkVcM5ot9^ zA@FJrD!B&fDKb>XjX@Yc`9jvuv46v^vUU1fZNn(q)l{d;R_9r4cwYMD-J9;Z=l(;u z1y8m*M`=qS5PF-Q)u@Jw3YL_yD+9%Mvj;=Sv$8d2d=F^YqB}r%@TRn&Pidpd6r}0zs)D^VB{IY&rjoIB?L3O- z|1cxJE7hQO^72h6p)J36XPI7R5ZQ?igfR;{ys1`WvsKGtNRs0ski&!iC*n%bi=QjOY_@Pt|15UBjb=(uoLF;tRB zVgL-0c12V1QP;(~Xmz9sFbd}8nw0*g^y%v9y<;;-%U}}sZlApE6ln34J!gvP(uOH(RlZBvNt^ zW3K|fRAMzYV}$`ipur^8pR<0>yw8|W!ie2o@fJK`-8s#(kPNyq8>jGqS{qrY_9M>St6E_d!#T{8gES+TGwxu|*6dyncLwKSLoC@JKPcpbIP&b20$_-2glKJp ztbyM#-+ndjBGi>(J9l*}0!|{3{MK_SIgTecSe$0`P?5}xo;4_;1N;yPy5wlmRQZO) zcSTxXbs5T9hu@>@lm>d*!FY{6w8C(7M51R7jWS1ps)GnGg@iWArchf3uT24?7hM>f zL-G95J08qXa_-R+mfTTSYw0$<53njO)4wBL=rGDoI+DxR3R!$oi)3#tU3Bza7pz-I zCV*bc15l)1Z(8*to*zN11)Mktg0~}vsHo~&_9|98bw-1U5kNH=!54v~huBG!PUEYZ z5qOopvQsff>PaMlUVV#AfH6zrccmAu*ofz5Rk1tHTxDMZ>F&tNLw) z+t!=~MMwk+oz6}_nAe7nZ;?aE6Ybz72Rz+hy{I@>wjh9@! z`I-834sNvLW<}cHJcpNWsJeCk^W=Rps*fnZ5yfzzstnUcM5F_AzrXUHbFMr*eQaHZ zxG6NX!1u`lPrl;wc#s_y8+Apf%_fmgCH8vo&oEx%M#JUn&+`7k*gDGyP(qvr2Z@B( zu<_1S^S`@t_CMdSbJdnTyZ7O#&hkDKtzc`#>F^}{2+Y8WFk;kIT47(ZM-4|fq>xeckrQ!QgY&S{0~DOR|T|0L$xvPm$P zFm}R`P((;=N+B(Nl*Z&+)9AN#*L{;R`br(F$>>Q2U?4%N+)7qq3Ngl^oDNeDI~ZaM zM)j1_bk6mA|Ko;yrNUFr+k@YjPFc<=tUz03*?AWqXz_F~5(prbu=-fUho;p7#fa0g zmXnSOS%pVMnR~NI=%s79FOTJlv_@@AN&;3o;xPIWc54lcC`@UBoFGj)ZIt)wRHWst zg85TjM_+X4O;nYvT+~VxcC{65B=8bRctiOHRwU}@(^hPJtJlvlkJOQT??m-yb1-^Z zY03#c*4hMz!Zk84j)%SYx%s@Ps*KHkkG3P%aKPK>##ZCa@oH{byAxL#ctFSRT|4{g zkKTsc37;V^Td8L6PX`RHo{;bFj_Z^#HOGs-YNyo1@RAudj3}O0(`T=m!!tMDz4D>& zQ@t?lc4~pC1&RgmAiEF#Bkm$Zh8@Oa!7LaqS{4Z=b^iu#$H@AJ0U@FsD(BPJ%)kDc zS%i_xzqb31o%@d5e*k+n4$9(iRJu`T9_PQdK3s`w`D%Dnwk&QdrMHfBZTgI<6veZ) z$=AYfKb*8b@h~+ILqL~+noM02$0V5S1S;ha35*pp8bW_8`8p{v{rrFzE=EA5xRgUud90xuYmYdn9c*js+?UBe1usI&= z$Ww@Z$Yt0R{ff(P!87ijh3y{rQ*p^|#g{CeVGnf+qLEXQRm6AmX4G4%xxS)RXwX<(qHTPFv z+O=W(J=o{`0B#b@t8)a&P9YYT5=Y~ZOw0f3J8pA4mw5}edByZN|1AVe-sKgL+ z01xOmfVUQ6Q}hSFxc$YKZGQauGtXGk+>=5h8_=GM=9g&B!>T$EfT5NSZj@hKCBBMZ@0$Rt>0Hp8^Lby|8{oPy?k*Y7%e-TWIq zdFRV6-EzWGc@iKDTQ9p{-Y~Vif6(@Cp!RMoQ%8Yba9I25^y!FK%dbnnR(@Uje%1}s zzNZ$LTHtYyd)mf5NU|qixXD7XM*vw=iN)t*|90mWw(h;}(EcO$%M+3({h?7{i0p*eFs|H22xhMC;p9=!39}( zC(0=_gMPA2i+XJ5_|}noZ`!fZ-)f66O{gCY{*enjyCLsbAu2vl@`$+vzJtEcBa`qH((#%= zasgl$6)=K@d28##71)*vBZHzc)I?J=&1D8jqg4eun0lH_3S5JyaLm5{3V9dd(>}Z7 z`71V0{AsDW&_ZxO!H>s<7VtV-po5SFXeM>xEK#Elg-nu3yaAKS9$qhW^u0bsfvSUW zwM{+aWIJb%MS^QvxqPR0u56Q0`YOEIb#v~3;rg@Gb>>3mwAG!|mt@a?xK>Qt1lq~f zx#i?TDRH$I?ncPzU%8~yHZmBd;)yAYSq4}3LNMALxRMdXwU^2pTc)v{1Ny)2W4Gh+ z8Ye8l&GO^dlDK)q_L<}Npr+qWes|~!#6`XRXiGI#4eoB37BEu_OfB&JwE%wP{rc`j zOTSis&}2-uM8m_H4mu_CuQ;|)YsMhLNR&=$#Llrl2emWl@=Ce1Bu}@{hDep2^OO9 z`TLu9p7qIFpT1=Mzqw%Md06`E>SRfmnMQGH{1im7otT<`1Lpa%^UgDiGfp``VhhI$ zFWUT$t9RIoy82we*xmwJ5L$w$X~HpWTCv2@3X#6la{$QxgeruTiuCRb87xjeU-K>$fhMdC}q-eFuaTQ42c* z&wc^8ZaK!=*J+I(79ru2;dP@;>57HSkX=(ftZ)^3OnAsR#2iydB_R9A3@sz7ECYBW zdAr&kl$1Zq6dNdvpaLt zkgadGG&%)R!@^Q!CPA4pL68&5FhQI@Q8^yN@e#du-7c&}zx$fmU;FE=SYg1+R!~KE z=LmMT=Wj^;95O}u3b#G_&=gtiX&Roj8c)~R{qx%%=$@|g{jD9Qy-zJLwZK!pCeLF( zd6_Liw|P?&C4&QjNs$~`;00bk%lfk|HQ*c1rhC)1bEmJFTk(&(x6bbS=KTi_-#1!& zMu{r_HnpV`oKctxXI}Mi`bl)|zRM^OBcU7R`Yr3gvC^Q_&o93BL&~-t@sv3k%6Vd=M zOiM6PC7~Z!tdn3e*+uPtO7A%emuwYF*~8p%QGSPacJ*^M5g^yY0)pKlXS0*)m~vPxhY-J7!J#$P zCGkoF$;~0o2(NtmSq#P8fVFw=Oa`Su6DR_SDU9rf58g!cOCP)$R>cRk zw4agX8?AoE`v?2_nW}a`^vm9MJB=YQ_{r`z{FaPR(a-iP;xXbBnh zjXEER5uYbmY+XehhZ)aqD}DC3s{5U4Ws5YOv) z;J$<3`R2WM?Yd{_=kGk}(oH{g!3?(E;pN)?xTG#omYu71c5ph5=ae~dSw(S1t-7DJ zWc^DoyBY5y%o{=x{53Zr$b0rQjN`p{_BU!}(up*xxg!&k9%hntA%!^l@-$inMlNpH zO(4IO-O^A`)-}bU=Tkf6Hw6+v6W}2MF-nlx*%*zBLOP_h>Jzp}24EDX1S3$hNMCrD z_u5^r`S30HCFrCH_XUr71(6Ha&+Z%Hd!umxNZd*sew8I9c^xPvAA47>reJnC#hF7x zC2RdwiL*!J#kb41-Dq9?-yJG(t51K`NwFQ^<9g&0tO&PpHP6)<>QgakXsyo7 zQZuktm-pJdfT&?Z}{=WSnk+>~F}5!fvgF$H+!*J96__-!}HTOI+K0!>v(N(Hhek8ENqT{X|@YaQZEE@bbN z;UNhCi2k07t)r;(LvwNgpgx8a_Q-~KAhYE-Vrnblu2lu55R#SUI9yry(jRz@zL1&q zOoA&w8YP3R-n(}G)mPm9oW=4U9DlBwm58!RnWbQLo_fYnZplUT*o_Y)YrJSICJYIZ zSLmgp6HL)Z9MYOf*OhAkyO4?>>;d-i3QdS5z4eGg(Ka;cT0^U}TfxLARC6*8fx=Ss z2`-_J8lJph8HFp7VmoAaNHWxQ@m^^Zer-h>jw-kJ2As~OK9(%TYmR5c!*6SqIieAx z%Je3=FE4$#N(h2p6X2^H3oO78Uxfr^--YR8EH)66P=x4pXoxNN(z`@LnQQBI{=xOT z-?Mt|H?G)r>WYoeT8du@WjPvlmiMHad`PH5>@biMB4OAKkpXuOerV&_SKT%(Ri+l0 zTHpuJ0w|tOId8)$OZ7!68r41ImL<(eG1(~DdXla`ziZX(J66xX7q8*IanJT$`%pQ{ zhK(o=3AEMYgc>u~W}N_B_OavPbCp{`(y#rscsufXRaGL~6UrTnu14P^LzvK1N!yX8 zDTY>{ zpjy%x%(Lbv5leZR$15I`&sscF-$j`Ds3wJyxf+6+ESR~Ju_g{-iF{Xc4e<79S|jx| z$jaU+#_oi%ub-tm{ZQ@P{TNN&QSG9PS6YLTLQ=Pml83=UUIC)jGkC3~OD~mPTGe|ihEN{m zJxNp*+tKLzQ|!HXQv1=_(t&xYYt9+oSY1>-JgYl2l`GJ(S!_kJiK;$N;Q$0LGDSG? zHdQN22UnSdTc8mbO>*^(_ozaeW6-tgV23*C@-aaq3*wyPa@h+ZvYi8K(eGTj19w|L zfBD9zU2x;6%jG%SwtvIvLwIGc{Q^I1(uIQAGq1S=CG-zqR5R0ttdM)GeQ zhT5K_^f2W_YsvwmA&1{x6T2Y30)z*0r1ygC4y#QxhpIlcuaN8`%0pRy{;iL1d+t)% zOl8hsC$u<*u7VCcp%#1Y80t9=*IG{SR_ofgFRP-9WJK@sv07SSsv({!)nKf0J536q z+5(JJ@-i+;GvdkL{dNvv^iY=CrrO7nOiEmArVc}6N-x=Ua`|MG!4hf8XZU3kx^N*m zLq|tSQ9?hVXvdZwtc$+oGdp};w78#@ukMg^vxXq2VMAs#%Ayl0ygD2*XMLf}iI&Ki zt))}BlBF^efzqRPifd25Hm43MGp86uW$zIvyd?HRWeNF3u}&-f!D#0>*X_b`^qW7u z{e_oqIc3Ghw_yFbyMNHT>j%}?t&OO7_R+gPyZ!X*c1)|3sRgDM_<^;67SA)MtnkFt ztOB)(U>Ln?GJ5Kg_0PTRrjH#$jB^@jHsQ(4ULmiP~w09+M zzNC|VScpD!^#8m6&e^?Ze&W{uZSndSlyvN;MiQvz&_R(fa_%%!XBoi6T~0c>z%P>e zE<$}22C_iiD99Y7KwVYtvWy%Was7^5mf5Wp=t77L`d)Y^QxAO=x9e9WXwHhHS%p_Q zgiEJd&Bhkx!26W~>Bj`3M|SFPrKgfE6G=Adb(t%)RRR&!v8x26Y$Wm5TzNZ+C99vK z0L!A0Zcxv=Aq%nAep(i?HnXtMbA_9w`>9VRnUu#-NfH?PEqzaZ2eDeZy8w)WQ-!2_ z5mheghrO4+I2Hl47m*|LML&R}5+)_aMOcW7w9=FckbpoT^Rn5RDgkML^j0mN!xTVj z7ivtNCUEhSjDhUrKXd8&mtMU2^lR=ui*=nlTjN?bvt)%<9n5^sT~`;Vy+Boei&|Q1 z!ppx6ho0ax9R!SiahyP!P!*if%KwOWI5SLiHmwv>t53;dYklbqmmGf)XeD2$&OEE_LX{S zMV$==lJ|W-aPXn~58gbx_xvy2^&c+3>52Lne?L1s3%V>OCy^LEp>j^6$ytDD3nZps zVJ~iQ!jhSn#k&Z{a|+8j27h9>qQc}=GEwATWQ{fjhn&8C?u3+HQZewd3zNe`0E)@% zIYz*%0Fd>RM&Er``394qHW4|v0AY`!UMC?iohEWf;rf#_N*&bC`25C|+i*8i_k3EN z)LG`44=A#)!Ro13M~a2kx`iXWD}9M&TP3qtLE<3*Hyhu};iYDgpXD^wCQ!(7I71}q zWer@Fk-<`{;`2^fo2>Y6wH30#Bx1iRT&zb-1uEWPp^uMIwuc^^jkt<(Vx8b@_3MJ@ z{U`7^_sh0?0EIE$C<@Q%ype}=KYACZFlh{M%2-e>^y!%$QWkhiW!}rt>E>cZ!^X*h zHw@LN!et7Sxx*$6EIxOLR8ek$7CA!M5@)47P~Jw3TdncVDZu5@BTPii8{WaVv=y4X z=lWe|uG=}SPo@@_THpuV0#7<`@8iz(cd0M}cOlw>xjm`Fn{u&8BLAs+#~EIq_q1i} z-+#^4FWkEGUc6cF@S*$ewW3!lOsjiKVK@S^5Jg+omR9a+@yz;pgt?TU$!l`7cPcOh zAdLk%TSvQ)`Z>yPBaoqu*3VICvvnv?n(&|gQ~Na-Pb|T!Rba-ucJKS(m+yM@QUS?vW_%l(7=Qq?){g z1QF#Nf`2qwuBjO6y++76sr^{ zGF=BZg|Qn_CQB$FKvQ%A?K*lFB^{3Pd!&gpuJg#yqL+{+EV9`n zrAY)pWZwAr#Zo{2$r`!2yT1`QJvJsUFxBOFNXqm;pBl2#<>tV!-h;?}5 z;hF2^Q9}QKR}NG4rWTl50LAmuFSz{$%Ql^Q;U=l0JXc!8ZgY($%3<8LjDTAwaG%T1 zEm{A6oOk1kF5dXxKl_c%ckOxT0V)6R{Ee=3oK#XaHDnZ}UZzU@?0-^nmQSGb->%gT zv$=>uF)WpH)Vd4T=a3*P>Vx{3l672u$v|Y&Te~|1G@@JilP>iC!}lNj&Vz^U*}s47 z#<_P~b?cKCuYbb%GtXXDis#6!$e2;{blEdAxSb=*twIl8OW%6Nt+oCdPD;Ef;8*c3 z!nN~pQ+Y;v3I0rZ3ZVF`^=D+CNG>F9vq{RKz)E0TmNx;HCQV*~aUdyONmIbp@Yaqv z4%xMl)$h_{?LF02Vi|Z)N{{j8g=!+zQ&XzRH~Q#HS}R^#t39nXI#R2~;v3Em*zq&~ ztUs6fnZ=b%Wc%2e<)Ln1p#NxfXXR*FZk6)VkRhb7_hQYv*vk+|HN*p1;k%raJg6Z@ zM5zz6+>MgE7Q-6B+Sj0(Ih!kr+do3WdODhIFyVLLBr z_EBlnK`m)AQ?l338y>%8{VOls@_{w8vVUWAYjJp>IavB3@NmM>eG7_5Q@C`vE-!=! zg|1S1#Bex-Sij!8J>n)NLQ+O~>BKra&{_#N0aNXe!zSMWVn5u(?SxW$GmNNYqj%x7 zPid-ZSa*UM83OTUJd3J>xg zmgP2|8r#`QfUT^$7h%)vg&Ur5!OWA-pZWCtS0035-0+YyL@nea;ibW#UnnW12 zkiY{@aq|&2^-29)vqL?!v{JK-!kT>|!Lb!Up|{MXm?GcPVkTwJO~%M?li3}*d@V0K z0;TkvYfVlpDmflB&J~%Cm|*ECoj$Xt4qOgxO^hpJ$r#-UrLs$tRt}X0P2_d0LI+#W z7P~3N>u1@&u>mD?^^@LP#@ryBM5|392se;LV5;hwbAy z$}nRry(m#EbaR323=L$@*ys=uruLGIcoEXBcdedo-uPEhI!%?FTHtXgo=;jjvuLTk zi!hU8mtrhRdsNpzU4uMR03!Bj%Qu{WhpnAI^UNjd-*nY2pI$$Uvhdpv-FyFi2c;af zPg{Hr)@8j}i($Zhv1&zfDvUU20Q9t*xCe-Iea^;Xpn|~PKIC_eA$SL)+Q0l7zo;|pWut`{5cC$o))SwxY^&wai)>aTOo2$S`ZIV_ZNhxJ!Y6uVB z1ekgnKr$WVOBV%SQ*$G>&{TTWq$sAnLkJe+Q&iJl~SCc<^y&}xC88vNR#F=OXUfID#s3oTrBFWNxq}ZGha=-xTU+R zgcth^dJ+1fhLDLHizn;HVb?7Lg1|8RHsat_E}1^f4>zHkUt9<;35w((6CpwqYr=NO zR_~e;RBb9CK#oP^7^8CqvEr?M7ISs2WC7syGxk5PnS+z`^{P3Qm4(&8sskIGlx>|^ zxJI6v;ar@9I-vlEfl9!=bB>X!^2i^;~wZ=SxaRc!Mlo;2H* zC15#W$@-UFy5;oMbF#?U{r;=L-_x1Go{2muXrV|vkq%f^%`&pD3?(I%gliefc=_$c zXUT3wc%;HeWP=>1DO;5sHboaQq9PM4I>zWR$k10^cC*y!ltI(V8S9sn(5J$xUTR`Z z)ESp5RzG9^hQF%PtGINSsKkKb*{46Ch_y1T6rW}854t|7*7MZ2rwhQY;23S2DeL1@>7o)6|&xnbrUIhqKN$;MT#+DQQWx5%=L+`+JMfQv02}cJbva7mi*&|I_DR^?!fk#%pfA{jmr4 z%a4l6DqN|&l=cuA)UM6S@SwH76GH@0sR}XNbp$ot2$oU^cyre9(mc2X2$eCIF`lo) z>j%5a#?Zd=3C!;(Y3Ewz3}1{^CzxekXy(ULL=qPmdpXqCzOHfTGOxMQs4 zip*h}VT12gVoijm*Ji6!I1&L%b54ux}^2@|^Oi_AK( zb_i&?xrzw0JaCdI_Y{qK_iqf>pDB7rLpSQiEJ6Ett_ais=Gh%libxj1 zR$>*Qw30@3N=+5#gG*PN7o}U6WUeL-m@wU1f!jj(PXYZ0-Hyof37;jDo~;<=H{*~A zZvEgTdp~%|ZYiOsnq(S*X#{?_M&OO-ZGOXQOQTsTltm5|%s*Lyk-pwVIX}+3{0^$UF5olIFqw zkD--QBwuKX$pX@oCNhrj?WeHCw3OsYCzz?;$@p%jC#`ss_PoZK(M&Xd#iqVcUN(ek zQWNT=Lm5a2BUy7EEC)tiH8h9P{-!PQoRQJgj0tzmX+x;>XMKO29!&%c2po5>1}!$M zc#}x5DGY&8b(1$(4!n#awc?AeWV(-16BZ`B#56nLG`DJ$4!R}+EYl#s&mwS}M_cHQ zO`isetoWaGI-_~Fh8M$r#p*XO=Lpk4HPg-cUQWmO^ksi|l9N<+!@5<-J_7Kk2sdV{P0P>fLtRS^avGQ4t5z?_ zqlL14*O#yT>cTF0v$1?xPu_8tWo8zbQk~wFC1_i7x=}Dch@Ryak!b zpRJ_;D1#j>Uw^00bWM&^TdTcgSIXwcA3AWu&O83#&$hqif-T3%^~K70xp`G9XB)I; zs6EeWQ!ZX9r?RsN$APE}Yg&&H}FlEC|VBl!C(XA7F!^TM?{&ZtC8^F&VumXe;y1sO&a&QB;dd(wCfZ zF5}Ml)^VWA1k;^4G@VNg$eP}LM6CW3|=_Gk8IE)W}K)|t4 zv1p}^K#>P3b-Byk6}?|3vw)voq<%i<@`E4!+Wk{CGL67A0zY&kAjR`fd}8sGwN*Ux znIETRoT#fc{-#-}jfGuIa-aOSh>}CwT`?N&-TL@%I9fnsHq09C9fEB7nZHQ0M^Ti#9>|fLwp`AtAfbZz`6;@ zQIi+h{qh&C|InpUr%@(C63N8jNh(&fNV3VioKjoG%Cj9Zc7f>}Q;%fSLE&yg=(+$~ zN0TuPM^a>F$&?ST7@w?rYvY3=&?+}s@m$%a@-!!6X|aYYIi;d#q+(j}{%3uEUA%uo zkGn*I1p{IL2O1nB27jAqwOClIGOIS3>9mDkRB_6oYF6!1z1m1xfOTjp!18wXV42Y% zH{T+FSs1js(cb?YO*IRm5QPc^;=&;(pm}IjcNX5M0t6wHmY?^RcT>3WR^1yLjTR&U zX?PheZ3S{yKUWk9ceV2RGGoTzRKiCntb+X z*9SN5{qUvxq=f#Vs~jeWrxBP&Kt|wApRgt9eC(w=En`>D^X(5DCvw*^h_7W?Hgvw6 z(qF%3@q|?i$E=wDsq?p-`)Av4xb+UHCm(%azm%j}MYrqG#vHJ$dbJ|C>SV5Ht%(`B z3f=6>PH$@7GvRu@QLUM^g^$z^by!gX#fbyjk%a(MUM=4uJpbzVZ;+?> zDfMJFL4s=tw0g;!`9)>W1ZKzaU2pAZV`>_OiV(mdqL)ee%vq$xMKusiUauG27WhJN z9#89Pj%AWYo{d&TvoatRqa!YFO%4^s2E^2E`YZ%!zyCSk|BUYs;vgnbb+Uy-UYF%+ zvrlRfrm8#EsL|v^w^fxkY;xCY$g(Sn-eiPDbp|jnOJGo|OA}fhs^b8}FBNNd%)PNz zb(l@4j8(`k><hDimR49voDf4( zA{2()v4JLxIaaiqCc}q}TFhevrV#v-yK1E{d-s=j zbW6~hHINiIS!B-jRwS27Tc(xyXpqM_`v~14>n_x}$+dWkR%SYlCPPC*`mL7KeJV7UqKai6?l}A`Ai9K-naJ}hic0JzCc00SQEBlHEl`8@n7gBpOd4~ z09-=An#4T_E6wr%NrDA5_X!{JDFZZHq^hh6uK-e}9mEj;D8wv$mN%cjkNTO8cpiFQ zP4&4yyl@_J+Ovekj1-FYlP0Ya^K_BA8EJzeHlYF}cP(@!ECb5b0RjRM-Vq@X6M=kl z{48rbt!`I9V5lRw$+aLLyG(1VxdEmUqlNU~SU|-wZP(`huouzO!>yky4mkpiuGMC5 z;($aDa>QEDh89$eC@X&VvbV}4@(XQ%1fOPBHPuwLSth%5a$s{%F@Iu85>uQhe^?QG z681SBwXOrAm2?3Z;E-_@k`%xiSn2-8UGLj)^KXCt?x_HoMqnC&ALME@J`ZhmHr<=r~5;Hw#?D+&w&qRNklqq~e%`EMJz?ZxL?RrwHvXXw4U% zBP2C+$pZKIdDbAYN<)2G5j3hcRnc>tSuqo%dATtSHwJdc#oz-JXAt@j5M#QSImyT| zCN7CBFogrUU7yc-palB*oD>;EO9)$k7Spl*tPw?()#z9hVXm765InuhDr4@~OA-f39MvGk{+GI9&g{y-=9YpJSO-2YfAzN@< z#W}i-e#s$N>J$ouATa*vc>vNV35VSSf-+q_L6l<$MXu1FziR$%^8UI@^!^QvoGvUm zCcVk-D>g}$KXZeYxV=^vjSd3jB%+c`*urTGNag#lQv~1Ttu^n4s>)d>T`Cro=#HJB zd|Jgk1%4oFH)onl5Uf(mUj}{)iV*V}XZ&~}z zn{JVJ+&y|gK4Z-VX%?$}5z8{5Q`qjk7~E6gHz#xbJXEyxH7UaeST1Hv#G%SQy_OyXfV z!zjly(*lLR-M|eIfDAKRI%;4@Iu6jlhZYEJ8uStJAezG7y6FfdFr%|D)XB4=*3a?% z?nBhi8r2-G8CrvQuEG^zUxWs^m7uOZ3TRQ?Tt~x}$w%>N%tnmSx~U|>23wv0)0%3| zGN0(?Ml$C!pk2#{W9demomdQjE+e}sJj*dTCw$=2-M{xo_e%*ql^@dxOe65aJ_0}c zv2VZgoXc^~KzEkz&ehSn!~&FL1bZM+B;~};=k`%#$^P=al^@)4|H_5>1^j&#!7aJO^AJ+gV1f zcVmN)Ckh~d=%Gl`)}I%C;ruPXv+>sWez(UMZ!L=Y`Z;5)W{0bI$PLtU;$*mXVi~9^ zmdK?7VQ*zaBl3CLVXYKv>TMVBrq*b576K+?=M!?Tn|ipl15h9s2Wtgjj*1D>f1C8R zb^rFyrq|Z}u-8qK|I-NQ2uSh#lPl*>TRo>sj!UK_oWP6lQ+KR3*WYJ{Nnwc0oY$?< zn)BtW7T$l+wSRN%o(CV;|L}wR@A1#A3~qnO9#+DpKQ7FQT1xA~ zjUCT+lPR}q$T!MwyKCPCe|6K(U9jcHmd_u*swp9|n_2)Et!s3#Ot-{k$jE`95`tQh z;srcy_35~dmnf!D2!m+E3{9RQlrKcvQ-piR6RT$pPYs$%EZL!!&fTS#Wg?Mv!oEw} z#sT7w7QG@|@+>Sgav2klF=pw?E}EdroTX_u;WGM$s{vXzl~>FGc&q5W^Y=gdA2?*iLbAsJT4pICp^?+?6+20&1W^Yr zDsAWBLrE#Mfmp5TpLdjBI9V{u;ha5K!jI!eIlmpqq?p9OyNe0GCQf4ZpUkIn+=dOP4qheNND0~YT zmA3*6id_s0cSj^E_Gp4zE$zar!nA}&}5jSCbD;00$pgc*V95L=?BZIkOV0@csm{To>dwt*A{b{BiTE0PdSVtl=q)jKWTWwDm- zA2(2~JVmsBlk)RMa}@xnbQ0&5sK8yIZ5^qN-BsV3%2_}*V!ZDy?9$^Y)Aqxc-SLZy z`=2|d!_<>$1djL-IDTQ@Q3ns6dLHGz%q*1}?9`2OwGf~oGvuIY7SX6^!d-mXs)ZLU zlSg2-eCG0-ci$x+yxxDWK3RD9|4LZuUKHCPz89c?Lb2_SH%jIF@csKAdho!vZ@BH> zuD?zke*SX(k|5`6=`RlvcXJj$hKN#RX$_YF=|)o(vs#4*xpW7IQvI}&iPL(@*W$T% z;q_}4eKSTO zkKN)joR5W>-V!JN($`wiKNg(6cC%c?zfIr&oa@hsB@aRb5)(w%d@=dH&g{^z3&OPe z!WDmzveuY2P~k^wo$1%+GlW%Lnn)e=NL}rcvoH2Tcg$9y8HnFb)|dK2H)i-IQ~u0N zyCl!Pb^C)ye8n*hz%&BSp%FNE@FjD%o%->4S-!|~a-8sUH%e>U)g~eAjibsp8j37A zQjj~KZ&f!_p{5?I3FQSHvV<$|xRbT$U;V;0mu=o9Z?%x;^5mxIs*Dd=1e<76KQDdH z^B7<(I~$6(OXVz2I6nN){u}q)dG6P5JmI{}KYH$*d=Eu@_UzVdqehJ(@}}&#j3K4e zHbpid(bNjtST$nyrs(2OjxHvw$e4$31)GjF$5EJaTwc9uLBB@15O}Akv)`zj@lRk0|$oq;k?*t z(a@>l4`ukiXsAOBgf+>_pXK*1`~KkU`=7^R5;0)Uhe~XW9(Rrz2r$#>Xc~J6uG8XO zraMe;f&hpRv-1NpnQmO7e$ChRAsiboE(|8DD+CEn6zj zm3e+Y>3nAd1EnevU%T+z=1t$a=Ae7Lv}U@on@8z!*lgBS07^9}b&3H=-@ z9j2~KBQTA?Q7@UlP3E<}RhSC4=1guU`Gylos!uB-qhfuU5V2k|Y-Re8S{mi_8S>%p z)v^#hcjBsr-&w!y${TNc;DP-Q-G9&inQPHfF*o(KEl6d9diO z62rraLmvdkr_&XsGp4GAgdi(I30ur(1m>!5bJ;j_rsW*MoC_n!Tiuv(*}HKl)SM}% zT>w1_n9LDCD1w-Ia^n&636%q-4(Rbxe5GA7Thn@-Phbm#8BO<0(eK}g`gxPp&j>S$ zpO`@&tKHVcpyjO{6T8r5aG^uXuBib98E6d%sWZ726`ZK>RX69I;|yVquh;Jm3o)|d zb*u`YmUejvJ2BX*W4NXcK=TKRY*d&qngZgOWZ0j+{@$tDm_}e4f#=!?96b2aORqjd zPUgs}d?s&KesBV(jMioW&Im{inMyP@(5ojbiDdc^;jE%17s&6$D;H#q_bumb{(ru) zef!=!AAL}7ir!x@=xAzYu6|^V(v09ZmqANjT7pa5^SAim$z#)Oidf4_qC!5+SPXzU(ssBrtolJzXD;(_+&W8!2TI61<80SW3IzC$gZLr}9m@QP}Nz-K3 zwSHbT|Bg>>)%9o8&k{TcLL>CU+=!^)WH4Jy*0gdlSMPATT~mx3lK{@@4q{?eUIN4< z8@nb?9GW<~@M|yU0VaqRPz<@G;Na(@(d{ZTbw$N~{kR#LG0oei7tVnjPLP-!j`w`y z{%P^~xmGw${h3C)B`MZajp{PUL0{qkq8{>*oF%1zOaK5)u^pA{Y>7W|3&-0(^Ichg)^vuyQA%#QL|22Iso8|n zhvtr`X=C-3vPnp~OrLAqis+g;@O!b$_ywC8RwSKiDxN5V)AF6!2)Gq&QSLe>_#h0h z8v$B0%Q1nItzwnav+$jdK@c3TpZ)%4dBJ#=ZFX1(L_BKt^YJ<6E8q1U&Io-DI?WmUn?(VE1o${fv0y z8-&_ul<8UJv;|lclQh$F`qZpc4!{9OM3lJ6sX3CIz;uvc<`kA)9kc z6O{9#)lN!Dhf6FVG`XiYEpwp`XA)tg3s|ORsEzu~l#hODdTrfQY)vEZ936r6>tFea zztJ)nXLVX7<`rWkf+Qki`uSXPr6&la2@ol7Cj8CAnF2%xVjv)Y#=6a~Tf2D7^0|Ms za^W{G{O;Gc?%ro>!uKA~s#l8MZuNNSDtdTd$8h~wR=6L!Pwu-uaKqla*8atg(?5CD zKR$QvWh>{!x47GxZu=BJ^`{vvvs)x$XQCb+$-<$VdDHuj5y)$nsv=Tehbw;M2^1lg zM3w~MSROLlb)0fu)4dfQevIs6H}YPT_pZO?Lzl{3(6N$JiDr<1Br#RG9JHDuC1Tv( zkU7+JHC<-m9fdS1>O^Rgoy%9g%RJaP<4krb#ROCBT2n(LvufQ0QTO-DW%gc)IJ9QR6BX#Ed2E|!=qsj$iKY{d+PtAyN3I{skmZa_Hf zT9>;fv!xRs{2?J@<;w^F#I-QG04qy(X+yNFT1Cu* za}*6A+-mX?t`We9?G&!Smg$qsvcl$AU|^zjyC&IfjMkZ_cL}yYG`gh-_o81RZvttH z`la9O{_P9*P2Ws;j#f@nx26%$5qQI@x!14wPSsJFKKzW0Gr27__obk=+UcFo^O{Vl zx}!AV+1&DG)|`bOP$`pc$n7OBS-tSWbLZrJ(Z9d(`h^|0-7g<5d0_v22mDphsG6mw zw#Dc1b?K2e;7R#y75Lrqwr9E3S-*$!;Qrh1+V@9u@)_=HUb1ZN=;d>=_$EX>;VoKS3%0-qhXu%l`lHtcRxqcqx&&GX?7E^ip?GNO=i&S7 zD3IE^E~ahPw-yxAwtfH-1lsc@-hlz;!k*iC9;FMAv!)$f~hg{Nf zI!t@r?iS%sxQ)PW`^Dg{Sn6)8-410O0sJsG(86d45%s@MVLw3O-pDob5D;_LO{2_q z$-IA~U4Ql{%56k)?lu!dm>Gu}r7jcU*EG493mBl!(43M5P8Xz%=0RR!74urplMmrf zNO}=In4~}(D*CE>8uGb3ybx9^DO0m=h{iJMQhGRR1oS(q^4hwyH|?E@jA;a>5qJ)d zfE3TCu3nf`@x~cjQ$VG#Vp`VFRARMaoaeK6hFGK$T|~0PXO(0ywaklxFga2TR6QWA zQo%}&kWXVDeeT@PpMTYV{fiy)DvZY-koPd}mz$zdFWaMoGw%tO zH@>^)tUuoNnw9ztqddv@rgdr;y$CIehKHPS27YJr4s(eW@?K1EUDnhi@ z8%%G~KPcz=v%deixql-LmK@XeP~s44FtqivhldErA=clZ_G6BURlr2OhZWSJWW=7G z5bWYQgRnq?1Krkyn^Qv-#yNLfviO7vm#S669#@NsHdHTRHkY*ekk=#d2ZZUiex@SX zDuJ*b^|LQ2*NM(m6w_uaFKDnu(01(f@+8)u?fn}vPoogc$cedt2l0&W(QA_;Ckp~H z1-h^VY+vY(%3I`j6CsWI9O=V8{S1FpH>XS}=59D9cHwgpjifNs4MihB=NFE3L3a~J zh!F=MW|BG%3QJlhpgwHebLNIUzqMhnl+e%N%3BI$OxRiX7d@Vud;N|WSKfw zkK~0$lJZ6HHScJqpae0@Wi7`YfKm2GXsM#*p|)d|&%bc_{IC4s)=yutbI+ao9+O84 z@6!hh^>z-r!zz8_zgz^N*Z6_v0(|oqoFP zOh5QGbPr7+AOpgix~=0g6C5Wx^@f>$(v_;IE1U!nia}WUAqm%QIn!&WO4d|IK|t=a zm8S^b<4+M30vthO^nO4dg_`3=^*WX$mZOcf4n4m_pFNoa+Wp}ra6 zYDKtSdP5S(%Bk~=x&&t+69i3@QJj7fX%QPEDG03MG&mq!UUze%xoH&kP=pE-pj*%5 zSOCPGfv^nAtom7_EAPvdS%53k(fCI|7J&ffu;iF`+GDljXW=SnIx7<)0$xuA{hyq4 zBCtgOVlE5`li}wMMrM=au#-a^a2zmw3vY!90T2b7b-tC{HQ-;}d*;P^rs`rEfoTMu z^CKX|^XZl^+EaICjY^csu^i{;@H&$dvv5ooGR4;{LrX(_#?fUl78V2tk+N1+hF`dB z?$}ieXZ_K(uV1}eUd-|ML;dX>sGoIFn(At=ovqm3_wfDq$RhR)yYKw?}nA zviX;;m_Henv*uzmngm>OXNH|hCuzlr`)Fti!d){u6`T523InYN(z=gE80E~~7Y0#6 zz`azdW0#!fZ|lLNV=WftrQEMstxpm9%hNo!BF#l+^i)y_#nO%KY68j(9=gKkRawbL zmSO9WAJ0&X*(RpKfsBDPIgXnYkdn0vyMWp9ELpiynjk|pKjV*doGk(zL;+fvja|0o zw7C?vOdYnOes13XoX6VYL5^S?#KBDTCfibQniyu8wsKsxtt^&wly=T6R`VKMCZtgf^;lXF%_gC>_rQdRHMnJt3m zL9ous_(XRS9Cmv*cyJsr(a_mc(Ge3`>gN}<&kst>AZ&ELSWpGWX?p~?;@l#w-*x8f zEhY{t#ymn8qkeWb!cbjGm#!7n{p=h_BPxX+| zCIWO!y|H}HuU>xVo3DG|IbS(U9h^pB8UY!B(^k!$v5pGb%msO__B>U|*U$fLYm>h9 z+@5FtNEV(+GlO)xA(M7J-?@xzwKWs5wImYERR{$W!nz{DG_H zSPEx_V66=^DKrvkm@~=>D6R<$Kat5OM$2Z_De&pyj3!G>;y#a7Lbwu zjX$|X?t=C|-D>Wjbh8vqsRuc|vR;C4Q?k4g|yOuCw_oKM)^6&W?lNi&kyQB(PK9f0CC*y_zJB* zJCqR{c|B|Vcq+}sT!3kh3gLvV5&f=Km=$cU!t$85%xqk0VHM5Fco-TAI}`-mXzgNh z338q^TxO_fd>O{LP*s6$4(8|yewi?zfu_^89RzRUEp$O}tI&#%Gl?F)!P!_xrjDk{ z+f83qKQF}lH|YB*Q80T@aolFqVS+e;Ygo)jjk>Yx-|_Q+2Wq#akk;8jyUm;ptrXB* znnBR&z`I=+8)aHkGs{E_uq_d@7)%HBU87lmX$ADjeyM(QaC&XsR9Q_UaDpqzud8X_Z^Qvxc{LC^qYlsmj>$QyW}2^yX3Rrk3D=q-X{IcYxex+SFV!}aLfBW zUa?9m=QH&6dV|8XON*3_J>|LEjUwf^Xw_^u0^W2P-E?6EsXrg9Enf<=Ru~n#YFfPV zpYK{PG}WS&`UO`T>#joTXq9_rPFlSX-y%d#ITWF3Wgw$}L3SpmB;n)>qeQDw>_AkD zV0o7TvA#WUplVl_XDwglb_awH-Fi)d`GzLajdCI@jYz2^*>=iaFhclc3rr`_5rfkD zIq%=d`dP!ZJD`5tariXwc#3)b+%W|tWdcoitvENnT&~*WZO;iAGj0oRD3QS|H2Cf+ zc9qDW1%figqNz8MW~&h+jw5?(Y_kFfh;)bO5wEH>bqz`vobA_Ev+bX0;DCVm&xXrS zCU!MS<4}gQ3)ZTG9QaME4Zgb({o*6#hsM^Q<@?=ue_efZ#6y&~8DJ5jwkvc+EDL-1 zrHV!=TAeAoZR;$YP-J06lM0!pGqu7!Tml%!Dr)!u!WDgAjZ4g+G)A`$Tmk?<Z4=C}O+}1%J zNcQ;hAr*Ow@RM8KfAOt&iV%6tvxe?!a>;C%dCFUBD>9y~GG}$WmVF|}X;aEOzt6&+ z&H$Cdp_r|mtBpnI8d25(#YCoHcLOiM7A>y?lyE@arW?@&K*$U^(&SpSl?*QR^Q`-y z_26b?HV0IWFO|v>19rp_)p59^O00NbVUe+2FZQr%-BhG1qm!lTOi>B&BwWUs%@$fp zRERb{_(^8aO_zbKEc;tGQVYF?JP4d{ScX~)5T09Wl*i75JP6?n?YkfXfo31eH&A|D zasU;WnD zJYn-(;nqi{j3JnNuAY9H!{xU7U(QqgJoG_0__<=CbxyVyt>UfBblv95a~y|2bcnPy zFTmw&An&aE9~PgS)}N=!Y8rtfWd!W+O{ac*OPt#?;1^M%(+@>p^{62d5{43Wkp1uCMKi|4XR+yi7 zECH^1YvSHEDz{P8OmPNI(qhGVnbFg{F!;K5O*3|cNs z$u7i#pmb?ni_vgN|5Gd^m9Rq)9PO!9Bg`DLRW8vHED#@LJrG$B_z_V)RRY|)cJU4V zEy4@8>$eCc-DE0663H}L*%o54bmLk`ugHu@UVyc9sTt7oCIq@&muF8Pi6*piQ%je7 ztd)vQYbRj-WKyOvY4N=mk$<_#)OD1`V4D$6Ew}YcU${a3XyV^bk;Cd!PYyZ`aRq=M zYn8zas*2ZjbxR1Qanc?UEr6eiCXrVVMRKPAVrI9w7|m?2B)c%K4p_A3Rbj zhpC^_2uvez@Zj?=eDJ7q4#tNyoXmRg5Xmk}T$Qpi$lg zpcAp{>%&$FzkcoFkFQ!dZu$HhKXKK6y6lE6J8qM=(mnpjy-z+WA6&Wn;`v*D;0desp&R*y6-sBY-ZlBIx4P$`(;rK|fU;$xaMGE=af?wWWCiO(ji%gfbgdN@ zg-D})7tjP@kz{5l^1z~m0Fn5vD3>R)$p5y_epiyq2RCKOM|nijZj*W2CQUS!S^E5i zWHdt1Dzu{+LgXx`Z5x=0(5FAvB`xs>l1*Kau8t(fZ1R<7UvsY9oeosa4Rcx{c>NrP zl%M(9+;cws2?TiVM6Pbd_fzUfwNaPB<42#5yU|)AR$Li~OCp>=6ko%&2_bJXK#fD* zEv@tffJvwWtegA_X{}?WszfDRoy~GO<8ua-+;lE`Oe*;jsP}Hqx(6M?4Al|;VtK}7ts21AG!$p45SEt+x4i+kj~)yMrxNh%zzk1#4*DcBi!B1GFSxhpHb_C#!Z)rNa11nBgUmBO#Jsuz7!$j#u zf7O9d)I1mi!cd_?8Qfdp4|Z9rp|f8&K-DTuH0H`L;dCsAT`bBCx2K+W)o=XC&HWN| zCK1iE_D4)F|1u%whjfwhQod?PZ%TgD;mky}+2yrHM(g29c~l-pIcmb}Ve#Fx2!Lpj zO)_(|Hw}c@w8|$`jze;UZwTS7i`mvWvv34ZZr;%QH=6fvc&y57Z9@p5MSMAkT5;u{ zkTi;D3TUfx>;{ZdA1QQQQiUlzJg%4%G(oY7%R2{JybGoh8JX%{8b$Tk%(#%u)0a4z zf1^>0Oaq6AtaW`nV?f}lyT`j7Exx&X<)m@kZM330JnNgTWq)13PqS{zL4fbOayH}d zcSr2ieY|aHN+Bnb9&b@0qsfDucR?G0SY?949`RpHQKT7Kah`xsaZK6u*@|5V_za4z zJBAsDUGG9}^AaG3qLX*6ZkxJcS6acL>x;I7yU*INQ*Pe)wQ2GB$f}&C-cBQM)KN0) z4<7u<71!XzjuW-#4n1Axx!vDK>L>6{tV=81E(F!jo0aV=`kzjU$JKKfBwSOpZe5Q&s(+d@>L7+hi_k9uWTiD{bwL$G2GCy#9`eQ zy9W;3P{}M99BKgQ1yA+S0aGlhXmt;c#mJP33R@wR4pg;}9JRtfQArcVSMcz}#hTW3 zC|p2p;dt$u#dm%FI{B7&vy_x+rEcMfEHfxLoo`7hav~O;keED$alsrMBrh(K)kKxV zB*{5fXe7Q8hDB{nf%MICw^h6)1_!hZ$fQ{>wiS*UYM?6f3UUYK-jdI~fXkChQ9sA` zQ*^%Iuo_{38YOWqbYJ8Lq_V3tQGID*{Le%Fo@gd6y<|shh&kQV)rF z=7zjNccyGxfe=={PHJ;Z=VP6kpy&k79s~uqrR2`4yIl1_t8L=I^!xt&uIc8Dsg{~X z;7A;Sg9l%@dFN5<*PpIS&~1H{i3uljA&j<)*E6YQ1TFkh*JYsMeA!m{8X#8GnU=Q7 zPgaUDXF&@@154{^F5s<_Q{*1eSFT!+uNJ;^<@{?pui9N!Z0yYvFt)p5&Dr457kfA^71JviWpVaH5n9FuGk!CH$B`6h%7<>w0w*3 z;#;MJ)_lRqOXz;L&0H?vl_xT$<}dq2Yotr0FwKLOp)3{7&SGgD3s#ZfpxdQ6m@`5z z2NFTdm38l9+ZvL>bWGbuc>pVf2C=?`m?aEzNkrepv08tY?+?mB%!xLbn|?LQv&>_| zFH|*zVy{1qzkY) zOE937&<1N$z`NfFFbEk98J#cws~Hzl$vW$u!kMj*hfrk5R~TG4#v~WO9Z=`2b$NWC zY!Je9j=7+DabBK#{Y>wFM##m5UIvncZpAi*XfZSRC046+q&Qb(pn(sL;Uiqhjj;-r zw0QO@%~Jz3%rOxlD3$Z-74*DoL5VWewDFX-+XI zO=n7td@*9E@;+pA9mx~oTK#;U+`b!qA$8%5`L7j4*A%+eU#K`!w~<4~*Nz-Ydz$7t zgke&KfHq}q zVIlliX+<&%(hcRT%F&kZTt0MNKJn4iU;@@LXYS@YSe6G(f+k&*-_?b1!}2N9s%6O< z{mNF+6(@Dct7}RD?t%-CONxA02}5oDoQGILJqzjP_!<*sVK#9fMPNv5cwN^EaZzYH_O* zfmMvDQ92|Fty(pzM<0lQxLwSDa`BgKc)CcZS!5nDgx8yJ*F#(YQ(i7D#dkq3?Az zMFo<(y%;dnG`b(2S6!h+HK%Wq1OkY#<@GbPycn?ErJYevvV-y>Xt}pMpCZhpgDfU* zKjtLWrMcWi_OU+)`~448h#Er3csj!tOF#(~Da;%Ym7#TGCf~G_!|Dm%@XZHgOqEYg zi6Nmo0%MYVV~eWyaLlzjml&!A7p=VidEpImP`r?{qr-;@hrS4k5FE`$CD%nuB@a5w zYb(`zF5C-HxB_h`gC-%^lcZxtH>GCwl(5h%}Z(NcL7xwSjI(J{WB23;pwm&}JMlGT}6 zVo($T&_g2qul(D}G=t#XXN$$5>@Uv`di|{TKgav)nu8VL>c?xTEsnKDcxY8HG?*E9 z%vALZONWwe6J4nVL#$3g)l`^@X%l3KFX}U(vYTAf8jf4U)HsxStsb|o2EM4vgUNFL zzuXM=Bg^OHX0ZD6Ty}QUN!WElwjjd8P|xcHLObN83c#~|-ulr^yQE;YE7OWk{(xXM z$?X|gc}iqD&73w|E7VmcYh#zmP%jw;q_`E8S!l+OwQk6axsh(SP;Pn&#SW_T#9Ogt z9H(6#0={ck!I;-Pk)ssd(x2(uq2gP zbun>20Sn zYZvl18vWns(b^oQF`os$gvp0sqG%a54LDM{y?)Jte2ehx_9;S5D3)}B$Xqj$I!Ch} z%Ui;V427fyf+dBCUDIkR0W`T73ji$$lmylbNO~*dfMd*DZKDc=1){V_@D2yNLijJ7 zvGOCB>5nx@X(a2<@1pv7^spWx4k;L*4uV5*gqhJLP1S0jyyvPIO&}O{3EJgZOK9Gm zscVi|4Nrfj5#4sG9u`!^e9budK*@2d7JlLrSN*|dH~;#D+g`eS?&uYB^0rL&hr#*u zHF`m9isdTnGG<4MSe!t?r++aM5hw&&M+uhfXqOM>p2PBC zXbzaIbwLY2R&in21p%234SbedT1F&sy#RHnB;hBkvo_uMo-3xs=OednntDEsfR4by zgC~6Zws)R$`5Ei#{s%wd&pOY8uY}~X%(LD3pLd~hXyL;^6XeKQS*8NN%b^1wDvQK-nHwo06V3!SjPc#rl2`~i{Gzb_Pa?r#Ci}7kC%M@*6tKTB@rwIL9 zDwd2;KS%z}a=J;!oNhdYX?micGlhfJAqVnZ6ZlCSRt6UkmuHK@alSG8uDRqaEpF|u z6cQ6vcMwolSp=2{DbpGy+HX2%L2Jtx`pwvU2k&`HVj&0-VXmiLo5S>Q1XJE%^r2 zu=>qnb%;jD#1Y~oi6WLQO<1bB{B3CRUm9`?Z>th`zS&wo;1cX`q zbgxr%u_c&52pKPg#F-`i@#7`+^C@dL%Tt6OlKMGQNh}xVZksMC%XGP^%VN=*uZ%|P zsFpK3i?vHe!5reuHc>r70%di<^dB=jdQjE*0IpwkziPF%h4 z;uZ5N|9a0Ok3IG5v(G;MPiXtepEfAqv(C&`mFZ#|yCf3@vvVLYN|e^@c}h6_ zJs!YJ9ChBA$%(o*B~imS-GngfrpoLt!&VX-cTZ0a9^oa^)ct7$Y6K1*JnqVUC!co{ z7gV^#k&}X_yeVrJ2}L&mHqABH-+5ODtNZGp24x!rpuM?`=6G84Il;}<@At>l-p zH&q77L@diS#N=co*$TT|ameW#G9A&XSGshuJ{77Dk#TFSvT{miwi6K4|}*dFI*2o_yx7Z@l*d7hV7IRr5b0w{vI}U5<7B z$ZlA)=Of_QP^{zlRY1qAUGp~T=L_uq=S@*RS0sBlA;2gsBSd5NjV-jguxz2;5uLzb z?#J@=EG3AW#l%PGe3XpPhWfQ z^yFZb5EC_xz!5wG$Ia=jTyK)E^<`4PNn1|-IR6J>`4=ywh2$&(>MoEuRI|?z+=V-p zS;&qMu(LC7r>@|cH`$P;yuSNQqVI5)*afWDDloT%iZqE9U$(e#K^=AnO|fctMYjGL zK9>+o&+Mr@NOk(hxBNQ3MaY@OlT>mfRcW^JU2BT8$YM^*7Gg@IRzg*36HYIjsSv^- z6np@MR)+$b?nV{iZdVdl9ABdwpg|qP7=F|MhQls3wSgmqjCIPPj4z9Xa>1haKWqK0 z)!<=90>oIwBXG27$*71)Y7qqoMs8yOG6+{0ZkH$#m(;cR9A0SC1H4c-qN$&UZuFd- z`0}cgW0%i;Usa zJmL5*gnKu1s@AMzSSZTvC3XL^zkfr+m;%+~iejmqYZhr5buwG~s0&GibO)94K2!Kv z#a>YmpzB(tOHC{`bQo@+iJ+`7HYi4hN=lko4o*t;0|G4}M25|AlhJ2x)IZn0`Re@!`D5aB?6#@2)a!lku?A- zt)LIDN(@-fr?zFIa54-LW+RsAFMMV<;137_0Y1=%hKv*af*1&vZ<(7pfkJFpS4&f? z7^RLgWs6n;Y<347aVsUC0?v`ePpK2+Mgl44n@#Q(2CTVXm?`_wtAHKeLVmz5D9L7EY@W}b*VF9!dx>K4M`&Ea>L%g z(bUgeI!a8AhNUra9Pwuw4V5+qGI-jHCXRoOpNt3B(paMDJQ}VZQM@g$2sz!zDxLdC zMj3}`^@PyOg!U+G4TdQAh1_&sT4iZhtKzkrFWGuG7N1c+3n5IYqWA27Z232Lz3%)i zKel}CRr;ONsMQDf{b_UbI$E^+hpstJqREAD_^D#{GLRR@^MjwV`!{m^S;N(W%_1<% zMKF~ZWu}%0@UNhfPf^N}xL&T?IUI-O2Q;)AuQ~@@3ryY}(!#-Cphg`qW|Z8(6avHI zn1&-zdP;$nWIE@=>u-6_*Qdp2Djp_s8i6Bz1YYv#Z^*X@Pg^sO(|DcjGcUI%cF$8y z4k}$_v6jfBV3~yyoTi4#Yms+GIWAdEl5>akb2`laIE~crIK2SM49|)1P>AMdUu?0w z1{^pxO2}Xezc&XCRSvxv`eHo=_;>|nfIx5}Dx7wp9H$O3JSifpf;Ee;U8Ub5e4l)a z(4Qjogu-cs{{joXrYE}7lCzS?q!^N^RFCq}UQJ$F2A4qOYiDxqGyKMcYGs|^2x&z@ zk^_sgZ0W~*=?}`R$hzqmxtb;vxxLVssR$LgYJ`2DA=jVfMS^@}5thuX11D3d{`wFH zx|PfbDKWuMW*enh9J0VDW*6JTx*GUFcrV(%bRe^LeFCbhfGuJ83_`?+E=d|Rg<7}y zMa$;?#h13-c>BW#Q5P4P_iVd&k-iGNTfMq=4Ln6MmlmMLiKRO=MFR z%qU-T$wiZzWwndIwt&De_ow6tpq~`Fpdr)K{`ylmzCip%#r_W09%-8{B0 zj~0IYn!A7f%h$bZ^}_R3*rSEOv}3_0)N^tb?lHk$F)cC*Wd}FwXIg)j$m!w}%crAp z7|fcaeGsOW#xsy%1q5H}rb=IjBI9Ch+}+vF+2_;cY%{Tw;8sh{n{ z?x%V^!|P9%hLRp3`sHFN=crK6`j9I+U%8D!R862t42y18`LK(uG~^7MAkz`ut|`JX z>tyEt6$-yqW1z@ zt^wFkElNWdFAxKMVlqfeXH5k+8~#7D{x9CL)mE)zy;7`OATOms0I zyUc+WFkPUwR1%Afi$NF!V8Ib0XpPcXaxd7<4HNElGx(tef#Br4gLNfjNY^aLlY_^t znE$7r+IrsZ9LiJbvax}|-oycj?W$FV=-6?|2QIp)G@@wn2{pQ8nr&?he zfoTM$5$Hxhi|6ycd-^A~_^BHwa5;4gEh$D*r{dA2`GlcX&u6;jvBbhYnrmn7UV}th3tDk@o1Pi(T$%DR}PeQ7EP+l zogx~hMIgOZ!gZa4)wV{)>J1iyx(<<``AlU^SxvLfjzD@=2{cyc}&lj{*Sd8j=cUuvdLq4O|GvuwrJ&qZWFU~&Wi?E&0BaW z{(DV^gA}xA@J4{|uO)(B*L0vQAq~A6SrxFL8AaFvy|^4Ro|QdV_;TTJ&;Sij_lFSq zdjp#mEK5jE@n4;vBvFMnvK}Ov;UGp7rf?{8s=ak(tR)o0g@riOpu)$=5A0}akm>l9 z^xL?+_cYxlp;vcDEj<5=&oSs6z)zbColqqsVo)j~tm&kz5}X4e=$Fj=_W8wD_iiNt z9eL2&o!BC;d1f?;JM&uh^CsEqB@1^4F?C}BoUZBXc~WX?`hZ+C*4Mzry7Bg6RS{UG zfhwX0?-OvXYgKU%iCev<8dCF74^Z3IrH{mjlC1`BpslOonyfA5pmW610OI%lM`j;Y ztJ#ro*%S7<3t3wpX!V|(NG|=w3}F^5yNf}xNa0wmp|W1>IA86Gj4+{=oLyXaAkz0p zM@PK`8VBkEUu-p+s69Ze$kHq>xG+bA=CLjAFL`(g^pB$g3s2|;NMGWUIz7x_hFb1- zTYl!0TbsRt@mF&iSm8rT^R4|&d3SZyzuLK0{EI^zvSGonIS`;?7;z|BbQqKKjlQOi zztj9!tPez*^L_6!uWkFEJ=iZiFS-4Gj?!q*jji*RY_Jvk#|fwJ+alKeMOC3_geBUX z${X~ekTxpKK(;1SsjQP7kSu2Syu59|9f?4 z5SLMI02CZuE*!)>PaGbr50n4`Ru2)8Jbh6u-;(iIqnm!gR^poqdVYY<=OzJQ;!-6S zXaxIr(ZfWEj$?FcC%25$YPxN$gC%V;g6Jzvm-j2q{<^HfCK9ihDPC1 zIvtb9N=>@@ycoiy1HmKZQ3KPqwFKy4gMys~j>!mO4{n$~?cl!AB`q=kxK6v$I&0u~cSe zt4h9BD>qwd#Z5{xCl@eVn0Ga)JyIas5O<(?>fj4Iw>{2-X-jwp=u|K=k)LiVX{M0H z1s>3MyM2v(zq{iO2*|~azDgMGDPYs&PQm((Ylx*y%U&`Zg^eth->koQx)_-d5+(hu zIhdeU7y?zSfOy}+0#gDc|EIhj+Vn<(f%e9B5V(EU;(ZC}HJ5<>@J79_)%w#q0k>;m zPsvb7JZ~qUs@wk(_)vN-4Z@|*juY6IP^VG2GdD0Oi^c^Ic~@uMbU*78WH3}mg;8>to4ht9vCE6;?yloB)#`Vt-i z!9ggPPsLd~oU2XuF1MjT%y)811qF?`(_?}lp4E$^)wa;@I1F&7c%G!FIW2sfs`KOI&^x>Yr-2XyMs9yL&Ma5E;2{Qn2s6u&r%&yiF;Y-1 zhsh!xmR<>e;*~Lay~`qf_AqGKw*|WTp{%g)fW4JA3%(Lklr)HP zt@tEVt<*r=&7>D;z(lP5{l6!bZ^ zRvcV5Aw?sMoV1(40zubLujjS&v3HINfAQ2qq@vpdn>P2D3rp)Am>`mMJW+(71|AknkF8PRT0xsv;d+o#_1uEVz{N_W&FZL9E$Bf%laVU;MW-Tgh%fMHYf;19QjN$B zmlS%(rKy#H>By+Y48zxTH$lK&LmsYfQ}FUguZKX_p2KtBr^`x@>+6Qhfe(#)K&wZy z6FDCELQm=z+rHHlre<|M#um}DgY928^{ua|FtRJqI>!k`Qu&nniAKd5HRCKEE;XtW zFIXS=g_hdD^fJ~e+25fi^yFpZ1nG@brwEvyBs)jQbmXXBID_dnT1MK@Q(%xfpYMG+L5GrFZmL=`Dthy-{RaNVQ+;&IhqMkWsP?NUJN>!meCkSdV zQ*Qkfyie`fC4~y7w%^KDkJCrgYrF5+8I6apg8~A*o|u5ib;rBH_Uh}Af<4#O2F>u$ zxXpWZ(XNHeVocqyaT1*KS-H;~qu;|fnl;jh)-g&uVq-*{>yctgwYND@grw?DJZZ*V z!>d^`omYCl6!am>obJ?3T}hANCR<)?>01_=gqr(?AjLREdgbGa3qv6DM35}W1D46U zXF5Ob0`4EH)1-4$*8j_TZ~sZhaaMfaTi7(5`|cNba)Gm`rOhd`%h!HnGE}J*?QCmy zer)87EK`=zN;HGH*g-?f3JLa6)CpuKqq6GZM%%i;OdS+nZz$7UmfG&D^J-FPvGbIL z+#aS@Xs6)>3#gc@7FA4Uc}FvQ{hxsZl?f%%BGaW^ap8cod2zI6HI24p`CxibWn}>7 zXIZ?#BhL9D)nKorTAnxOrX}0@Qg2@B8!3$xW3v}I|L{2KG6h>8hy~^NYvN(8b6~P? zLtznkr!VyQTEi}>ZLGBUb(I7-(<4zPv$yA0vv0q+zu&;Yue(9!ADQ@~#dPyAPu&eE zl|uYD5};BtuA`x7{om0LsN>qVjD(sE*`Eg$#8gJH>w~2LoGCQlYE|mXzEx(dTgx!v zph3puPb4dKQl~@!{NIzZuY69%OJ(-1iywC-^53pGa9_s4FYC3NJ*S#FQBKvij>2ao zo)&Uqz;_X zkl!Nf5z0XSo8*YZ42)y=o|gc(QcI&Z`sc00m{h9FJ`pmLnc2^?2z;roaQ3B^*{_7Q z>Mwn4orODQ*GDkZFYm@jQL&&@kDbqQAIhpzu{O$QW|`$2iQ2v>UGm^Dui0#WKhg|n z9bt62%8UP*E?BI1NT@hGTpQBRa)$AR)6 z!vJt zle&7+%%3GZcNU5)twe0PO%3>)pI~ezG7|({=~0m4va%5W=0wh`REvZ*EI?{-T|*ds zw$y+sbu;pZ8}j-_&#&c$;B6zF-iqvF{PrhOgC3g&8%VZ$*F9-=ueNUSVkFiN(w5A6mymv;p}Na~|y>{jz1co{UrIVdpcajyCV3V8D7TWjweOa9xZ@dyxuwf4&a1yZ%WJ!(Mfsl*0N|9bHJG(-5Aci zr0@hG-JsRs-jG+Sj}@XP&ArCya=XWMqpi2u5=P`vS%Imzn-efFOGs7<9sE>xL*Q%wepA;c}uO* zS&+y&q}_Ac1mmTx0Z~2zymRq^f^&t=9I#d8oW{8mH7= zMsXsUY3SfDUiD_#xL9g)rOzved)7WNA1@P5w<7zY3!D#z!PmHGme-Khe`xVTQ3lcd zVbC=6K|*T<8y3R&sQ%<)S+;3!V!k*b|Ea>vkna%d2wGN>*Hp;=%xY9|!rD9=m#~@B z80Ub}psV?)-n@J2yl!R$=r10;4$*ZJBxDx>U1ZIwa}4^G4%|rw>mL0BE1*HYF{6%v zMr_~=O?Jdc#FJJ@Q7JWJ4xc$Zq0xd6Evo4}G3PdCsS?vpw*A9)o(jaY+8HOJ_va^p zbCK~13%G}3;wID%4Z_b@A++FD^<08M(?L#P>+UmAVDqz|e#?bZ$|dPPZk-i`DMZ}Y zYF_aSm*>Q4luh1^&88--_5l?l=Y7Zyd3_Kc)eE{YA!oTI9=;d*7jw25_)F1AJNFbA z{DFIGW>}a!*7Rd5oIjFY-SM*$hgrzJWYbJ`7Y#)?-6$@Oh)2P_V&*2A+~smM(AR%cE`^-L9M90{{Mp@NYS>74Z9O)97sg)O$t zQxt5`dA0aKC57tjC=CdVg4<9s?*0H?&YTBMutRH)LvX^({r zsvn?V>##Lahy*6l1_z(!#7%mc_Ohn!9f<|YsR%ks_6geEQf8fnk17?}9hAQmZ)8sLFMjC(1nw613e6d4ac+_lL7Sat5pao;G%`Vt2Fyy5B*Lzba1?K zI2B$ipai4&-Glwg^JK0ZLF)m~3wObHvzlJN^~})ccqyR8?g6Bys4Uw*QFpoYojWYf z0vS*LtS>3uST|@ggI2~2bN)NM!wqI584*?7wx3J2qK~U}MgAdG$X%e>XRS1RO{nq8%X7jYey)RIOW)75xp$~n!JtIh&FpGS)^|z-RWzVg z5PfqSnr+BjKdn}W{vwmPf-534W(OWn*`OORY!iR%eSbtPq?nje%xa^|Rr=I*s|PwP zq%6vYt91(DOqYrv(xbOhVdduC#imFLC)YMI$Ah|%=SI~obHNYhts!Y##3P9%h(;k}CKMsxhw>#G3yn&IM;wWy>;XL_=e96h z8LComZ)>Q6Jh-AXPukOwq;zVrSv-AJ%}pTh%g-3 zv>fYd=KnI6nZ*WAv>*q7$!~rm$}BDQKz4@tyBK;AxDb^l(~8H;n3_KWjS`jMAwTBP zTTsM@$^!~7d9(Ifv!(J4eK#D(tj}57fv6avWtm6pqN)VT@3HDN{}HHZK}V4BO$_Aa zFv7v2t}>f3(Bu}sJ6tBuMbkFD8Ee=y2wg~PEhE)GNhF-^e$2^)v?JTw(do>KI@HIm zQV=GUklkN_mxP5E(w%B8*qi+UaP}1-lNrVR;&f+LVg8o0U>8yA4Z#Bc2NsM76ql8Y zNaqN%_Oao<(Qc8hMH8-;&!~DM;Xji7cVZG|2k@N&@Ojf5hsTog{{Po$1*(+H;q&{Mpgv;&gG}U$GNhTvQ-=T(=j~ouA zi=Nr0d>+~GUQYLrg!$wzcd;X7?<@{tAaR@pB9~ ziz2pALceDttB4#>gsY{sO-fpO?}sb@S(O}=IhMK*qH?-5Ut#WbnJBC^uQ0_wPHq5t zsWE27Dn8;~j8J&xX)&y(G^CKx3GfBqGN6zkLJ-9-i%QNwK>k8^=90S`5EDGImlHoi z&DDs*rI^%Jr=>r*^7a$Cd&+LVt&c~8^@+JTm! zisce0bS)06+-B!_=pQQPnq1|z_@XZ` zYVuW%Lan}CMm`l8IhX|7Yzr3tfMu31%YXc9Sh;`5tY;Q5hOZet=kpb-V=+K#56hTS zCcRUHY2NXB3nZw*5Iy>1VQQqz0S}7!o4PRCLJRq{bSvUHo?_$M_j`VqKhyGJ?pOq@ z&}kmt(2ydz>Qdq>wyWKJqc_V)r?gxVj_=@)ev zLKfsv7vZkr9FjK4hh-Cif3WYuLevpQVuVxFa+ZnNA5kk&AK>(cj>mzv9j?5e1Ie_Rgid}{5ikZj7X4ReWp-~ei*uj!CG2z?|ORWOJW*&%NR3t+DkuJ?iU`$wz)mw2|77Bv- z9oB#cxVEXUUVoPx$Fl=6(>(vTwcclb_uW0c{+G;JXP!}+i%VQ(#``fKrtbb;W7_wN zrO3~d4+k_KrNo$@xPguzDUH%5SH)$B9DC@`U#A8cruxU`o1ew@IL_10tPo7sO563w z_i(E@MA4|Y2KS1E8%l!XO6cO-!PYJf|8G_?P!yh2PUMomM1I-cy z#ir&#m%!!h{v2GPep6{hRd=>8+bq;OZg`X*5p0o2aGElIR{V)M2v0BjS?WM-!W!C2 zrK2~OO;|9sRw_xt{`|8Ot14^xSKVF$IMH>0P@6PcvZq0J6S&MDYrZf1+`Jbs zLIc;(d@4oz5E6(JvZ+}1FynV94{;u|%Oc+w%{*e>_xWB6y9s9uDk*4rwZy-&vX&Sw zprn?|ka)}`!Q?flLHmQNXkcv_r>?{jZ|r4d@?f`QmS~o0S@8BtcabrwRPN_x!5QA; zoY;2NrBw;zcm)C?LRET`J;r*J`?xp*j(=GM5ZZ5@z&={!`#mL&=J$C&hxGg0 z#-V7?eT)IyRLdve@$*!#hDCJ(>(43(N&*%;Y8}o~5|S3SDy&Jot!4HtXLWjp!b}j@ zXfU?1c2=-1@vOcla1dPkMW!q|w%mPeb^I=1sjP8iG62~Yi`W!@y# z1#1kYNC4_D>V3vH2J#WGy1Vky1~)y>ens5S3X?V4h>tSPBoW*h$wU?vgDh+XX?1n5 zGkp;a3|4gO%H$D$bi%dy8~%=QYoPC5vzt$S3mQhu> zVEACUsd_B2Y!@d6TdCa<1T=Ji)!u+;AQUb_W;rn~*>VdHCx?<9IIUyQXCRPm2l~~z z+T*mp>C6@y<3uQ%rr=lS`#gr4>7~K+$%?>cYYi&m!ZJcVB!CEu9IOo-7A}pMO1#YP z9I!>-?Hw8b_F8?e{A*}*0}9;pfigZQe802V_RFtQ274ZFV1xhPM2F-65Q`DBJPX|n zPo1ZQY=~5<=P2x%0z%$0;N-Q%mdTi6xw+2L^9?_kr%C{Nb4CXU|kjRkmP{F%8L)61^V~Dk70OHpXcgvif%3>=s5eS&EYH5Z# zr%*@b@%?IHYs<(R4=VU5j917noMrkxoj$RS@g|q_Mb7Q-^J(O47EPEW1#E66PMB1) zsHGrJAFD0oGh@`~iz?*Gw`ZzQ#N8$WPWU29uKj?V1!r;TGO4&r!d4zbhS|fTs^S23_}3S_uN+ikIAv&ntRzuBktv zmIvyLMC74xfg*R%i&@wmFL+U)K`>~=hn6-~Qhzhk)OQ7Qtr+#fQJ16~+{oF`Qf!zc zMXujkAECaM!ruY(QZDnk|EpwNA(ra{9$y2_t1HLk>3^qJRt>~8f1ICI zqONx~eJMMa*LTk>cGb>zvsCs6YH4PG7Veb^WKs9~sW83evuxIU zguCJrlj#g6D7IsvRahuW3=vwhDtEa!bDc7~_8M@|Q0Rqv5II4#N;a#ms{&ZvwI z_|c*=hYrN~Cc9W&LU+HUO8Q6yX^IF+PQD=!=#6#kZj{imSUq!WILC0!ARqW4@6(Ui z!VRWv-HQv%U6{!-RYW-Jb=d;WUUkqNIs-K80fx>cQT}(Q7H!+NHvzAI>B{SpJvQ`i zXYSiSx@8`(`TgNURj{-R%mdeaZwKxLm(JN>7Y)rTBo;JbtZz@1^qK_^cpxs^A>2QM z=R6wKy45r=_#r|A>CBM{0%V-i->_D!+`1v?>ucW!G_Dhny(a+w+Hk-GYTFM&{$t_4 zPF%{L7Tt}~a(j&?d`@AAOEE+9UHLL(vZbiuDbiJ|##E)`K49f~-UWfbsw;(gA=dUb0amxrRpU4tu833h zvb6qC1*x7wt*}#c_T_<0s+RF*vY-joUj@u{Vt0?9DNpa4oI}2@1Mq`!alPCk;NfIK zAt!F@f1H`18H6k)R~;x9GC4~GN#ZftN3r$t39lL=wd%V8z)hkuKtr4N@P`D$*6onW z?1!QHWOGkb>xo5Q?`Pk$p6lnAGa&8D=JyN`FOTJ^Bz0#0+4y^puKa-TiP+NTm0!BL z%nhPB((uZ}AMwC`_yDRIUlA`6B^0=Z-s0mzNo@`fA@oq2?d!%A;rjLFO~>EKetVnG zN*?-upFc2W;8x>=Lso&OUTP?WmrePv8(c=0=V2zFOVRRyDiGq`JiV_4E54f!qvVlX z=G?eKhBZ5wW4#-QBnZxQmfBL}L0kFJaur%rJ6<(M37t`fW@cA;Oxc++j>_pe_t(jK zg=f8JJSea*$#s@T>P%_vZok7_X{)$e0coZ#znXcGqjS7if3|1JRQxO`ab+6LBjEqh(U^OHq6wXbKZp zw?VCSy74(){)lf$n&m_rYVh}pob!}wgjiyC7! z*1A5GIrElOAPIzFC0mn+zg@b_=e+H7{8#18e|c(u`9F$sX#J-1->m9tW7}lyBPyAI z4O7;6EyOnn6;p+MRrh2)XpW3jVC`7yN&Te@x30`egRuJR$Uf7Z4hkkqqg@+HnGcYo z*BzS?C(ioX)nfiC`#>*+KWL|l@%_SZji6Q$)zN4#et#H4#~d1$DM$o{JncGV0e8ro zaz1QY+Lf+Pj8XxqEg&~HumP7M`l>aV;_BvE*Mqwsa~wM#$zQ1E|UmnZ3rq8|xbq6{+k27f>^ab|*0Ln9#y zep-PPFL^*J+OG(R=iz>Qw6+tx1o=BVwgjf*6khwEjLX#be+l^C$Nd0`9l()P(RgvE zkbJN_=MK6z(V1jF09EY!%}2~FNhig8vgtlZ>-6>I!4>(3S&42T3}=keajD=Vw8QGF zcDL@FU~>}p5>D(_%MyhQTd!Y@&vi=KdJ6E_CB9_&-l-BT`S-MDwIy@ zRdzQF+mKep4RL}-IlbZt@ZioM^OjZ7hw1Ha9Gz`aC!^CBMSWA@{Z`m20adOLDZ;f4 zN@YmUM1RW$M@XF`RU zfzUls5_Y&dMiKB@Yxs(}9W7ZepVj`n4Nk$%X3M5p9kQT@(Wd@ON-<_E1!4!QCzoTK zIo~4Lf)(AoOtFFti91K!QjYpXjtDz$c?4W}T2t!X+uJ{g-{(`x$MsV2*SD?qPQmv| z=Ie3Q0+9dpQJBx~d0_<=zh+jpjndksD6(c@Ov{_Ya1Pgzmh+6c2==^LSPg zp&YFp2-D4_iJ;&vd4%9qEfYoB^bImiku$8KptyQZn4Zy1;2lenEl68p!mVU`yQ|tm z;s_vTasDd(Z8)~TIw?40I>gw0Gl3!yFnnpSUDR1#mg=u?$(%L}`TLw&-G<5Du5N$ z_*0J>S|NA<BFR|b(md{_*i?#Q7z_>y06@kGk;Jx2;eKtNgJDmkNdn4Rdtp*B0+0L*A~P(V zjEWYPe0FM5mMcRx{j~jB1bfhcj9(^K0tI+Sx7_C(1~&Tw6I7uVAD$c|&fj9LAWxJF z4=njQk{z{t{{~*)A4Vt|jjXzBJ_zysFE=V%h`?*DON-6skV3MkqL33|8$srDv1@q= zOAKYqiKaDOSY7$D_JsAsA!w4%=y!FdIIEVaoM4`H4ic7eW}qeXFfSAUTn1mvm^*-- zW!?N^oMS^60BrXD92j$x{&iQ) zoAFozk^U_dE(6GJ=qRA6=S4XMV|aM7(078@@Qq&&cxZf&*ZsVT=cm?x|JZ%U_k4f9 zeiztwdRFLvjVm|M=dhKnZdXU(Na&o>9usSIFO!{ASiaoB_vT4_XRYi2$EX$LwDH^< zvK#4naxIIc7kJ*C=defn5g!@LsPByMWeJ}dlfDIa$7?znAPBoFwvyAaGhrfL*nj2b z0>1ITv$BPl*$y~h!0o6zS5=j&HKVnlLsbBG`IajaO2(AUu07d)5uzH;YA9_UZ(goC z-1`#Hq(u>xs2ovjhBS6!&0d}1$5lXhgt-D|u0;YgcUO9+e+X^s&x!4qf*34hC-f!Q zJ$%e+iF#@w5)NcP?+gIj#CH@mCJH>dVx};%hf?@qT5+Hq9t$-RZgEa&e zof&15lXaB`mwm!*W{Cdb#WZIOekTiYkF74OcQzQP$4IlkKq2D6omDo+N+3`{JnqEL z+zwHhvY}VmP5a0@$H_ml8}GY5S^r+S{ZjnH?+(D?d;hB9RDCb-)f>8FaC-mXN>SFKBORP@!L6X+ zYM!w52k&KQj@>nfVfCKsBq<_INHDS@=kthvT9b-}5U z$D10rsHm7&K4a#zevPqgxn}#V)PyFuIo6rcMv@nh?cjg%)TrZ^bSsFaOGe|VxTi(7nG<7ij&_c1*xJWbrn#qx)|gfXt~$;#vWX^n z@x3b9OsG#b z_R-U`w5A@-Fsx5UHwqjJ6A`mh7&u@7+4Ril<0+$7Q~|ZB&Lk9-whv-?dxFzwOL{j zr*6`2a`=^?GRL2T}*Ccw*%+^N3Ah;EZ05+9&c+Ky3NGyVXXOEf3Lp&8dyGotFGK znq6uu@^m9t-8X#|M=)QoEs2r)EkO7OGh+w5;S}*O4_myZg(bg|%S>nX$6q=o;Jkag zYDg;~F2=Soc0Wx_h*ijF-7F^c={??mWjNw%uX^iq)Fa>s-tT@SUBT~W>wVjGfdX)~ zE)SUcWis3Ikx?(DL)w>PT03!ew^T7n9*a?(`(`u_=~Kef=Jk7ErJ0{faYB1{_ryVO zWSmF8lvvdDl-oh@z#!xGP=+!hc@o}`>Iq>?;7R!Rk-ZNd{i_G~zG44?=iO-hM)%UQ z9mKzEdk2RbOyJ33>-Hi9YPOXCVvad#Gmp}`#-_q)D@A+UI)iMs(s^0;Ix1_%x3_amnK=eOm z=c9rVWU5Z+Zz6`9-&?oYLO)CK!OFs4E{ei~i-}M&*!7O5E2!P| z)uB<*KiuZC;C~ z#Jv#5N{sioxJ=(_{LHrd1tQO>;Q7^sbD41i&^XO>gVt=KS%jP~TZLw=XtT8)LhWQk zcJ@+Icq`1w&X>F4`-M%D`|6%8@H0t6suD7xB1y)yaHk#9hc-0iM+9!GS3c)c30?-l zf8@cuPpKe0`@aQk`+xcMKM-8|oA+d2g+&B&DbUbq98GC=CiupN$>gZJnIn~;TW1>? zjdCALKb6X0xSBPCSUK!k&mkw5huBQaGtsoG(kDq(xLO$m%L*H-gDvxjQhiKCm?v*# zC9X!-aoaQa0%WecuW__FIBx!TWCLUO2Hua?0$$s5&Am~t`6~=`xplhrgN!rE6<0$> zYINVD_T@3w1Vg@G@FCJTL!Q~n{SE~O^=S}?$A(DFGA9`eoh{%TfG6z>bn9Jo#a`f> zhqfo_+g1B{cpDyDvIt!mV=fCyFEzyMf-~w>c@d5MeCg;!Xsaw~{L~R0znXR`Q_nXp zofYO#rK_e>O{+beQeRGC!r<~4QD=E31JWb7APy;9scc$G06XZAuOgMBRM1V}kQhpP zh#oc)BN@9sO2EoW|0|#1VOybdI3VDUf4@)3A0{}zC#NT-_`Z?58d@9!xBHm}tOyhN zBIA*mh(7ru-t4;)$yMQ-qnzIz2dKEt)>%I$skq+AJ9O&wWcXwL1o&?!j$ZM+wPj!N zEda@98=pS_?I!uJ82w*H-D>+5TfU?BpW(5_4ULS>coT0}X*skM1{L$V272a-a52X+ z^cs(0K(SK#4c;tgm!jn}e`|SjrAxTe;m+vlRnmP4!~5=l*xJiW-emVjK6dc$ox$oj zzQ^aQHGdYfefD)|Tap_&%%EljT>kU<^O^1zn))Tq*L&%5vLzcbI47;FBzoG)+C*ms z8StM17GREre9+$>6p4uwAxrvf#KEvFC6ZtVJHA_T9%=UVrN(YvC#+%oS?+`ku)1UNIFq9{o1^BgAe|2Wyvn3YH$uK_@A;ajcJSR*14L<~ zv(YH)mzRjTyVN9w=${q5BTNg1gzJSCk+JzehcphPIFwIA6wzER zO*s(9ny^k*Jl+DnZ+-D1s>bm`))3c~N(u03?U=LI0x<6BC&kr;6=;5aM-S*-^ph(y z`xXnCY~K6#9w*IK%_4!wNAZicRXmhIrbe7+k7Wzf-K~%83ZlM;HpAy>>evfb7|=q33pCrRryVW zOM~I6yH1}xym%}Ua6LcXA8?bGuHOi(p5+J;bRz#nlV?ogu?sz)H@&|M8I^jPuzFox zA>|)6+}5W@az~X8`q2=xl(8Ve35=luBT)?MoFi~7^H63p>k`=N?#KB=%S$v~(Z>Ra zbNW;?V6VyKj1Tlf&9%LzunY^ABEgLnzQC87&~# zj=cL)wRAce8rpOUK%=M2R&f(OUoCxMrAN9r?ia652)&5pX8j-9E0cmmf%5mPB(Y8r zN$I(B*6`3EFg&^?kzpFyHBO@E_k4%ea^}lpJU4pIcT~m~D;3`io7HJutb>L0>aSO_ zqy`n=uRZ7v*Q!);Qw(%zkt2d41*$>}LJ!qbtT5>;MzCzt@%1lvaim5{~jZHgL@9Oh^(FCk-IV>Rh-Y-3J?k7BaDyii&)MzK#C)Gv^ zC6q*#OoF0`uig!7{LH8Hxx0|f_#%f)!K+TkOhg@+GYR2gp=AZ--cGMoKx>#65kABSQ6RNBIpe;JslE# zZJo1@-Y?pr11@{rudftowEELpWAum$DjH3HggH=V{nE(w-&c?(osQJadgUsc_dvDW z8Pi9BE(QCZ_O!$XKS(XF^%T^R8J`zhC;&uXQ@%9EcE$(D1?3`f%klHvN|dgT=Io)o zN&TjWJ-c$Ac9;N#=F&T>MwhXD3UfN0?khfEu2$2~V=XAisFLj*n4V&N34w#ZxL-GL z+Klgc+q`}sJDv%pfVzI)2>IIed;Xjc=z6!P=d?d~4ff^8RT?b-!oxyktCZ97YZLVK zqR}w*f;vymlHtaJxmZ?vt|m7y;|l#IS2oZ_O(9L|*Iz2n2pOU43oB#NIgQwlr<(h` z6Ls#6m6;VKZvU_?CXP&Q-4XeC-ejw=wp0G^kOE@|Jn#Vtn~d%=0P~F1ym{mi;c)G; zQpCr&Z}iYil0H77bATQi_UR&Al>A5R5qKfcosIAIdqGWo7USY6J*h<(nRMQ8+bj44KMMVgWZdcNDa#ftxR0tqYG}J0Rs|Uc>VDRYfm9Zd zf`>GIW1h60N%h!Z+WKjD1u@r=0=Es`sZ1$nO%2sGv~tDndiz1RWuReGW4>Ho{K8WH z?LLxbI>jZ;$DQ%isc~N;{h_oVn&=Q7HM**7z3W66bmvC7bli3%>*x2IiP)#&%&(9@ zdVluFcZBGT?hn*tk~^8B;$uDM2ZfIbx37b$AHGL$2Hqv^*+?ty{Xe!}wS21Y?-4d% zYiQ!uYiD?QQh49xFxb@qb;)(4Bb73eYC&6J1L=sG%1&jF{_ZWeO0;%FZI&%M4RC$p& zo-ID>JH4+x*#s)%HlrG++tz**idq+jcBl8x`8OGTw=fc-0u|0cu1iuC!8{=?{}fvTDjF ziD`PJn#C4sOnyj&;s_+e{E3Dckj-MTNT}noJ5Sn33LVfd9>sX;{F>UnPE#vcnEvG< zB>8A)@|Iz&BHWM4Si4ALOXHKf80>V=myeb91mgkyTe=#8Rd;{X`*#xsGz%9600>_h z6R=Y)uua=;ydHZ7CJ*b^pR3^UC(}6X+b&<#KepcoZRA(;n)#?LFBZp|?=AGG_rV(I zbu?aZmf_P7V-CBVr7ZoloUND=x<-GOy8k-3es8#J|=j3q86y8GxAUuD2Ky)h2 zX#m9>N34RXy0iM;?DouUnnh-w<56t8LdC%Cx&o=;f0M1j+AjIOm=cT`NM?8~Zl>@3 zz9eUZexB0(bhT&E#kr? z^`u{ENv|w-(x28+?BsMaE15Ij>qfSpvtfV8HMN`nHn=D%jdII>Juv6+ntGmh@8IAM z5#Vx@ry$_?D)*#*+mS})%e$s7uMMl=N=7efQra2hEA)H# z+b?gp1SMfi&?Oq(lTt5rX1BE4=xo`fwV7bCsS~8JLs^Cw7M~!J@e+;FP>8>|X_-JZc-6t3iVdz=hL%g^E&aC0%w-K|!bH`| zX0)G)?JB+Df-ND;Etv!Ar|Fz9Ni770f@0}d49+V>=}$Ym33)M3SJaaZ`WN+^DI?PsYC~a5>*t96kmn%gUjfi^RyL zwKLV0CJeT6rkX0gQDaD^C^dySHQS?!rV`!fCHw?84T`Jxh(18&YmgNTPt8}A76Wlq z9EKwHGTG_n;5P&Fz&C;3nSFhydIEIiVC$IpMT4dA-2pxa#~LHdX4!r|DolATu^G~a zG-{35q-&&_t~qjzw^NX4A1P`SOeH`&%OApI|6oIm2o}5k9S`2FGkQ7xYXz{<&Hpv* zaAuQ#Nk{OsZE+QFliTk1mJgVT$nzRz>Rx|^yzQ{uXx@#PS-~{l;P3QzC2P+BC@lD1DOg=bSP&kvJEkF)Mx@%V0 zvz9WKjVq&_Ix1N)B`gqtGt+Q1>E=5>!HQO${@OZV>V|I=;Ca{ zk5{L6gs)fwpZZGy3%?rSw8JGhW3*otmNaH5kSS!dy&v__O=-g?(!Ot1ps53=6x)JmMQJE9uJ1)2%9-rDvCMluVkCG#m0)#P6cQcmLx3Od9x|RjI?+={(yBF;D1`_ zIR=0Bomsu$xID6mHhYfhdA^$cn%w?6nbr5&@Rzy?7P&=>nen9kM&BGn?3^nr-1%&F zRJSB1;SvPDonq1&^8aYM#(+rMuisAAW^1!;+qS1|vu)e8aWXb<*5=x5+qUg`d;ZV! zewwc{*O~ji&iUyGCYnu~sDq7zB@EsW)2(emLY$a5l?E^(qQec(m~ZQ4tS(u1ArV=; z@Nz0-EdyWLnA85(UyDg>DsJ3UzdS&5V$|VUZi&X^Q^*2O6ABafDj;xqH-}ToXO&8q zkNaxJlT@ma&sa{or`AHkx)jZg?vGDuFUYXO1MGE#4t70?YYKI&gT3=hE^x0Vjl@_+ zq4g`v4KrJ2-9T~_owxdy_K=32t$UlVvUcvaeBxZ_R}97~s}GgY^YB#!ra;7NB@dVKFj$=$%bMVwdw&3rIihw zx3Ef8;BdfSNQ&U*dF&XRk>Iw9L7RQ{X3L8X-}n(9Q;5hqqqf)?Dw>Pn3ckcGRtV01 zM($@yzr7Ye&#|+d*HiEf{A=scr>?LL?}y@!N4r?x({3w8zB5NJscJjmag;#DUivfo z;w*y!LPLU4Nb8j`a%_iZK=lo43Xx|N>x;?*ayG5Ta@~LVDV@Omsn}*Jr|s~Us^8ln7U%nGI8zw?AqQXuX7l;2O?Ew>+>UxeTuIgp zZ8@1lKp00s*ySj!=ueYHbr6(f7X8mysTf!qMOZm`uUzVAUL0J6Z^e5P3amUhgP*>F z+1$aPcwH!+(4zj}Frz>9$^)ftmX>shZ?zCV~(;*pf$+_x$%qCaoJMX*u}f9Fayi4%sZ!d(3~ z!>{8Zqno65b!1^#<1tqUkn=f-gyD-_pU&Cc)OV7qXG?IuZ!fVidl;LX)+wNYW?pO z)?l)0D72c&_7WzqLo_k0zF{9*h2{32UPDv9O)*h|s{!OQlHv>ep6z(Pe>_ox`d)IZ zIxOo?R$|gSrjf)JivHf74$FVnN7{>RUb&No0DGQYI1Q7nTFinmQKSN%QSA4O6kO8& z=%Ru7x@5avJ$7*L)+*R>f@bh2vC(E&mHbCH3yJ9CRPZGWiT~`{Xrg5s8?-m7X;f)e zIL0+EMDGt|nx2#Cy!)jmA!+bS6)WRQ2Wx#=DdXNHZVLc;==Qqk4cpc}(;7}YZX_`* zn=4TX*kf4f=&q9vhRlzMM9@eHUGsD^I6Fpv{O_rMwy%wEUByIB@$E1zIV8r(V(mAk z>O8KcxsI*n$+JU_mdi7)@bcHt$7K+lGeRJrbHln@7J26N(BT)YB%>;VJ{lb=O~Rw$ za!W9`7falm{dI41Bs_Tnbzd%vMSA>u-C#wp9cbSzdbhmbJPb97z|X(y=9)b(Ai7b4WR-xqpa)1mFL|Qc@-Ow z&RT^_myA*K=+v|9gyVYCABX>R`uQPY_&<<19zVeCnG{>`F~+TOy$qkTcf4=B%tKui zPL?It^w4F81c_n>OQfCf-gzsKKc&iUFL@P^7*PpTPR%}64?68FF1QNRB z4<5owsh6~4<2`Uh8M9E82|9VRH!h;WD;j!qdSw^#LaATtzRGuxyiBJ7QduhF6w9=9 z-1XL$08B8g;6@ncN~{^?$-=$>1Sv<@TtRuOGlWpX-bp%>qon;rY}P41jed1*=wDQw z3{|M+n!2_*|9(pMv^w{^XkiO_DLAEuvX-l_@J?4w?be?0u`(YZdvn4$$^4tvM!C@>pw0j|eO2{bt3w%D+u06N1RvsTQoV zM#*Z!Fjk_CK_U|ij+o*cn)>`y>DGwp2aplSu1vypRZiI9_@m6YM>r+C&InXMbAZ$q^x$S5?c%83+_NZO~mC= zkpIQ5et-L#t#T*N$c@ZHar)IYK6ZzJBpGe6az81eRg()(?rbfj`nM$R`s%^X!c1;})wEt`1rMhuOjn$an+RIsu<-F?r{?uu@vpt#F^SC1A28Ug=6nK?){wC*Tn^FrZ9?hi*8P!?j=3Iq=K86wrowJoXd17N zK>-?qYFGMU#j`sud?O;wJY&5?CtW=9S2Fi~F#h^Ml_BcEE_#8YV3L2<@~5or zqIwGV@Y_M|*!8c}K7{S(S+hU$K|?%K#8_3pCO2DEtdv!EAQc^fX7ZuQ0@Y&P)Ba74 zZ{HRrVbl8=r{Afp!NUgr>ow@&r90@NB;`l zi6MHiq5lW6TMv;&uFI3bm7)#_+AUNK8>1Up41%nIk$pUd0Hp!^G>Uzpwlbhv1f)$= zYp4<-=jv^0%M^-8ATJe@YhmZHbx7vP(;{F^rKWLTC+7CJ|LJkNX&!#K|M*{L2_d;T zTPpZ)A?Wxn&RL~)U!*HqYO*yFSOOt5%r+*M8-1oauZ`9+58V({*dnAbuB2r9=iARq z0;VW1V@;cNK%#}%g?;qtam+^Gapkl0k2tM}JkFjNnbc5}YC+X{j>V2z|mNUka_1Yfq>~p$5*kB(yVZjTrszJH0<{epGV5 z3+%ICVc#F2IVByK`jk58e7Y`N^n$?@PS|a;&_{rlde!6wv|`4Y-9Zjps!QA%Msd

    ~!Fd^v7cQKn>syMG% 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⪼Hv&fIWq)|+SjCmWdU$1VQ2YQ`n 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%0DX%3mzY5A}4^Hi0~emr2JN5aYjYY&bx{R%3t+C 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 z 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

    S{o(uN$?8W^qho|6xAiKS=mAi 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