From 58f3de6777e45fbce0d476f52ec9e1b2b7d6797d Mon Sep 17 00:00:00 2001 From: Clinton Blackburn <clinton.blackburn@gmail.com> Date: Sun, 11 Dec 2016 23:07:38 -0500 Subject: [PATCH] Updated discovery play to use edx_django_service play - This removes the duplication across the various IDA configurations - Updated Dockerfile for Docker-based devstack LEARNER-817 --- docker/build/discovery/Dockerfile | 21 ++++++--------------- docker/build/discovery/ansible_overrides.yml | 22 +++++++++++++++++----- docker/build/discovery/inventory | 2 -- playbooks/edx-east/discovery.yml | 2 -- playbooks/roles/common_vars/defaults/main.yml | 10 ++++++++++ playbooks/roles/discovery/defaults/main.yml | 207 +++++++++++++++++++++++++++++++-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- playbooks/roles/discovery/meta/main.yml | 48 +++++++++++++++++++++++++++++++++--------------- playbooks/roles/discovery/tasks/main.yml | 218 +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- playbooks/roles/discovery/templates/edx/app/discovery/devstack.sh.j2 | 43 ------------------------------------------- playbooks/roles/discovery/templates/edx/app/discovery/discovery.sh.j2 | 18 ------------------ playbooks/roles/discovery/templates/edx/app/discovery/discovery_env.j2 | 7 ------- playbooks/roles/discovery/templates/edx/app/discovery/discovery_gunicorn.py.j2 | 12 ------------ playbooks/roles/discovery/templates/edx/app/nginx/sites-available/discovery.j2 | 76 ---------------------------------------------------------------------------- playbooks/roles/discovery/templates/edx/app/supervisor/conf.d.available/discovery.conf.j2 | 12 ------------ playbooks/roles/edx_django_service/defaults/main.yml | 25 ++++++++++++++++++------- playbooks/roles/edx_django_service/meta/main.yml | 2 ++ playbooks/sample_vars/server_vars.yml | 1 - 17 files changed, 118 insertions(+), 608 deletions(-) delete mode 100644 docker/build/discovery/inventory delete mode 100644 playbooks/roles/discovery/templates/edx/app/discovery/devstack.sh.j2 delete mode 100644 playbooks/roles/discovery/templates/edx/app/discovery/discovery.sh.j2 delete mode 100644 playbooks/roles/discovery/templates/edx/app/discovery/discovery_env.j2 delete mode 100644 playbooks/roles/discovery/templates/edx/app/discovery/discovery_gunicorn.py.j2 delete mode 100644 playbooks/roles/discovery/templates/edx/app/nginx/sites-available/discovery.j2 delete mode 100644 playbooks/roles/discovery/templates/edx/app/supervisor/conf.d.available/discovery.conf.j2 diff --git a/docker/build/discovery/Dockerfile b/docker/build/discovery/Dockerfile index f8832de..97cbbdf 100644 --- a/docker/build/discovery/Dockerfile +++ b/docker/build/discovery/Dockerfile @@ -9,26 +9,17 @@ FROM edxops/xenial-common:latest MAINTAINER edxops - -ENV DISCOVERY_VERSION=master -ENV REPO_OWNER=edx +USER root +CMD ["/edx/app/supervisor/venvs/supervisor/bin/supervisord", "-n", "--configuration", "/edx/app/supervisor/supervisord.conf"] ADD . /edx/app/edx_ansible/edx_ansible - WORKDIR /edx/app/edx_ansible/edx_ansible/docker/plays -RUN echo '{ "allow_root": true }' > /root/.bowerrc - -RUN apt-get update -RUN apt install -y xvfb firefox gettext - COPY docker/build/discovery/ansible_overrides.yml / + RUN sudo /edx/app/edx_ansible/venvs/edx_ansible/bin/ansible-playbook discovery.yml \ -c local -i '127.0.0.1,' \ - -t 'install,assets,devstack:install' \ - --extra-vars="@/ansible_overrides.yml" \ - --extra-vars="DISCOVERY_VERSION=$DISCOVERY_VERSION" \ - --extra-vars="COMMON_GIT_PATH=$REPO_OWNER" + -t 'install,assets,devstack' \ + --extra-vars="@/ansible_overrides.yml" -USER root -CMD ["/edx/app/supervisor/venvs/supervisor/bin/supervisord", "-n", "--configuration", "/edx/app/supervisor/supervisord.conf"] +EXPOSE 18381 diff --git a/docker/build/discovery/ansible_overrides.yml b/docker/build/discovery/ansible_overrides.yml index 37760ee..2c38933 100644 --- a/docker/build/discovery/ansible_overrides.yml +++ b/docker/build/discovery/ansible_overrides.yml @@ -1,8 +1,20 @@ --- -discovery_gunicorn_host: 0.0.0.0 -DISCOVERY_MYSQL: 'db' -DISCOVERY_DJANGO_SETTINGS_MODULE: 'course_discovery.settings.devstack' -DISCOVERY_ELASTICSEARCH_HOST: 'es' -DISCOVERY_GUNICORN_EXTRA: '--reload' +COMMON_GIT_PATH: 'edx' +DISCOVERY_VERSION: 'master' + COMMON_MYSQL_MIGRATE_USER: '{{ DISCOVERY_MYSQL_USER }}' COMMON_MYSQL_MIGRATE_PASS: '{{ DISCOVERY_MYSQL_PASSWORD }}' + +EDXAPP_LMS_BASE: 'edx.devstack.lms:18000' +EDXAPP_LMS_ROOT_URL: 'http://{{ EDXAPP_LMS_BASE }}' +EDXAPP_LMS_PUBLIC_ROOT_URL: 'http://localhost:18000' +EDXAPP_JWT_AUDIENCE: 'lms-key' + +DISCOVERY_MYSQL: 'edx.devstack.mysql' +DISCOVERY_DJANGO_SETTINGS_MODULE: 'course_discovery.settings.devstack' +DISCOVERY_ELASTICSEARCH_HOST: 'edx.devstack.elasticsearch' +DISCOVERY_GUNICORN_EXTRA: '--reload' +DISCOVERY_MEMCACHE: ['edx.devstack.memcached:11211'] +DISCOVERY_EXTRA_APPS: ['course_discovery.apps.edx_catalog_extensions'] + +edx_django_service_is_devstack: true diff --git a/docker/build/discovery/inventory b/docker/build/discovery/inventory deleted file mode 100644 index 8bb7ba6..0000000 --- a/docker/build/discovery/inventory +++ /dev/null @@ -1,2 +0,0 @@ -[local] -localhost diff --git a/playbooks/edx-east/discovery.yml b/playbooks/edx-east/discovery.yml index 787ef06..1fa1b40 100644 --- a/playbooks/edx-east/discovery.yml +++ b/playbooks/edx-east/discovery.yml @@ -9,8 +9,6 @@ CLUSTER_NAME: 'discovery' roles: - aws - - role: automated - AUTOMATED_USERS: "{{ DISCOVERY_AUTOMATED_USERS | default({}) }}" - role: nginx nginx_default_sites: - discovery diff --git a/playbooks/roles/common_vars/defaults/main.yml b/playbooks/roles/common_vars/defaults/main.yml index 1de8095..5a60020 100644 --- a/playbooks/roles/common_vars/defaults/main.yml +++ b/playbooks/roles/common_vars/defaults/main.yml @@ -208,3 +208,13 @@ COMMON_TRACKING_LOG_ROTATION: # COMMON_USING_SECURE_REPO: true COMMON_EXTRA_CONFIGURATION_SOURCES_CHECKING: false COMMON_EXTRA_CONFIGURATION_SOURCES: [] + +COMMON_OAUTH_PUBLIC_URL_ROOT: 'http://127.0.0.1:8000/oauth2' +COMMON_OAUTH_URL_ROOT: '{{ COMMON_OAUTH_PUBLIC_URL_ROOT }}' +COMMON_OAUTH_LOGOUT_URL: '{{ COMMON_OAUTH_PUBLIC_URL_ROOT }}/logout' + +COMMON_OIDC_ISSUER: '{{ COMMON_OAUTH_URL_ROOT }}' + +COMMON_JWT_AUDIENCE: 'SET-ME-PLEASE' +COMMON_JWT_ISSUER: '{{ COMMON_OIDC_ISSUER }}' +COMMON_JWT_SECRET_KEY: 'SET-ME-PLEASE' diff --git a/playbooks/roles/discovery/defaults/main.yml b/playbooks/roles/discovery/defaults/main.yml index bc64e48..2c2448d 100644 --- a/playbooks/roles/discovery/defaults/main.yml +++ b/playbooks/roles/discovery/defaults/main.yml @@ -10,36 +10,36 @@ ## # Defaults for role discovery # -DISCOVERY_GIT_IDENTITY: !!null -# depends upon Newrelic being enabled via COMMON_ENABLE_NEWRELIC -# and a key being provided via NEWRELIC_LICENSE_KEY -DISCOVERY_NEWRELIC_APPNAME: "{{ COMMON_ENVIRONMENT }}-{{ COMMON_DEPLOYMENT }}-{{ discovery_service_name }}" -DISCOVERY_PIP_EXTRA_ARGS: "-i {{ COMMON_PYPI_MIRROR_URL }}" -DISCOVERY_NGINX_PORT: 18381 -DISCOVERY_SSL_NGINX_PORT: 48381 + +# +# vars are namespace with the module name. +# +discovery_service_name: "discovery" +discovery_gunicorn_port: 8381 + +discovery_environment: + DISCOVERY_CFG: "{{ COMMON_CFG_DIR }}/{{ discovery_service_name }}.yml" + + +# +# OS packages +# + +discovery_debian_pkgs: + - libxml2-dev + - libxslt-dev + - libjpeg-dev + + +DISCOVERY_NGINX_PORT: "1{{ discovery_gunicorn_port }}" +DISCOVERY_SSL_NGINX_PORT: "4{{ discovery_gunicorn_port }}" DISCOVERY_DEFAULT_DB_NAME: 'discovery' DISCOVERY_MYSQL: 'localhost' # MySQL usernames are limited to 16 characters DISCOVERY_MYSQL_USER: 'discov001' DISCOVERY_MYSQL_PASSWORD: 'password' -DISCOVERY_MYSQL_PORT: '3306' -DISCOVERY_MYSQL_OPTIONS: - connect_timeout: 10 - -DISCOVERY_DATABASES: - # rw user - default: - ENGINE: 'django.db.backends.mysql' - NAME: '{{ DISCOVERY_DEFAULT_DB_NAME }}' - USER: '{{ DISCOVERY_MYSQL_USER }}' - PASSWORD: '{{ DISCOVERY_MYSQL_PASSWORD }}' - HOST: '{{ DISCOVERY_MYSQL }}' - PORT: '{{ DISCOVERY_MYSQL_PORT }}' - OPTIONS: '{{ DISCOVERY_MYSQL_OPTIONS }}' - ATOMIC_REQUESTS: false - CONN_MAX_AGE: 60 # Using SSL? See https://www.elastic.co/guide/en/shield/current/ssl-tls.html. # Using AWS? Use the AWS-provided host (e.g. https://search-test-abc123.us-east-1.es.amazonaws.com/). @@ -49,53 +49,23 @@ DISCOVERY_ELASTICSEARCH_INDEX_NAME: 'catalog' DISCOVERY_MEMCACHE: [ 'memcache' ] -DISCOVERY_CACHES: - default: - BACKEND: 'django.core.cache.backends.memcached.MemcachedCache' - KEY_PREFIX: '{{ discovery_service_name }}' - LOCATION: '{{ DISCOVERY_MEMCACHE }}' - DISCOVERY_VERSION: "master" DISCOVERY_DJANGO_SETTINGS_MODULE: "course_discovery.settings.production" -DISCOVERY_URL_ROOT: 'http://discovery:18381' +DISCOVERY_URL_ROOT: 'http://discovery:{{ DISCOVERY_NGINX_PORT }}' DISCOVERY_LOGOUT_URL: '{{ DISCOVERY_URL_ROOT }}/logout/' -DISCOVERY_OAUTH_URL_ROOT: '{{ EDXAPP_LMS_ROOT_URL | default("http://127.0.0.1:8000") }}/oauth2' -DISCOVERY_OIDC_LOGOUT_URL: '{{ EDXAPP_LMS_ROOT_URL | default("http://127.0.0.1:8000") }}/logout' - -DISCOVERY_EDX_DRF_EXTENSIONS: - OAUTH2_USER_INFO_URL: '{{ DISCOVERY_OAUTH_URL_ROOT }}/user_info' -DISCOVERY_JWT_AUDIENCE: '{{ EDXAPP_JWT_AUDIENCE | default("SET-ME-PLEASE") }}' -DISCOVERY_JWT_ISSUER: '{{ DISCOVERY_OAUTH_URL_ROOT }}' -DISCOVERY_JWT_SECRET_KEY: '{{ EDXAPP_JWT_SECRET_KEY | default("lms-secret") }}' - -DISCOVERY_JWT_AUTH: - JWT_ISSUERS: - - AUDIENCE: '{{ DISCOVERY_JWT_AUDIENCE }}' - ISSUER: '{{ DISCOVERY_JWT_ISSUER }}' - SECRET_KEY: '{{ DISCOVERY_JWT_SECRET_KEY }}' - -DISCOVERY_SESSION_EXPIRE_AT_BROWSER_CLOSE: false DISCOVERY_SECRET_KEY: 'Your secret key here' -DISCOVERY_TIME_ZONE: 'UTC' DISCOVERY_LANGUAGE_CODE: 'en-us' DISCOVERY_DEFAULT_PARTNER_ID: 1 +DISCOVERY_SESSION_EXPIRE_AT_BROWSER_CLOSE: false # Used to automatically configure OAuth2 Client DISCOVERY_SOCIAL_AUTH_EDX_OIDC_KEY : 'discovery-key' DISCOVERY_SOCIAL_AUTH_EDX_OIDC_SECRET : 'discovery-secret' DISCOVERY_SOCIAL_AUTH_REDIRECT_IS_HTTPS: false -DISCOVERY_SOCIAL_AUTH_EDX_OIDC_ISSUER: '{{ DISCOVERY_OAUTH_URL_ROOT }}' DISCOVERY_PLATFORM_NAME: 'Your Platform Name Here' -DISCOVERY_LMS_ROOT_URL: '{{ EDXAPP_LMS_ROOT_URL | default("http://127.0.0.1:8000") }}' -DISCOVERY_ECOMMERCE_API_URL: 'https://localhost:8002/api/v2/' -DISCOVERY_COURSES_API_URL: '{{ DISCOVERY_LMS_ROOT_URL }}/api/courses/v1/' -DISCOVERY_ORGANIZATIONS_API_URL: '{{ DISCOVERY_LMS_ROOT_URL }}/api/organizations/v0/' -DISCOVERY_MARKETING_API_URL: 'https://example.org/api/catalog/v2/' -DISCOVERY_MARKETING_URL_ROOT: 'https://example.org/' - DISCOVERY_DATA_DIR: '{{ COMMON_DATA_DIR }}/{{ discovery_service_name }}' DISCOVERY_MEDIA_ROOT: '{{ DISCOVERY_DATA_DIR }}/media' DISCOVERY_MEDIA_URL: '/media/' @@ -122,52 +92,20 @@ DISCOVERY_EMAIL_USE_TLS: False DISCOVERY_EMAIL_HOST_USER: '' DISCOVERY_EMAIL_HOST_PASSWORD: '' -DISCOVERY_PUBLISHER_FROM_EMAIL: 'None' - -DISCOVERY_EXTRA_APPS: [] - -DISCOVERY_SERVICE_CONFIG: - SESSION_EXPIRE_AT_BROWSER_CLOSE: '{{ DISCOVERY_SESSION_EXPIRE_AT_BROWSER_CLOSE }}' +DISCOVERY_PUBLISHER_FROM_EMAIL: !!null - SECRET_KEY: '{{ DISCOVERY_SECRET_KEY }}' - TIME_ZONE: '{{ DISCOVERY_TIME_ZONE }}' - LANGUAGE_CODE: '{{ DISCOVERY_LANGUAGE_CODE }}' +DISCOVERY_GUNICORN_EXTRA: '' - SOCIAL_AUTH_EDX_OIDC_KEY: '{{ DISCOVERY_SOCIAL_AUTH_EDX_OIDC_KEY }}' - SOCIAL_AUTH_EDX_OIDC_SECRET: '{{ DISCOVERY_SOCIAL_AUTH_EDX_OIDC_SECRET }}' - SOCIAL_AUTH_EDX_OIDC_ID_TOKEN_DECRYPTION_KEY: '{{ DISCOVERY_SOCIAL_AUTH_EDX_OIDC_SECRET }}' - SOCIAL_AUTH_EDX_OIDC_URL_ROOT: '{{ DISCOVERY_OAUTH_URL_ROOT }}' - SOCIAL_AUTH_REDIRECT_IS_HTTPS: '{{ DISCOVERY_SOCIAL_AUTH_REDIRECT_IS_HTTPS }}' - SOCIAL_AUTH_EDX_OIDC_LOGOUT_URL: '{{ DISCOVERY_OIDC_LOGOUT_URL }}' - SOCIAL_AUTH_EDX_OIDC_ISSUER: '{{ DISCOVERY_SOCIAL_AUTH_EDX_OIDC_ISSUER }}' - - STATIC_ROOT: "{{ COMMON_DATA_DIR }}/{{ discovery_service_name }}/staticfiles" - # db config - DATABASES: '{{ DISCOVERY_DATABASES }}' - CACHES: '{{ DISCOVERY_CACHES }}' +DISCOVERY_EXTRA_APPS: [] +discovery_service_config_overrides: ELASTICSEARCH_URL: '{{ DISCOVERY_ELASTICSEARCH_URL }}' ELASTICSEARCH_INDEX_NAME: '{{ DISCOVERY_ELASTICSEARCH_INDEX_NAME }}' PLATFORM_NAME: '{{ DISCOVERY_PLATFORM_NAME }}' - ECOMMERCE_API_URL: '{{ DISCOVERY_ECOMMERCE_API_URL }}' - COURSES_API_URL: '{{ DISCOVERY_COURSES_API_URL }}' - ORGANIZATIONS_API_URL: '{{ DISCOVERY_ORGANIZATIONS_API_URL }}' - MARKETING_API_URL: '{{ DISCOVERY_MARKETING_API_URL }}' - MARKETING_URL_ROOT: '{{ DISCOVERY_MARKETING_URL_ROOT }}' - - EDX_DRF_EXTENSIONS: '{{ DISCOVERY_EDX_DRF_EXTENSIONS }}' - - JWT_AUTH: '{{ DISCOVERY_JWT_AUTH }}' - DEFAULT_PARTNER_ID: '{{ DISCOVERY_DEFAULT_PARTNER_ID }}' - EXTRA_APPS: '{{ DISCOVERY_EXTRA_APPS }}' - - MEDIA_STORAGE_BACKEND: '{{ DISCOVERY_MEDIA_STORAGE_BACKEND }}' - STATICFILES_STORAGE: '{{ DISCOVERY_STATICFILES_STORAGE }}' - EMAIL_BACKEND: '{{ DISCOVERY_EMAIL_BACKEND }}' # Settings for django-ses email backend @@ -183,88 +121,5 @@ DISCOVERY_SERVICE_CONFIG: PUBLISHER_FROM_EMAIL: '{{ DISCOVERY_PUBLISHER_FROM_EMAIL }}' -DISCOVERY_REPOS: - - PROTOCOL: "{{ COMMON_GIT_PROTOCOL }}" - DOMAIN: "{{ COMMON_GIT_MIRROR }}" - PATH: "{{ COMMON_GIT_PATH }}" - REPO: course-discovery.git - VERSION: "{{ DISCOVERY_VERSION }}" - DESTINATION: "{{ discovery_code_dir }}" - SSH_KEY: "{{ DISCOVERY_GIT_IDENTITY }}" - - -DISCOVERY_GUNICORN_WORKERS: "2" -DISCOVERY_GUNICORN_EXTRA: "" -DISCOVERY_GUNICORN_EXTRA_CONF: "" -DISCOVERY_GUNICORN_WORKER_CLASS: "sync" - -DISCOVERY_HOSTNAME: '~^((stage|prod)-)?discovery.*' - -nginx_discovery_gunicorn_hosts: - - 127.0.0.1 - -# Vars that are used when the automated role is "mixed-in" via the deploying play -# This data structure specifies all the users with access to run command remotely -# over SSH and the fully qualified command that they can run via sudo to the -# application user - -DISCOVERY_AUTOMATED_USERS: - automated_user: - sudo_commands: - - command: "{{ discovery_venv_dir }}/python {{ discovery_home }}/{{ discovery_service_name }}/manage.py migrate --list" - sudo_user: "discovery" - authorized_keys: - - "SSH authorized key" - -# -# vars are namespace with the module name. -# -discovery_role_name: discovery -discovery_venv_dir: "{{ discovery_home }}/venvs/{{ discovery_service_name }}" - -discovery_environment: - DJANGO_SETTINGS_MODULE: "{{ DISCOVERY_DJANGO_SETTINGS_MODULE }}" - # rename should synch with app - COURSE_DISCOVERY_CFG: "{{ COMMON_CFG_DIR }}/{{ discovery_service_name }}.yml" - PATH: "{{ discovery_nodeenv_bin }}:{{ discovery_venv_dir }}/bin:{{ ansible_env.PATH }}" - - -discovery_migration_environment: - DJANGO_SETTINGS_MODULE: "{{ DISCOVERY_DJANGO_SETTINGS_MODULE }}" - # rename should synch with app - COURSE_DISCOVERY_CFG: "{{ COMMON_CFG_DIR }}/{{ discovery_service_name }}.yml" - PATH: "{{ discovery_venv_dir }}/bin:{{ ansible_env.PATH }}" - DB_MIGRATION_USER: "{{ COMMON_MYSQL_MIGRATE_USER }}" - DB_MIGRATION_PASS: "{{ COMMON_MYSQL_MIGRATE_PASS }}" - -discovery_service_name: "discovery" -discovery_user: "{{ discovery_service_name }}" -discovery_home: "{{ COMMON_APP_DIR }}/{{ discovery_service_name }}" -discovery_code_dir: "{{ discovery_home }}/{{ discovery_service_name }}" - -discovery_nodeenv_dir: "{{ discovery_home }}/nodeenvs/{{ discovery_service_name }}" -discovery_nodeenv_bin: "{{ discovery_nodeenv_dir }}/bin" -discovery_node_modules_dir: "{{ discovery_code_dir }}/node_modules" -discovery_node_bin: "{{ discovery_node_modules_dir }}/.bin" -discovery_node_version: "{{ common_node_version }}" - -discovery_gunicorn_host: "127.0.0.1" -discovery_gunicorn_port: 8381 -discovery_gunicorn_timeout: 300 - -discovery_log_dir: "{{ COMMON_LOG_DIR }}/{{ discovery_service_name }}" - -# -# OS packages -# - -discovery_debian_pkgs: - - libmysqlclient-dev - - libssl-dev - - libffi-dev # Needed to install the Python cryptography library for asymmetric JWT signing - - libmemcached-dev # Needed for memcache - - libxml2-dev - - libxslt-dev - - libjpeg-dev - -discovery_redhat_pkgs: [] +# See edx_django_service_automated_users for an example of what this should be +DISCOVERY_AUTOMATED_USERS: {} diff --git a/playbooks/roles/discovery/meta/main.yml b/playbooks/roles/discovery/meta/main.yml index 51bea5b..6b851e1 100644 --- a/playbooks/roles/discovery/meta/main.yml +++ b/playbooks/roles/discovery/meta/main.yml @@ -9,24 +9,42 @@ # ## # Role includes for role discovery -# +# # Example: # # dependencies: # - { -# role: my_role -# my_role_var0: "foo" -# my_role_var1: "bar" +# role: my_role +# my_role_var0: 'foo' +# my_role_var1: 'bar' # } dependencies: - - common - - supervisor - - role: edx_service - edx_service_name: "{{ discovery_service_name }}" - edx_service_config: "{{ DISCOVERY_SERVICE_CONFIG }}" - edx_service_repos: "{{ DISCOVERY_REPOS }}" - edx_service_user: "{{ discovery_user }}" - edx_service_home: "{{ discovery_home }}" - edx_service_packages: - debian: "{{ discovery_debian_pkgs }}" - redhat: "{{ discovery_redhat_pkgs }}" + - role: edx_django_service + edx_django_service_repo: 'course-discovery' + edx_django_service_version: '{{ DISCOVERY_VERSION }}' + edx_django_service_name: '{{ discovery_service_name }}' + edx_django_service_config_overrides: '{{ discovery_service_config_overrides }}' + edx_django_service_debian_pkgs_extra: '{{ discovery_debian_pkgs }}' + edx_django_service_gunicorn_port: '{{ discovery_gunicorn_port }}' + edx_django_service_django_settings_module: '{{ DISCOVERY_DJANGO_SETTINGS_MODULE }}' + edx_django_service_environment_extra: '{{ discovery_environment }}' + edx_django_service_gunicorn_extra: '{{ DISCOVERY_GUNICORN_EXTRA }}' + edx_django_service_wsgi_name: 'course_discovery' + edx_django_service_nginx_port: '{{ DISCOVERY_NGINX_PORT }}' + edx_django_service_ssl_nginx_port: '{{ DISCOVERY_SSL_NGINX_PORT }}' + edx_django_service_language_code: '{{ DISCOVERY_LANGUAGE_CODE }}' + edx_django_service_secret_key: '{{ DISCOVERY_SECRET_KEY }}' + edx_django_service_staticfiles_storage: '{{ DISCOVERY_STATICFILES_STORAGE }}' + edx_django_service_media_storage_backend: '{{ DISCOVERY_MEDIA_STORAGE_BACKEND }}' + edx_django_service_memcache: '{{ DISCOVERY_MEMCACHE }}' + edx_django_service_default_db_host: '{{ DISCOVERY_MYSQL }}' + edx_django_service_default_db_name: '{{ DISCOVERY_DEFAULT_DB_NAME }}' + edx_django_service_default_db_atomic_requests: false + edx_django_service_db_user: '{{ DISCOVERY_MYSQL_USER }}' + edx_django_service_db_password: '{{ DISCOVERY_MYSQL_PASSWORD }}' + edx_django_service_social_auth_edx_oidc_key: '{{ DISCOVERY_SOCIAL_AUTH_EDX_OIDC_KEY }}' + edx_django_service_social_auth_edx_oidc_secret: '{{ DISCOVERY_SOCIAL_AUTH_EDX_OIDC_SECRET }}' + edx_django_service_social_auth_redirect_is_https: '{{ DISCOVERY_SOCIAL_AUTH_REDIRECT_IS_HTTPS }}' + edx_django_service_extra_apps: '{{ DISCOVERY_EXTRA_APPS }}' + edx_django_service_session_expire_at_browser_close: '{{ DISCOVERY_SESSION_EXPIRE_AT_BROWSER_CLOSE }}' + edx_django_service_automated_users: '{{ DISCOVERY_AUTOMATED_USERS }}' diff --git a/playbooks/roles/discovery/tasks/main.yml b/playbooks/roles/discovery/tasks/main.yml index ff3fb1c..e9e4dc8 100644 --- a/playbooks/roles/discovery/tasks/main.yml +++ b/playbooks/roles/discovery/tasks/main.yml @@ -11,7 +11,7 @@ # # Tasks for role discovery # -# Overview: +# Overview: This role's tasks come from edx_django_service. # # # Dependencies: @@ -20,219 +20,3 @@ # Example play: # # - -- name: add gunicorn configuration file - template: - src: edx/app/discovery/discovery_gunicorn.py.j2 - dest: "{{ discovery_home }}/discovery_gunicorn.py" - become_user: "{{ discovery_user }}" - tags: - - install - - install:configuration - -- name: add deadsnakes repository - apt_repository: - repo: "ppa:fkrull/deadsnakes" - tags: - - install - - install:system-requirements - -- name: install python3.5 - apt: - name: "{{ item }}" - with_items: - - python3.5 - - python3.5-dev - tags: - - install - - install:system-requirements - -- name: build virtualenv - command: "virtualenv --python=python3.5 {{ discovery_venv_dir }}" - args: - creates: "{{ discovery_venv_dir }}/bin/pip" - become_user: "{{ discovery_user }}" - tags: - - install - - install:system-requirements - -- name: install nodenv - pip: - name: "nodeenv" - version: "1.1.1" - # NOTE (CCB): Using the "virtualenv" option here doesn't seem to work. - executable: "{{ discovery_venv_dir }}/bin/pip" - become_user: "{{ discovery_user }}" - tags: - - install - - install:system-requirements - -- name: create nodeenv - shell: "{{ discovery_venv_dir }}/bin/nodeenv {{ discovery_nodeenv_dir }} --node={{ discovery_node_version }} --prebuilt --force" - become_user: "{{ discovery_user }}" - tags: - - install - - install:system-requirements - -- name: install application requirements - command: make production-requirements - args: - chdir: "{{ discovery_code_dir }}" - become_user: "{{ discovery_user }}" - environment: "{{ discovery_environment }}" - tags: - - install - - install:app-requirements - -- name: install development requirements - command: make requirements - args: - chdir: "{{ discovery_code_dir }}" - become_user: "{{ discovery_user }}" - environment: "{{ discovery_environment }}" - tags: - - devstack - - devstack:install - -- name: migrate database - command: make migrate - args: - chdir: "{{ discovery_code_dir }}" - become_user: "{{ discovery_user }}" - environment: "{{ discovery_migration_environment }}" - when: migrate_db is defined and migrate_db|lower == "yes" - tags: - - migrate - - migrate:db - -- name: write out the supervisor wrapper - template: - src: "edx/app/discovery/discovery.sh.j2" - dest: "{{ discovery_home }}/{{ discovery_service_name }}.sh" - mode: 0650 - owner: "{{ supervisor_user }}" - group: "{{ common_web_user }}" - tags: - - install - - install:configuration - -- name: write supervisord config - template: - src: "edx/app/supervisor/conf.d.available/discovery.conf.j2" - dest: "{{ supervisor_available_dir }}/{{ discovery_service_name }}.conf" - owner: "{{ supervisor_user }}" - group: "{{ common_web_user }}" - mode: 0644 - tags: - - install - - install:configuration - -- name: write devstack script - template: - src: "edx/app/discovery/devstack.sh.j2" - dest: "{{ discovery_home }}/devstack.sh" - owner: "{{ supervisor_user }}" - group: "{{ common_web_user }}" - mode: 0744 - tags: - - devstack - - devstack:install - -- name: setup the discovery env file - template: - src: "./{{ discovery_home }}/{{ discovery_service_name }}_env.j2" - dest: "{{ discovery_home }}/discovery_env" - owner: "{{ discovery_user }}" - group: "{{ discovery_user }}" - mode: 0644 - tags: - - install - - install:configuration - -- name: enable supervisor script - file: - src: "{{ supervisor_available_dir }}/{{ discovery_service_name }}.conf" - dest: "{{ supervisor_cfg_dir }}/{{ discovery_service_name }}.conf" - state: link - force: yes - when: not disable_edx_services - tags: - - install - - install:configuration - -- name: update supervisor configuration - command: "{{ supervisor_ctl }} -c {{ supervisor_cfg }} update" - when: not disable_edx_services - tags: - - manage - - manage:start - -- name: create symlinks from the venv bin dir - file: - src: "{{ discovery_venv_dir }}/bin/{{ item }}" - dest: "{{ COMMON_BIN_DIR }}/{{ item.split('.')[0] }}.discovery" - state: link - with_items: - - python - - pip - - django-admin.py - tags: - - install - - install:app-requirements - -- name: create symlinks from the repo dir - file: - src: "{{ discovery_code_dir }}/{{ item }}" - dest: "{{ COMMON_BIN_DIR }}/{{ item.split('.')[0] }}.discovery" - state: link - with_items: - - manage.py - tags: - - install - - install:app-requirements - -- name: run collectstatic - command: make static - args: - chdir: "{{ discovery_code_dir }}" - become_user: "{{ discovery_user }}" - environment: "{{ discovery_environment }}" - tags: - - assets - - assets:gather - -- name: restart the application - supervisorctl: - state: restarted - supervisorctl_path: "{{ supervisor_ctl }}" - config: "{{ supervisor_cfg }}" - name: "{{ discovery_service_name }}" - when: not disable_edx_services - become_user: "{{ supervisor_service_user }}" - tags: - - manage - - manage:start - -- name: Copying nginx configs for discovery - template: - src: "edx/app/nginx/sites-available/discovery.j2" - dest: "{{ nginx_sites_available_dir }}/discovery" - owner: root - group: "{{ common_web_user }}" - mode: 0640 - notify: reload nginx - tags: - - install - - install:vhosts - -- name: Creating nginx config links for discovery - file: - src: "{{ nginx_sites_available_dir }}/discovery" - dest: "{{ nginx_sites_enabled_dir }}/discovery" - state: link - owner: root - group: root - notify: reload nginx - tags: - - install - - install:vhosts diff --git a/playbooks/roles/discovery/templates/edx/app/discovery/devstack.sh.j2 b/playbooks/roles/discovery/templates/edx/app/discovery/devstack.sh.j2 deleted file mode 100644 index da04ed6..0000000 --- a/playbooks/roles/discovery/templates/edx/app/discovery/devstack.sh.j2 +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env bash - -# {{ ansible_managed }} - -source {{ discovery_home }}/discovery_env -COMMAND=$1 - -case $COMMAND in - start) - {% set discovery_venv_bin = discovery_venv_dir + "/bin" %} - - {{ supervisor_venv_bin }}/supervisord --configuration {{ supervisor_cfg }} - - # Needed to run bower as root. See explaination around 'discovery_user=root' - echo '{ "allow_root": true }' > /root/.bowerrc - - cd /edx/app/edx_ansible/edx_ansible/docker/plays - /edx/app/edx_ansible/venvs/edx_ansible/bin/ansible-playbook discovery.yml -c local -i '127.0.0.1,' \ - -t 'install:app-requirements,assets:gather,devstack,migrate' \ - --extra-vars="migrate_db=yes" \ - --extra-vars="@/ansible_overrides.yml" \ - --extra-vars="discovery_user=root" # Needed when sharing the volume with the host machine because node/bower drops - # everything in the code directory by default. So we get issues with permissions - # on folders owned by the developer. - - - # Need to start supervisord and nginx manually because systemd is hard to run on docker - # http://developers.redhat.com/blog/2014/05/05/running-systemd-within-docker-container/ - # Both daemon by default - nginx - /edx/app/supervisor/venvs/supervisor/bin/supervisord --configuration /edx/app/supervisor/supervisord.conf - - # Docker requires an active foreground task. Tail the logs to appease Docker and - # provide useful output for development. - cd {{ supervisor_log_dir }} - tail -f {{ discovery_service_name }}-stderr.log -f {{ discovery_service_name }}-stdout.log - ;; - open) - cd {{ discovery_code_dir }} - . {{ discovery_venv_bin }}/activate - /bin/bash - ;; -esac diff --git a/playbooks/roles/discovery/templates/edx/app/discovery/discovery.sh.j2 b/playbooks/roles/discovery/templates/edx/app/discovery/discovery.sh.j2 deleted file mode 100644 index f8d44c0..0000000 --- a/playbooks/roles/discovery/templates/edx/app/discovery/discovery.sh.j2 +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash - -# {{ ansible_managed }} - -{% set discovery_venv_bin = discovery_home + "/venvs/" + discovery_service_name + "/bin" %} -{% if COMMON_ENABLE_NEWRELIC_APP %} -{% set executable = discovery_venv_bin + '/newrelic-admin run-program ' + discovery_venv_bin + '/gunicorn' %} -{% else %} -{% set executable = discovery_venv_bin + '/gunicorn' %} -{% endif %} - -{% if COMMON_ENABLE_NEWRELIC_APP %} -export NEW_RELIC_APP_NAME="{{ DISCOVERY_NEWRELIC_APPNAME }}" -export NEW_RELIC_LICENSE_KEY="{{ NEWRELIC_LICENSE_KEY }}" -{% endif -%} - -source {{ discovery_home }}/discovery_env -{{ executable }} -c {{ discovery_home }}/discovery_gunicorn.py {{ DISCOVERY_GUNICORN_EXTRA }} course_discovery.wsgi:application diff --git a/playbooks/roles/discovery/templates/edx/app/discovery/discovery_env.j2 b/playbooks/roles/discovery/templates/edx/app/discovery/discovery_env.j2 deleted file mode 100644 index f083e70..0000000 --- a/playbooks/roles/discovery/templates/edx/app/discovery/discovery_env.j2 +++ /dev/null @@ -1,7 +0,0 @@ -# {{ ansible_managed }} - -{% for name,value in discovery_environment.items() -%} -{%- if value -%} -export {{ name }}="{{ value }}" -{% endif %} -{%- endfor %} diff --git a/playbooks/roles/discovery/templates/edx/app/discovery/discovery_gunicorn.py.j2 b/playbooks/roles/discovery/templates/edx/app/discovery/discovery_gunicorn.py.j2 deleted file mode 100644 index 1269c1c..0000000 --- a/playbooks/roles/discovery/templates/edx/app/discovery/discovery_gunicorn.py.j2 +++ /dev/null @@ -1,12 +0,0 @@ -""" -gunicorn configuration file: http://docs.gunicorn.org/en/develop/configure.html -{{ ansible_managed }} -""" - -timeout = {{ discovery_gunicorn_timeout }} -bind = "{{ discovery_gunicorn_host }}:{{ discovery_gunicorn_port }}" -pythonpath = "{{ discovery_code_dir }}" -workers = {{ DISCOVERY_GUNICORN_WORKERS }} -worker_class = "{{ DISCOVERY_GUNICORN_WORKER_CLASS }}" - -{{ DISCOVERY_GUNICORN_EXTRA_CONF }} diff --git a/playbooks/roles/discovery/templates/edx/app/nginx/sites-available/discovery.j2 b/playbooks/roles/discovery/templates/edx/app/nginx/sites-available/discovery.j2 deleted file mode 100644 index 85cafd3..0000000 --- a/playbooks/roles/discovery/templates/edx/app/nginx/sites-available/discovery.j2 +++ /dev/null @@ -1,76 +0,0 @@ -# -# {{ ansible_managed }} -# - - -{% if nginx_default_sites is defined and "discovery" in nginx_default_sites %} - {% set default_site = "default_server" %} -{% else %} - {% set default_site = "" %} -{% endif %} - -upstream discovery_app_server { -{% for host in nginx_discovery_gunicorn_hosts %} - server {{ host }}:{{ discovery_gunicorn_port }} fail_timeout=0; -{% endfor %} -} - -server { - server_name {{ DISCOVERY_HOSTNAME }}; - - {% if NGINX_ENABLE_SSL %} - - listen {{ DISCOVERY_NGINX_PORT }} {{ default_site }}; - listen {{ DISCOVERY_SSL_NGINX_PORT }} ssl; - - ssl_certificate /etc/ssl/certs/{{ NGINX_SSL_CERTIFICATE|basename }}; - ssl_certificate_key /etc/ssl/private/{{ NGINX_SSL_KEY|basename }}; - # request the browser to use SSL for all connections - add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; - - {% else %} - listen {{ DISCOVERY_NGINX_PORT }} {{ default_site }}; - {% endif %} - - location ~ ^/static/(?P<file>.*) { - root {{ COMMON_DATA_DIR }}/{{ discovery_service_name }}; - try_files /staticfiles/$file =404; - } - - location / { - try_files $uri @proxy_to_app; - } - - {% if NGINX_ROBOT_RULES|length > 0 %} - location /robots.txt { - root {{ nginx_app_dir }}; - try_files $uri /robots.txt =404; - } - {% endif %} - - location @proxy_to_app { - {% if NGINX_SET_X_FORWARDED_HEADERS %} - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header X-Forwarded-Port $server_port; - proxy_set_header X-Forwarded-For $remote_addr; - {% else %} - proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto; - proxy_set_header X-Forwarded-Port $http_x_forwarded_port; - proxy_set_header X-Forwarded-For $http_x_forwarded_for; - {% endif %} - proxy_set_header Host $http_host; - - proxy_redirect off; - proxy_pass http://discovery_app_server; - } - - # Forward to HTTPS if we're an HTTP request... - if ($http_x_forwarded_proto = "http") { - set $do_redirect "true"; - } - - # Run our actual redirect... - if ($do_redirect = "true") { - rewrite ^ https://$host$request_uri? permanent; - } -} diff --git a/playbooks/roles/discovery/templates/edx/app/supervisor/conf.d.available/discovery.conf.j2 b/playbooks/roles/discovery/templates/edx/app/supervisor/conf.d.available/discovery.conf.j2 deleted file mode 100644 index 2d9a026..0000000 --- a/playbooks/roles/discovery/templates/edx/app/supervisor/conf.d.available/discovery.conf.j2 +++ /dev/null @@ -1,12 +0,0 @@ -# -# {{ ansible_managed }} -# -[program:{{ discovery_service_name }}] - -command={{ discovery_home }}/{{ discovery_service_name }}.sh -user={{ common_web_user }} -directory={{ discovery_code_dir }} -stdout_logfile={{ supervisor_log_dir }}/%(program_name)s-stdout.log -stderr_logfile={{ supervisor_log_dir }}/%(program_name)s-stderr.log -killasgroup=true -stopasgroup=true diff --git a/playbooks/roles/edx_django_service/defaults/main.yml b/playbooks/roles/edx_django_service/defaults/main.yml index 2bcf512..ffd290f 100644 --- a/playbooks/roles/edx_django_service/defaults/main.yml +++ b/playbooks/roles/edx_django_service/defaults/main.yml @@ -112,6 +112,8 @@ edx_django_service_default_db_name: '{{ edx_django_service_name }}' edx_django_service_default_db_atomic_requests: false edx_django_service_db_user: 'REPLACE-ME' edx_django_service_db_password: 'password' +edx_django_service_db_options: + connect_timeout: 10 edx_django_service_databases: default: @@ -123,19 +125,20 @@ edx_django_service_databases: PORT: '3306' ATOMIC_REQUESTS: '{{ edx_django_service_default_db_atomic_requests }}' CONN_MAX_AGE: 60 + OPTIONS: '{{ edx_django_service_db_options }}' edx_django_service_social_auth_edx_oidc_key: '{{ edx_django_service_name }}-key' edx_django_service_social_auth_edx_oidc_secret: '{{ edx_django_service_name }}-secret' edx_django_service_social_auth_redirect_is_https: false -edx_django_service_oauth_public_url_root: '{{ EDXAPP_LMS_PUBLIC_ROOT_URL | default("http://127.0.0.1:8000") }}/oauth2' -edx_django_service_oauth_url_root: '{{ EDXAPP_LMS_ROOT_URL | default("http://127.0.0.1:8000") }}/oauth2' -edx_django_service_oidc_logout_url: '{{ EDXAPP_LMS_PUBLIC_ROOT_URL | default("http://127.0.0.1:8000") }}/logout' -edx_django_service_oidc_issuer: '{{ edx_django_service_oauth_url_root }}' +edx_django_service_oauth_public_url_root: '{{ COMMON_OAUTH_PUBLIC_URL_ROOT }}' +edx_django_service_oauth_url_root: '{{COMMON_OAUTH_URL_ROOT }}' +edx_django_service_oidc_logout_url: '{{ COMMON_OAUTH_LOGOUT_URL }}' +edx_django_service_oidc_issuer: '{{ COMMON_OIDC_ISSUER }}' -edx_django_service_jwt_audience: '{{ EDXAPP_JWT_AUDIENCE | default("SET-ME-PLEASE") }}' -edx_django_service_jwt_issuer: '{{ edx_django_service_oauth_url_root }}' -edx_django_service_jwt_secret_key: '{{ EDXAPP_JWT_SECRET_KEY | default("lms-secret") }}' +edx_django_service_jwt_audience: '{{ COMMON_JWT_AUDIENCE }}' +edx_django_service_jwt_issuer: '{{ COMMON_JWT_ISSUER }}' +edx_django_service_jwt_secret_key: '{{ COMMON_JWT_SECRET_KEY }}' edx_django_service_session_expire_at_browser_close: false @@ -181,3 +184,11 @@ edx_django_service_config_default: # NOTE: This should be overridden by inheriting service-specific role. edx_django_service_config_overrides: {} edx_django_service_config: '{{ edx_django_service_config_default|combine(edx_django_service_config_overrides) }}' + +edx_django_service_automated_users: + automated_user: + sudo_commands: + - command: '{{ edx_django_service_venv_dir }}/python {{ edx_django_service_code_dir }}/manage.py migrate --list' + sudo_user: '{{ edx_django_service_user }}' + authorized_keys: + - 'SSH authorized key' diff --git a/playbooks/roles/edx_django_service/meta/main.yml b/playbooks/roles/edx_django_service/meta/main.yml index 3a9e377..8068155 100644 --- a/playbooks/roles/edx_django_service/meta/main.yml +++ b/playbooks/roles/edx_django_service/meta/main.yml @@ -2,6 +2,8 @@ dependencies: - common - supervisor + - role: automated + AUTOMATED_USERS: "{{ edx_django_service_automated_users }}" - role: edx_service edx_service_name: "{{ edx_django_service_name }}" edx_service_config: "{{ edx_django_service_config }}" diff --git a/playbooks/sample_vars/server_vars.yml b/playbooks/sample_vars/server_vars.yml index bbba761..e591c5e 100644 --- a/playbooks/sample_vars/server_vars.yml +++ b/playbooks/sample_vars/server_vars.yml @@ -36,7 +36,6 @@ #CREDENTIALS_SOCIAL_AUTH_REDIRECT_IS_HTTPS: true #COURSE_DISCOVERY_ECOMMERCE_API_URL: "https://ecommerce-${deploy_host}/api/v2" # -#DISCOVERY_OAUTH_URL_ROOT: "https://${deploy_host}" #DISCOVERY_URL_ROOT: "https://discovery-${deploy_host}" #DISCOVERY_SOCIAL_AUTH_REDIRECT_IS_HTTPS: true -- libgit2 0.26.0