Commit d56788f6 by John Jarvis

Merge pull request #390 from edx/jarv/edxapp-env

Some environment changes to speed up deploys
parents 08c5c421 fbee5b87
......@@ -77,6 +77,9 @@
- name: certs | create a symlink for venv python
file: >
src="{{ certs_venv_bin }}/python"
dest={{ COMMON_BIN_DIR }}/python.certs
src="{{ certs_venv_bin }}/{{ item }}"
dest={{ COMMON_BIN_DIR }}/{{ item }}.certs
state=link
with_items:
- python
- pip
---
devpi_venv_dir: "{{ COMMON_APP_DIR }}/devpi/venvs/devpi"
devpi_app_dir: "{{ COMMON_APP_DIR }}/devpi"
devpi_data_dir: "{{ COMMON_DATA_DIR }}/devpi"
devpi_mirror_dir: "{{ devpi_data_dir }}/data"
devpi_log_dir: "{{ COMMON_LOG_DIR }}/devpi"
devpi_venvs_dir: "{{ devpi_app_dir }}/venvs"
devpi_venv_dir: "{{ devpi_venvs_dir }}/devpi"
devpi_venv_bin: "{{ devpi_venv_dir }}/bin"
devpi_supervisor_ctl: "{{ devpi_venv_bin }}/supervisorctl"
devpi_pip_pkgs:
- devpi-server
- eventlet
devpi_nginx_port: 80
devpi_port: 4040
devpi_data_dir: /var/devpi/data
devpi_user: devpi
devpi_group: devpi
devpi_server_name: 'pypy.*'
devpi_supervisor_user: devpi.supervisor
devpi_supervisor_app_dir: "{{ devpi_app_dir }}/supervisor"
devpi_supervisor_cfg_dir: "{{ devpi_supervisor_app_dir }}/conf.d"
devpi_supervisor_data_dir: "{{ devpi_data_dir }}/supervisor"
devpi_supervisor_cfg: "{{ devpi_supervisor_app_dir }}/supervisor.conf"
devpi_supervisor_log_dir: "{{ devpi_log_dir }}/supervisor"
......@@ -13,13 +13,16 @@
---
- name: devpi | restart devpi
supervisorctl: >
state=restarted
config={{ supervisor_cfg }}
state=restarted
supervisorctl_path={{ devpi_supervisor_ctl }}
config={{ devpi_supervisor_cfg }}
name=devpi-server
sudo_user: "{{ devpi_supervisor_user }}"
- name: devpi | start devpi
supervisorctl: >
state=started
config={{ supervisor_cfg }}
supervisorctl_path={{ devpi_supervisor_ctl }}
config={{ devpi_supervisor_cfg }}
name=devpi-server
sudo_user: "{{ devpi_supervisor_user }}"
......@@ -33,36 +33,62 @@
- name: devpi | create devpi user
user: >
name={{ devpi_user }}
state=present
shell=/bin/false createhome=no
- name: devpi | create virtualenv directory
- name: devpi | create devpi application directories
file: >
path={{ devpi_venv_dir }}
path={{ item }}
state=directory
owner={{ devpi_user }}
group={{ devpi_group }}
notify: devpi | restart devpi
group={{ devpi_supervisor_user }}
notify: supervisor | restart supervisor
with_items:
- "{{ devpi_app_dir }}"
- "{{ devpi_venv_dir }}"
- name: devpi | create the devpi data directory
- name: devpi | create the devpi data directory, needs write access by the service user
file: >
path={{ devpi_data_dir }}
path={{ item }}
state=directory
owner={{ devpi_user }}
group={{ devpi_group }}
owner={{ devpi_supervisor_user }}
group={{ devpi_user }}
with_items:
- "{{ devpi_data_dir }}"
- "{{ devpi_mirror_dir }}"
- name: devpi | install devpi pip pkgs
pip: >
name={{ item }}
state=present
state=present
virtualenv={{ devpi_venv_dir }}
sudo_user: "{{ devpi_user }}"
with_items: devpi_pip_pkgs
notify: devpi | restart devpi
notify: supervisor | restart supervisor
- name: supervisor | ensure supervisor is started
service: name=supervisor state=started
- name: devpi | writing supervisor script
template: >
src=devpi.conf.j2 dest={{ devpi_supervisor_cfg_dir }}/devpi.conf
owner={{ devpi_user }} group={{ devpi_user }} mode=0644
notify: supervisor | restart supervisor
- name: devpi | create a symlink for venv python, pip and supervisor
file: >
src="{{ devpi_venv_bin }}/{{ item }}"
dest={{ COMMON_BIN_DIR }}/{{ item }}.devpi
state=link
with_items:
- python
- pip
- supervisorctl
- name: devpi | create a symlink for supervisor config
file: >
src="{{ devpi_supervisor_app_dir }}/supervisord.conf"
dest={{ COMMON_CFG_DIR }}/supervisord.conf.devpi
state=link
- name: devpi | ensure devpi is running
supervisorctl: >
state=started
config={{ supervisor_cfg }}
name=devpi-server
# flush queued up handlers so that devpi
# is restarted since downstream roles
# will need to use it
- meta: flush_handlers
[program:devpi-server]
command={{ devpi_venv_bin }}/devpi-server --port {{ devpi_port }} --serverdir {{ devpi_mirror_dir }}
user={{ devpi_supervisor_user }}
priority=999
stdout_logfile={{ devpi_supervisor_log_dir }}/%(program_name)-stdout.log
stderr_logfile={{ devpi_supervisor_log_dir }}/%(program_name)-stderr.log
autostart=True
......@@ -111,6 +111,7 @@ edxapp_staticfile_dir: "{{ edxapp_data_dir }}/staticfiles"
edxapp_course_data_dir: "{{ edxapp_data_dir }}/data"
edxapp_upload_dir: "{{ edxapp_data_dir }}/uploads"
edxapp_theme_dir: "{{ edxapp_data_dir }}/themes"
edxapp_pypi_local_mirror: "http://localhost:{{ devpi_port }}/root/pypi/+simple"
edxapp_workers:
- queue: low
service_variant: cms
......@@ -134,15 +135,22 @@ edxapp_workers:
service_variant: lms
concurrency: 2
edxapp_all_req_files:
- "{{ pre_requirements_file }}"
- "{{ post_requirements_file }}"
- "{{ repo_requirements_file }}"
- "{{ github_requirements_file }}"
- "{{ local_requirements_file }}"
- "{{ sandbox_base_requirements }}"
- "{{ sandbox_local_requirements }}"
- "{{ sandbox_post_requirements }}"
- "{{ edxapp_code_dir }}/package.json"
- "{{ edxapp_code_dir }}/Gemfile"
# TODO: old style variable syntax is necessary
# here until ansible 1.4
edxapp_deploy_environment:
# for lists and dictionaries
edxapp_environment:
LANG: $EDXAPP_LANG
NO_PREREQ_INSTALL: 1
SKIP_WS_MIGRATIONS: 1
......
......@@ -4,3 +4,4 @@ dependencies:
rbenv_user: "{{ edxapp_user }}"
rbenv_dir: "{{ edxapp_app_dir }}"
rbenv_ruby_version: "{{ edxapp_ruby_version }}"
- devpi
......@@ -30,15 +30,14 @@
# Do A Checkout
- name: edxapp | checkout edx-platform repo into {{edxapp_code_dir}}
git: dest={{edxapp_code_dir}} repo={{edx_platform_repo}} version={{edx_platform_commit}}
register: edx_platform_checkout
register: chkout
sudo_user: "{{ edxapp_user }}"
tags:
- deploy
- name: edxapp | git clean after checking out edx-platform
shell: cd {{edxapp_code_dir}} && git clean -xdf
when: edx_platform_checkout.changed
when: chkout.changed
sudo_user: "{{ edxapp_user }}"
tags:
- deploy
......@@ -51,16 +50,43 @@
tags:
- deploy
- name: edxapp | create checksum for requirements, package.json and Gemfile
shell: >
/usr/bin/md5sum {{ " ".join(edxapp_all_req_files) }} 2>/dev/null > /var/tmp/edxapp.req.new
sudo_user: "{{ edxapp_user }}"
ignore_errors: true
when: chkout.changed
tags:
- deploy
- stat: path=/var/tmp/edxapp.req.new
register: new
tags: deploy
- stat: path=/var/tmp/edxapp.req.installed
register: inst
tags: deploy
# Substitute github mirror in all requirements files
- name: edxapp | Updating requirement files for git mirror
command: |
/bin/sed -i -e 's/github\.com/{{ COMMON_GIT_MIRROR }}/g' {{ item }}
with_items: edxapp_all_req_files
sudo_user: "{{ edxapp_user }}"
when: chkout.changed and not inst.stat.exists or new.stat.md5 != inst.stat.md5
tags: deploy
# Ruby plays that need to be run after platform updates.
- name: edxapp | gem install bundler
shell: >
gem install bundle
chdir={{ edxapp_code_dir }}
executable=/bin/bash
environment: "{{ edxapp_deploy_environment }}"
environment: "{{ edxapp_environment }}"
sudo_user: "{{ edxapp_user }}"
tags:
- deploy
when: chkout.changed and not inst.stat.exists or new.stat.md5 != inst.stat.md5
tags: deploy
- name: edxapp | bundle install
shell: >
......@@ -68,37 +94,18 @@
chdir={{ edxapp_code_dir }}
executable=/bin/bash
sudo_user: "{{ edxapp_user }}"
environment: "{{ edxapp_deploy_environment }}"
tags:
- deploy
environment: "{{ edxapp_environment }}"
when: chkout.changed and not inst.stat.exists or new.stat.md5 != inst.stat.md5
tags: deploy
# Node play that need to be run after platform updates.
- name: edxapp | Install edx-platform npm dependencies
shell: npm install chdir={{ edxapp_code_dir }}
sudo_user: "{{ edxapp_user }}"
environment: "{{ edxapp_deploy_environment }}"
tags:
- deploy
environment: "{{ edxapp_environment }}"
when: chkout.changed and not inst.stat.exists or new.stat.md5 != inst.stat.md5
tags: deploy
# Python plays that need to be run after platform updates.
# Substitute github mirror in all requirements files
#
- name: edxapp | Updating requirement files for git mirror
command: |
/bin/sed -i -e 's/github\.com/{{ COMMON_GIT_MIRROR }}/g' {{ item }}
with_items:
- "{{ pre_requirements_file }}"
- "{{ post_requirements_file }}"
- "{{ repo_requirements_file }}"
- "{{ github_requirements_file }}"
- "{{ local_requirements_file }}"
- "{{ sandbox_base_requirements }}"
- "{{ sandbox_local_requirements }}"
- "{{ sandbox_post_requirements }}"
sudo_user: "{{ edxapp_user }}"
tags:
- deploy
# Install the python pre requirements into {{ edxapp_venv_dir }}
- name : edxapp | install python pre-requirements
......@@ -106,20 +113,24 @@
requirements="{{pre_requirements_file}}"
virtualenv="{{edxapp_venv_dir}}"
state=present
extra_args="-i {{ COMMON_PYPI_MIRROR_URL }}"
extra_args="-i {{ edxapp_pypi_local_mirror }}"
sudo_user: "{{ edxapp_user }}"
tags:
- deploy
environment: "{{ edxapp_environment }}"
when: chkout.changed and not inst.stat.exists or new.stat.md5 != inst.stat.md5
tags: deploy
# Install the python modules into {{ edxapp_venv_dir }}
- name : edxapp | install python base-requirements
# Need to use shell rather than pip so that we can maintain the context of our current working directory; some
# requirements are pathed relative to the edx-platform repo. Using the pip from inside the virtual environment implicitly
# installs everything into that virtual environment.
shell: cd {{ edxapp_code_dir }} && {{ edxapp_venv_dir }}/bin/pip install -i {{ COMMON_PYPI_MIRROR_URL }} --exists-action w --use-mirrors -r {{ base_requirements_file }}
shell: >
{{ edxapp_venv_dir }}/bin/pip install -i {{ edxapp_pypi_local_mirror }} --exists-action w --use-mirrors -r {{ base_requirements_file }}
chdir={{ edxapp_code_dir }}
environment: "{{ edxapp_environment }}"
sudo_user: "{{ edxapp_user }}"
tags:
- deploy
when: chkout.changed and not inst.stat.exists or new.stat.md5 != inst.stat.md5
tags: deploy
# Install the python post requirements into {{ edxapp_venv_dir }}
- name : edxapp | install python post-requirements
......@@ -127,24 +138,25 @@
requirements="{{post_requirements_file}}"
virtualenv="{{edxapp_venv_dir}}"
state=present
extra_args="-i {{ COMMON_PYPI_MIRROR_URL }}"
extra_args="-i {{ edxapp_pypi_local_mirror }}"
sudo_user: "{{ edxapp_user }}"
tags:
- deploy
environment: "{{ edxapp_environment }}"
when: chkout.changed and not inst.stat.exists or new.stat.md5 != inst.stat.md5
tags: deploy
# Install the final python modules into {{ edxapp_venv_dir }}
- name : edxapp | install python post-post requirements
# Need to use shell rather than pip so that we can maintain the context of our current working directory; some
# requirements are pathed relative to the edx-platform repo. Using the pip from inside the virtual environment implicitly
# installs everything into that virtual environment.
shell: cd {{ edxapp_code_dir }} && {{ edxapp_venv_dir }}/bin/pip install -i {{ COMMON_PYPI_MIRROR_URL }} --exists-action w --use-mirrors -r {{ item }}
shell: cd {{ edxapp_code_dir }} && {{ edxapp_venv_dir }}/bin/pip install -i {{ edxapp_pypi_local_mirror }} --exists-action w --use-mirrors -r {{ item }}
with_items:
- "{{ repo_requirements_file }}"
- "{{ github_requirements_file }}"
- "{{ local_requirements_file }}"
sudo_user: "{{ edxapp_user }}"
tags:
- deploy
when: chkout.changed and not inst.stat.exists or new.stat.md5 != inst.stat.md5
tags: deploy
# Install the sandbox python modules into {{ edxapp_venv_dir }}
......@@ -152,15 +164,22 @@
# Need to use shell rather than pip so that we can maintain the context of our current working directory; some
# requirements are pathed relative to the edx-platform repo. Using the pip from inside the virtual environment implicitly
# installs everything into that virtual environment.
shell: cd {{ edxapp_code_dir }} && {{ edxapp_venv_dir }}/bin/pip install -i {{ COMMON_PYPI_MIRROR_URL }} --exists-action w --use-mirrors -r {{ item }}
shell: cd {{ edxapp_code_dir }} && {{ edxapp_venv_dir }}/bin/pip install -i {{ edxapp_pypi_local_mirror }} --exists-action w --use-mirrors -r {{ item }}
with_items:
- "{{ sandbox_base_requirements }}"
- "{{ sandbox_local_requirements }}"
- "{{ sandbox_post_requirements }}"
when: install_sandbox_reqs_into_regular_venv
sudo_user: "{{ edxapp_user }}"
tags:
- deploy
when: chkout.changed and not inst.stat.exists or new.stat.md5 != inst.stat.md5
tags: deploy
- name: edxapp | create checksum for installed requirements
shell: cp /var/tmp/edxapp.req.new /var/tmp/edxapp.req.installed
sudo_user: "{{ edxapp_user }}"
when: chkout.changed
tags: deploy
# https://code.launchpad.net/~wligtenberg/django-openid-auth/mysql_fix/+merge/22726
# This is necessary for when syncdb is run and the django_openid_auth module is installed,
......
......@@ -12,28 +12,20 @@
name="{{ edxapp_user }}" home="{{ edxapp_app_dir }}"
createhome=no shell=/bin/false
- name: edxapp | create edxapp app dir
- name: edxapp | create edxapp user dirs
file: >
path="{{ item }}" state=directory
owner="{{ edxapp_user }}" group="{{ common_web_group }}"
with_items:
- "{{ edxapp_app_dir }}"
- "{{ edxapp_venvs_dir }}"
- "{{ edxapp_theme_dir }}"
- name: edxapp | create edxapp log dir
file: >
path="{{ edxapp_log_dir }}" state=directory
owner="{{ common_log_user }}" group="{{ common_log_user }}"
- name: edxapp | create edxapp writable dirs
file: >
path="{{ item }}" state=directory
owner="{{ edxapp_user }}" group="{{ edxapp_user }}"
with_items:
- "{{ edxapp_staticfile_dir }}"
- "{{ edxapp_theme_dir }}"
- name: edxapp | create web-writable edxapp data dirs
file: >
path="{{ item }}" state=directory
......@@ -53,10 +45,20 @@
mode=0750
with_items: service_variants_enabled
- name: edxapp | setup the edxapp env
template: >
src=edxapp_env.j2 dest={{ edxapp_app_dir }}/edxapp_env
owner={{ edxapp_user }} group={{ common_web_user }}
mode=0644
- include: deploy.yml
- name: edxapp | create a symlink for venv python
file: >
src="{{ edxapp_venv_bin }}/python"
dest={{ COMMON_BIN_DIR }}/python.edxapp
src="{{ edxapp_venv_bin }}/{{ item }}"
dest={{ COMMON_BIN_DIR }}/{{ item }}.edxapp
state=link
with_items:
- python
- pip
......@@ -59,22 +59,22 @@
executable=/bin/bash
chdir={{ edxapp_code_dir }}
sudo_user: "{{ edxapp_user }}"
when: celery_worker is not defined
when: chkout.changed and celery_worker is not defined
with_items: service_variants_enabled
environment: "{{ edxapp_deploy_environment }}"
environment: "{{ edxapp_environment }}"
tags:
- deploy
- name: edxapp | syncdb and migrate
shell: sudo -u {{ edxapp_user }} SERVICE_VARIANT=lms {{ edxapp_venv_bin}}/django-admin.py syncdb --migrate --noinput --settings=lms.envs.aws --pythonpath={{ edxapp_code_dir }}
when: migrate_db is defined and migrate_db|lower == "yes"
when: chkout and migrate_db is defined and migrate_db|lower == "yes"
tags:
- deploy
- name: edxapp | db migrate
shell: sudo -u {{ edxapp_user }} SERVICE_VARIANT=lms {{ edxapp_venv_bin }}/django-admin.py migrate --noinput --settings=lms.envs.aws --pythonpath={{ edxapp_code_dir }}
when: migrate_only is defined and migrate_only|lower == "yes"
when: chkout.changed and migrate_only is defined and migrate_only|lower == "yes"
tags:
- deploy
......
# {{ ansible_managed }}
{% for name,value in edxapp_environment.items() %}
{%- if value %}
export {{ name }}="{{ value }}"
{%- endif %}
{% endfor %}
......@@ -30,5 +30,8 @@
- name: ora | create a symlink for venv python
file: >
src="{{ ora_venv_bin }}/python"
dest={{ COMMON_BIN_DIR }}/python.ora state=link
src="{{ ora_venv_bin }}/{{ item }}"
dest={{ COMMON_BIN_DIR }}/{{ item }}.ora state=link
with_items:
- python
- pip
......@@ -25,3 +25,6 @@ supervisor_ctl: "{{ supervisor_venv_bin }}/supervisorctl"
supervisor_user: supervisor
supervisor_log_dir: "{{ COMMON_LOG_DIR }}/supervisor"
supervisor_cfg: "{{ supervisor_app_dir }}/supervisord.conf"
# upstart service name and user
supervisor_service: supervisor
supervisor_service_user: "{{ common_web_user }}"
- name: supervisor | restart supervisor
service: >
name=supervisor
name={{ supervisor_service }}
state=restarted
- name: supervisor | reload supervisor
......
......@@ -11,22 +11,54 @@
# Tasks for role supervisor
#
# Overview:
# Role for supervisord
# Installs supervisor in its own venv.
# Role for supervisord, a parameterized role for installing supervisord
#
# By default supervisor will be installed into {{ COMMON_APP_DIR }}/supervisor
# and log to {{ COMMON_LOG_DIR }}/supervisor and run as the
# {{ common_web_user }}
#
# The including supervisor with the following parameters
# will install it into a different location:
#
# - supervisor_app_dir
# - supervisor_data_dir
# - supervisor_log_dir
# - supervisor_venv_dir
# - supervisor_service_user
# - supervisor_service
#
# Dependencies:
# - common
#
# Example play:
#
# # Install in the default location,
# # run as the default user
#
# roles:
# - common
# - role: supervisor
#
# # Install in an alternate directory
# # and run as user "foo"
# - role: supervisor
# supervisor_app_dir: /path/to/supervisor/dir/for/configs
# supervisor_data_dir: /path/to/supervisor/data/dir (for pid and sock files)
# supervisor_log_dir: /path/to/supervisor/log/dir
# supervisor_venv_dir: /path/to/supervisor/venv/dir
# supervisor_service_user: user to run supervisor as
# supervisor_service: upstart-service-name
#
---
- name: supervisor | create application user
user: >
name="{{ supervisor_user }}"
home="{{ supervisor_app_dir }}"
createhome=no
shell=/bin/false
- name: supervisor | create supervisor service user
user: >
name="{{ supervisor_service_user }}"
createhome=no
shell=/bin/false
......@@ -35,19 +67,19 @@
name={{ item }}
state=directory
owner={{ supervisor_user }}
group={{ common_web_user }}
group={{ supervisor_service_user }}
with_items:
- "{{ supervisor_app_dir }}"
- "{{ supervisor_venvs_dir }}"
- "{{ supervisor_venv_dir }}"
- "{{ supervisor_cfg_dir }}"
- name: supervisor | create supervisor directories
file: >
name={{ item }}
state=directory
owner={{ common_web_user }}
owner={{ supervisor_service_user }}
group={{ supervisor_user }}
with_items:
- "{{ supervisor_cfg_dir }}"
- "{{ supervisor_data_dir }}"
- "{{ supervisor_log_dir }}"
......@@ -59,14 +91,14 @@
- name: supervisor | create supervisor upstart job
template: >
src=supervisor-upstart.conf.j2 dest=/etc/init/supervisor.conf
src=supervisor-upstart.conf.j2 dest=/etc/init/{{ supervisor_service }}.conf
owner=root group=root
notify: supervisor | restart supervisor
- name: supervisor | create supervisor master config
template: >
src=supervisord.conf.j2 dest={{ supervisor_cfg }}
owner={{ supervisor_user }} group={{ common_web_user }}
owner={{ supervisor_user }} group={{ supervisor_service_user }}
mode=0644
notify: supervisor | restart supervisor
......@@ -75,19 +107,16 @@
src={{ supervisor_ctl }}
dest={{ COMMON_BIN_DIR }}/{{ supervisor_ctl|basename }}
state=link
when: supervisor_service == "supervisor"
notify: supervisor | restart supervisor
- name: supervisor | create a symlink for supervisor cfg
file: >
src={{ supervisor_cfg }}
dest={{ COMMON_CFG_DIR }}/{{ supervisor_cfg|basename }}
src={{ item }}
dest={{ COMMON_CFG_DIR }}/{{ item|basename }}
state=link
- name: supervisor | create a symlink for supervisor cfg dir
file: >
src={{ supervisor_cfg_dir }}
dest={{ COMMON_CFG_DIR }}/supervisor.{{ supervisor_cfg_dir|basename }}
state=link
- name: supervisor | ensure supervisor is started
service: name=supervisor state=started
when: supervisor_service == "supervisor"
with_items:
- "{{ supervisor_cfg }}"
- "{{ supervisor_cfg_dir }}"
notify: supervisor | restart supervisor
[program:devpi-server]
command={{ devpi_venv_dir }}/bin/devpi-server --port {{ devpi_port }} --serverdir {{ devpi_data_dir }}
priority=999
startsecs = 5
redirect_stderr = True
autostart=True
user={{ devpi_user }}
......@@ -4,5 +4,5 @@ start on runlevel [2345]
stop on runlevel [!2345]
respawn
setuid {{ common_web_user }}
setuid {{ supervisor_service_user }}
exec {{ supervisor_venv_dir }}/bin/supervisord --nodaemon --configuration {{ supervisor_cfg }}
......@@ -44,6 +44,9 @@
- name: xqueue | create a symlink for venv python
file: >
src="{{ xqueue_venv_bin }}/python"
dest={{ COMMON_BIN_DIR }}/python.xqueue
src="{{ xqueue_venv_bin }}/{{ item }}"
dest={{ COMMON_BIN_DIR }}/{{ item }}.xqueue
state=link
with_items:
- python
- pip
......@@ -73,7 +73,10 @@
- name: xserver | create a symlink for venv python
file: >
src="{{ xserver_venv_bin }}/python"
dest={{ COMMON_BIN_DIR }}/python.xserver
src="{{ xserver_venv_bin }}/{{ item }}"
dest={{ COMMON_BIN_DIR }}/{{ item }}.xserver
state=link
with_items:
- python
- pip
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment