]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-cm-ansible.git/commitdiff
paddles: Enable containerized deployment
authorZack Cerza <zack@redhat.com>
Thu, 23 Sep 2021 22:41:54 +0000 (16:41 -0600)
committerZack Cerza <zack@redhat.com>
Wed, 13 Oct 2021 23:49:31 +0000 (17:49 -0600)
Signed-off-by: Zack Cerza <zack@redhat.com>
roles/paddles/defaults/main.yml
roles/paddles/tasks/apt_systems.yml
roles/paddles/tasks/main.yml
roles/paddles/tasks/setup_db.yml
roles/paddles/tasks/setup_docker.yml [new file with mode: 0644]
roles/paddles/tasks/zypper_systems.yml
roles/paddles/templates/nginx.conf
roles/paddles/vars/apt_systems.yml

index 2769873e1137b9e9095b638407c7d8b7889536f0..85c3fc5745ba7fe371b1e4580a53f0aa2fb3aa3a 100644 (file)
@@ -1,9 +1,17 @@
 ---
 paddles_user: paddles
+paddles_db_user: paddles
+paddles_port: 8080
+paddles_statsd_host: ""
+paddles_statsd_prefix: ""
+paddles_sentry_dsn: ""
+
+paddles_containerized: false
+paddles_container_image: quay.io/ceph-infra/paddles:latest
+paddles_container_replicas: 10
 
 paddles_repo: https://github.com/ceph/paddles.git
 paddles_branch: master
 
-paddles_port: 8080
 
 log_host: localhost
index 4f3337deefe60821ec6dba8aa8d01a958d6f6d71..a7974c1cedec33801b3aa2c04a5860d0c8c7484b 100644 (file)
     cache_valid_time: 600
   tags:
     - packages
+
+- name: Install docker packages
+  apt:
+    name: "{{ paddles_docker_packages|list }}"
+    state: latest
+    update_cache: yes
+    cache_valid_time: 600
+  when: paddles_containerized
+  tags:
+    - packages
index 64e959f754c204e6a2d56f9c8af62316a93ec0b7..26189518ed8ad05914e8b66d7ba423f1427a3192 100644 (file)
   tags:
     - always
 
+- name: Set db_host
+  set_fact:
+    db_host: "{% if paddles_containerized %}{{ inventory_hostname }}{% else %}localhost{% endif %}"
+  tags:
+    - always
+
 - name: Set db_url
   set_fact:
-    db_url: "postgresql+psycopg2://{{ paddles_user }}:{{ db_pass }}@localhost/paddles"
+    db_url: "postgresql+psycopg2://{{ paddles_db_user }}:{{ db_pass }}@{{ db_host }}/paddles"
   no_log: true
   tags:
     - always
 
 # Set up the actual paddles project
 - import_tasks: setup_paddles.yml
+  when: not paddles_containerized
 
 # Set up the DB which paddles uses
 - import_tasks: setup_db.yml
+  tags:
+    - db
+
+# Set up docker if necessary
+- import_tasks: setup_docker.yml
+  when: paddles_containerized
+  tags:
+    - service
 
 # Configure the system to run paddles as a daemon
 - import_tasks: setup_service.yml
+  when: not paddles_containerized
+  tags:
+    - service
 
 # Configure nginx as a reverse proxy
 - import_tasks: nginx.yml
-  when: not ansible_distribution is search("openSUSE")
+  when:
+    - not ansible_distribution is search("openSUSE")
index 0380f2e44c16ed9edcf0459ba9ee3ba3ce334c63..d37d28037362e37be1a19c35693de3f11db3d028 100644 (file)
@@ -8,7 +8,7 @@
 - name: Set up access to the database
   postgresql_user:
     db: paddles
-    name: "{{ paddles_user }}"
+    name: "{{ paddles_db_user }}"
     password: "{{ db_pass }}"
   become_user: postgres
   when: create_db is changed
@@ -18,7 +18,9 @@
   args:
     chdir: "{{ paddles_repo_path }}"
   become_user: "{{ paddles_user }}"
-  when: create_db is changed
+  when:
+    - create_db is changed
+    - not paddles_containerized
 
 - name: Copy alembic config template to alembic.ini
   command: cp ./alembic.ini.in alembic.ini
     chdir: "{{ paddles_repo_path }}"
   register: alembic_ini
   become_user: "{{ paddles_user }}"
