From: Zack Cerza Date: Wed, 30 Sep 2015 22:38:49 +0000 (-0600) Subject: paddles: Add new paddles role X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=06cf08ddb74dd276790153a0bf7c10e2c5767a2d;p=ceph-cm-ansible.git paddles: Add new paddles role Signed-off-by: Zack Cerza --- diff --git a/cephlab.yml b/cephlab.yml index 5ade9ed..5b6f055 100644 --- a/cephlab.yml +++ b/cephlab.yml @@ -13,5 +13,8 @@ # if this node is in the cobbler group, configure it - include: cobbler.yml +# if this node is in the paddles group, configure it +- include: paddles.yml + # if this node is in the pulpito group, configure it - include: pulpito.yml diff --git a/paddles.yml b/paddles.yml new file mode 100644 index 0000000..17e91ea --- /dev/null +++ b/paddles.yml @@ -0,0 +1,5 @@ +--- +- hosts: paddles + roles: + - common + - paddles diff --git a/roles/paddles/README.rst b/roles/paddles/README.rst new file mode 100644 index 0000000..bba6403 --- /dev/null +++ b/roles/paddles/README.rst @@ -0,0 +1,9 @@ +Paddles +========== +This role is used to configure a node to run paddles_. + +It has been tested on: + +- Ubuntu 14.04 (Trusty) + +.. _paddles: https://github.com/ceph/paddles diff --git a/roles/paddles/defaults/main.yml b/roles/paddles/defaults/main.yml new file mode 100644 index 0000000..db99d13 --- /dev/null +++ b/roles/paddles/defaults/main.yml @@ -0,0 +1,10 @@ +--- +paddles_user: paddles + +paddles_repo: https://github.com/ceph/paddles.git + +# Default is to listen on all interfaces +listen_ip: "0.0.0.0" +paddles_port: 8080 + +log_host: localhost diff --git a/roles/paddles/meta/main.yml b/roles/paddles/meta/main.yml new file mode 100644 index 0000000..1e71b66 --- /dev/null +++ b/roles/paddles/meta/main.yml @@ -0,0 +1,5 @@ +--- +dependencies: + - role: secrets + - role: sudo + - role: users diff --git a/roles/paddles/tasks/apt_systems.yml b/roles/paddles/tasks/apt_systems.yml new file mode 100644 index 0000000..19e0f06 --- /dev/null +++ b/roles/paddles/tasks/apt_systems.yml @@ -0,0 +1,15 @@ +--- +- name: Include package type specific vars. + include_vars: "apt_systems.yml" + tags: + - always + +- name: Install packages via apt + apt: + name: "{{ item }}" + state: latest + update_cache: yes + cache_valid_time: 600 + with_items: "{{ paddles_extra_packages }}" + tags: + - packages diff --git a/roles/paddles/tasks/main.yml b/roles/paddles/tasks/main.yml new file mode 100644 index 0000000..c5be705 --- /dev/null +++ b/roles/paddles/tasks/main.yml @@ -0,0 +1,37 @@ +--- +- name: Include cobbler keys. + include_vars: "{{ secrets_path | mandatory }}/paddles.yml" + no_log: true + +- name: Set repo location + set_fact: + paddles_repo_path: "/home/{{ paddles_user }}/paddles" + +- name: Set paddles_address + set_fact: + paddles_address: http://{{ ansible_hostname }}/ + when: not paddles_address.startswith('http') + +- name: Set db_url + set_fact: + db_url: "postgresql+psycopg2://{{ paddles_user }}:{{ db_pass }}@localhost/paddles" + no_log: true + +- include: apt_systems.yml + when: ansible_pkg_mgr == "apt" + +# Yum systems support is not implemented yet. +- include: yum_systems.yml + when: ansible_pkg_mgr == "yum" + +# Set up the paddles user +- include: setup_user.yml + +# Set up the actual paddles project +- include: setup_paddles.yml + +# Set up the DB which paddles uses +- include: setup_db.yml + +# Configure the system to run paddles as a daemon +- include: setup_service.yml diff --git a/roles/paddles/tasks/setup_db.yml b/roles/paddles/tasks/setup_db.yml new file mode 100644 index 0000000..37b31fe --- /dev/null +++ b/roles/paddles/tasks/setup_db.yml @@ -0,0 +1,42 @@ +--- +- name: Create the postgresql database + postgresql_db: + name: paddles + sudo_user: postgres + register: create_db + +- name: Set up access to the database + postgresql_user: + db: paddles + name: "{{ paddles_user }}" + password: "{{ db_pass }}" + sudo_user: postgres + when: create_db|changed + +- name: Run pecan populate + command: ./virtualenv/bin/pecan populate prod.py + args: + chdir: "{{ paddles_repo_path }}" + sudo_user: "{{ paddles_user }}" + when: create_db|changed + +- name: Copy alembic config template to alembic.ini + command: cp ./alembic.ini.in alembic.ini + args: + creates: alembic.ini + chdir: "{{ paddles_repo_path }}" + register: alembic_ini + sudo_user: "{{ paddles_user }}" + +- name: Update alembic.ini + lineinfile: + dest: "{{ paddles_repo_path }}/alembic.ini" + line: "sqlalchemy.url = {{ db_url }}" + regexp: "^sqlalchemy.url = " + +- name: Set the alembic revision + shell: ./virtualenv/bin/alembic stamp head + args: + chdir: "{{ paddles_repo_path }}" + when: alembic_ini|changed + sudo_user: "{{ paddles_user }}" diff --git a/roles/paddles/tasks/setup_paddles.yml b/roles/paddles/tasks/setup_paddles.yml new file mode 100644 index 0000000..6b4bfa9 --- /dev/null +++ b/roles/paddles/tasks/setup_paddles.yml @@ -0,0 +1,30 @@ +--- +- name: Checkout the repo + git: + repo: "{{ paddles_repo }}" + dest: "{{ paddles_repo_path }}" + sudo_user: "{{ paddles_user }}" + tags: + - repos + +- name: Install requirements via pip + pip: + chdir: "{{ paddles_repo_path }}" + requirements: "./requirements.txt" + virtualenv: "{{ paddles_repo_path }}/virtualenv" + sudo_user: "{{ paddles_user }}" + +- name: Run setup inside virtualenv + command: "./virtualenv/bin/python setup.py develop" + args: + chdir: "{{ paddles_repo_path }}" + changed_when: false + sudo_user: "{{ paddles_user }}" + +- name: Ship prod.py + template: + src: prod.py + dest: "{{ paddles_repo_path }}/prod.py" + owner: "{{ paddles_user }}" + group: "{{ paddles_user }}" + mode: 0755 diff --git a/roles/paddles/tasks/setup_service.yml b/roles/paddles/tasks/setup_service.yml new file mode 100644 index 0000000..5d10c59 --- /dev/null +++ b/roles/paddles/tasks/setup_service.yml @@ -0,0 +1,20 @@ +--- +- name: Ship supervisor config + template: + src: supervisor.conf + dest: "{{ supervisor_conf_d }}/paddles.{{ supervisor_conf_suffix }}" + mode: 0755 + register: supervisor_conf + +- name: Read supervisord config + command: supervisorctl update + when: supervisor_conf|changed + +- name: Ensure paddles is running + supervisorctl: + name: paddles + state: started + +- name: Wait for paddles to start + wait_for: + port: "{{ paddles_port }}" diff --git a/roles/paddles/tasks/setup_user.yml b/roles/paddles/tasks/setup_user.yml new file mode 100644 index 0000000..58811fd --- /dev/null +++ b/roles/paddles/tasks/setup_user.yml @@ -0,0 +1,8 @@ +--- +- name: Create user + user: + name: "{{ paddles_user }}" + state: present + shell: /bin/bash + tags: + - user diff --git a/roles/paddles/tasks/yum_systems.yml b/roles/paddles/tasks/yum_systems.yml new file mode 100644 index 0000000..3d78686 --- /dev/null +++ b/roles/paddles/tasks/yum_systems.yml @@ -0,0 +1,4 @@ +--- +- name: Fail on yum systems as support is not implemented + fail: + msg: "yum systems are not supported at this time" diff --git a/roles/paddles/templates/prod.py b/roles/paddles/templates/prod.py new file mode 100644 index 0000000..98ed567 --- /dev/null +++ b/roles/paddles/templates/prod.py @@ -0,0 +1,63 @@ +# {{ ansible_managed }} +from paddles.hooks import IsolatedTransactionHook +from paddles import models +from paddles.hooks.cors import CorsHook + +server = { + 'port': '{{ paddles_port }}', + 'host': '{{ listen_ip }}' +} + +address = '{{ paddles_address }}' +job_log_href_templ = 'http://{{ log_host }}/teuthology/{run_name}/{job_id}/teuthology.log' # noqa +default_latest_runs_count = 25 + +sqlalchemy = { + 'url': '{{ db_url }}', + 'echo': True, + 'echo_pool': True, + 'pool_recycle': 3600, + 'encoding': 'utf-8' +} + +app = { + 'root': 'paddles.controllers.root.RootController', + 'modules': ['paddles'], + 'template_path': '%(confdir)s/paddles/templates', + 'default_renderer': 'json', + 'debug': False, + 'hooks': [ + IsolatedTransactionHook( + models.start, + models.start_read_only, + models.commit, + models.rollback, + models.clear + ), + CorsHook(), + ], +} + +logging = { + 'disable_existing_loggers': False, + 'loggers': { + 'root': {'level': 'INFO', 'handlers': ['console']}, + 'paddles': {'level': 'DEBUG', 'handlers': ['console']}, + 'sqlalchemy': {'level': 'WARN'}, + 'py.warnings': {'handlers': ['console']}, + '__force_dict__': True + }, + 'handlers': { + 'console': { + 'level': 'DEBUG', + 'class': 'logging.StreamHandler', + 'formatter': 'simple' + } + }, + 'formatters': { + 'simple': { + 'format': ('%(asctime)s %(levelname)-5.5s [%(name)s]' + ' %(message)s') + } + } +} diff --git a/roles/paddles/templates/supervisor.conf b/roles/paddles/templates/supervisor.conf new file mode 100644 index 0000000..a1fb596 --- /dev/null +++ b/roles/paddles/templates/supervisor.conf @@ -0,0 +1,11 @@ +# {{ ansible_managed }} +[program:paddles] +user={{ paddles_user }} +environment=HOME="/home/{{ paddles_user }}",USER="{{ paddles_user }}" +directory=/home/{{ paddles_user }}/paddles +command=/home/{{ paddles_user }}/paddles/virtualenv/bin/gunicorn_pecan -c gunicorn_config.py prod.py +autostart=true +autorestart=true +redirect_stderr=true +stdout_logfile = /home/{{ paddles_user }}/paddles.out.log +stderr_logfile = /home/{{ paddles_user }}/paddles.err.log diff --git a/roles/paddles/vars/apt_systems.yml b/roles/paddles/vars/apt_systems.yml new file mode 100644 index 0000000..c5a7fd4 --- /dev/null +++ b/roles/paddles/vars/apt_systems.yml @@ -0,0 +1,16 @@ +--- +paddles_extra_packages: + # The following is a requirement of ansible's postgresql module + - python-psycopg2 + # The following packages are requirements for running paddles + - git-all + - python-dev + - python-pip + - python-virtualenv + - postgresql + - postgresql-contrib + - postgresql-server-dev-all + - supervisor + +supervisor_conf_d: /etc/supervisor/conf.d +supervisor_conf_suffix: conf diff --git a/roles/paddles/vars/yum_systems.yml b/roles/paddles/vars/yum_systems.yml new file mode 100644 index 0000000..ed97d53 --- /dev/null +++ b/roles/paddles/vars/yum_systems.yml @@ -0,0 +1 @@ +---