+  when: not paddles_containerized
 
 - name: Update alembic.ini
   lineinfile:
     dest: "{{ paddles_repo_path }}/alembic.ini"
     line: "sqlalchemy.url = {{ db_url }}"
     regexp: "^sqlalchemy.url = "
+  when: not paddles_containerized
 
 - name: Set the alembic revision
   shell: ./virtualenv/bin/alembic stamp head
   args:
     chdir: "{{ paddles_repo_path }}"
-  when: alembic_ini is changed
+  when:
+    - alembic_ini is changed
+    - not paddles_containerized
   become_user: "{{ paddles_user }}"
diff --git a/roles/paddles/tasks/setup_docker.yml b/roles/paddles/tasks/setup_docker.yml
new file mode 100644 (file)
index 0000000..a1cc50c
--- /dev/null
@@ -0,0 +1,72 @@
+---
+- name: Add paddles_user to the docker group
+  user:
+    name: "{{ paddles_user }}"
+    append: yes
+    groups:
+      - docker
+
+- name: Install docker's python module
+  become_user: "{{ paddles_user }}"
+  pip:
+    name: docker
+    state: latest
+    executable: pip3
+    extra_args: --user
+
+- name: Init docker swarm
+  become_user: "{{ paddles_user }}"
+  docker_swarm:
+    state: present
+
+- name: Create secret for the database URL
+  become_user: "{{ paddles_user }}"
+  docker_secret:
+    name: paddles_sqlalchemy_url
+    data: "{{ db_url }}"
+
+- name: Pull the paddles container image
+  become_user: "{{ paddles_user }}"
+  docker_image:
+    name: "{{ paddles_container_image }}"
+    source: pull
+  register: image_pull
+
+- name: Create docker swarm service
+  become_user: "{{ paddles_user }}"
+  docker_swarm_service:
+    name: paddles
+    state: present
+    replicas: "{{ paddles_container_replicas }}"
+    update_config:
+      parallelism: 1
+      delay: 10s
+      monitor: 10s
+      failure_action: rollback
+    rollback_config:
+      order: start-first
+    image: "{{ paddles_container_image }}"
+    resolve_image: true
+    force_update: "{{ image_pull.changed }}"
+    publish:
+      - published_port: "{{ paddles_port }}"
+        target_port: 8080
+    logging:
+      driver: journald
+      options:
+        tag: paddles
+    env:
+      - "PADDLES_ADDRESS={{ paddles_address }}"
+      - "PADDLES_SERVER_HOST=0.0.0.0"
+      - "SENTRY_DSN={{ paddles_sentry_dsn }}"
+      - "PADDLES_STATSD_HOST={{ paddles_statsd_host }}"
+      - "PADDLES_STATSD_PREFIX={{ paddles_statsd_prefix }}"
+      - "GUNICORN_CMD_ARGS=--workers=2 --max-requests=10000"
+    secrets:
+      - secret_name: paddles_sqlalchemy_url
+        filename: "/run/secrets/paddles_sqlalchemy_url"
+    healthcheck:
+      test: ["CMD", "curl", "--fail", "http://localhost:8080"]
+      interval: 1m
+      timeout: 5s
+      start_period: 10s
index a0be05930f650f3d50a490012a6d132adb07c36d..6f4a3eeacb83655aa507f0d8a6193717e6f5253f 100644 (file)
@@ -1,4 +1,9 @@
 ---
+- name: Fail on zypper systems if paddles_containerized is set
+  fail:
+    msg: "'paddles_containerized' is not yet supported on zypper systems"
+  when: paddles_containerized
+
 - name: Include package type specific vars.
   include_vars: "zypper_systems.yml"
   tags:
index d2e68bbfca31cd12210d6369a25b6f094294f1f2..1576f52d6e7154bd3a00a8ab7f2698d707ec03f2 100644 (file)
@@ -1,6 +1,6 @@
 server {
         server_name {{ inventory_hostname }};
-        listen {{ ansible_all_ipv4_addresses[0] }}:{{ paddles_port }};
+        listen 80;
         proxy_send_timeout 600;
         proxy_connect_timeout 240;
         location / {
index 9df77dd7a9ccb048354ee485357230b74276c92e..a28fe7408a7655c6fe73c48af2339651a23441d5 100644 (file)
@@ -16,6 +16,12 @@ paddles_extra_packages:
   - nginx
   - liblz4-tool
 
+paddles_docker_packages:
+  - docker.io
+  # docker swarm needs the requests module
+  - python-requests
+  - python-docker
+
 # We need this so we can disable apache2 to get out of the way of nginx
 apache_service: 'apache2'