Deploiement de HackInScience avec ansible (par Julien Palard)

Pour ma part je déploie tout systématiquement avec Ansible.

Mais que ce soit Ansible, Salt, Puppet, Chef, un Makefile, un shell script, ou n’importe quoi d’autre, peu importe en fait, ce qui compte pour moi c’est le côté reproductible : ton serveur brûle ?

Pas de soucis, tu relances le playbook, tu recharges une sauvegarde, et c’est reparti.

J’ai par exemple HackInScience qui est déployé comme ça https://framagit.org/hackinscience/hkis-ansible/-/blob/main/roles/website/tasks/main.yml

  1---
  2
  3- name: Install dependencies
  4  apt:
  5    state: present
  6    name:
  7      - build-essential
  8      - gettext
  9      - cron
 10      - git
 11      - nginx
 12      - postgresql
 13      - postgresql-server-dev-all  # To compile Python client.
 14      - pgbadger
 15      - python3
 16      - python3-pip
 17      - python3-psycopg2
 18      - python3-venv
 19      - sudo
 20    update_cache: true
 21  tags: website
 22
 23- name: Add unix user website
 24  user:
 25    name: website
 26    shell: /bin/false
 27    system: yes
 28    home: /opt/hkis-website
 29  tags: website
 30
 31- name: install hkis-daphne.service (systemd)
 32  copy:
 33    src: systemd/hkis-daphne.service
 34    dest: /etc/systemd/system/hkis-daphne.service
 35    owner: root
 36    group: root
 37    mode: 0644
 38  notify: restart daphne
 39  tags: website
 40
 41- name: add user website to pgsql
 42  become: true
 43  become_user: postgres
 44  postgresql_user:
 45    user: website
 46  tags: website
 47
 48- name: add database hkis
 49  become: true
 50  become_user: postgres
 51  postgresql_db:
 52    name: hkis
 53    owner: website
 54  tags: website
 55
 56- name: Configure psql
 57  notify: reload psql
 58  copy:
 59    dest: /etc/postgresql/13/main/conf.d/hkis.conf
 60    owner: postgres
 61    group: postgres
 62    mode: 0644
 63    content: |
 64      log_min_duration_statement = 0
 65      log_checkpoints = on
 66      log_connections = on
 67      log_disconnections = on
 68      log_lock_waits = on
 69      log_temp_files = 0
 70      log_autovacuum_min_duration = 0
 71      log_error_verbosity = default
 72      lc_messages='en_US.UTF-8'
 73      lc_messages='C'
 74
 75- name: git website repo
 76  git:
 77    repo: https://framagit.org/hackinscience/hkis-website.git
 78    dest: /opt/hkis-website/src
 79    force: true
 80  tags: website
 81  notify: restart website
 82
 83- name: read git HEAD ref
 84  command: git -C /opt/hkis-website/src rev-parse HEAD
 85  register: git_head
 86  tags: website
 87
 88- name: Creates a /opt/hkis-website/venv for virtual environments
 89  file:
 90    path: /opt/hkis-website/venv
 91    state: directory
 92    mode: 0755
 93  tags: website
 94
 95- name: Creates a /opt/hkis-website/locale for translations
 96  file:
 97    path: /opt/hkis-website/locale
 98    state: directory
 99    mode: 0755
100  tags: website
101
102- name: pip installs requirements
103  pip:
104    chdir: /opt/hkis-website/src
105    requirements: requirements.txt
106    virtualenv: /opt/hkis-website/venv
107    virtualenv_command: /usr/bin/python3 -m venv
108  tags: website
109
110- name: pip installs sentry
111  pip:
112    chdir: /opt/hkis-website/src
113    name: sentry-sdk>=0.19.5
114    virtualenv: /opt/hkis-website/venv
115    virtualenv_command: /usr/bin/python3 -m venv
116  tags: website
117
118- name: pip installs psycopg2
119  pip:
120    chdir: /opt/hkis-website/src
121    name: psycopg2
122    virtualenv: /opt/hkis-website/venv
123    virtualenv_command: /usr/bin/python3 -m venv
124  tags: website
125
126- name: Install website configuration
127  template:
128    src: local_settings.py.j2
129    dest: /opt/hkis-website/src/hackinscience_org/local_settings.py
130    owner: root
131    group: website
132    mode: 0640
133  notify: restart website
134  tags: website
135
136- name: Migrate db
137  command: "/opt/hkis-website/venv/bin/python manage.py migrate"
138  args:
139    chdir: "/opt/hkis-website/src"
140  register: migrate_result
141  changed_when: '"  Applying " in migrate_result.stdout'
142  run_once: true
143  become: true
144  become_user: website
145  tags: [website, test]
146
147- name: Collectstatic
148  command: "/opt/hkis-website/venv/bin/python manage.py collectstatic --noinput"
149  args:
150    chdir: "/opt/hkis-website/src"
151  register: collectstatic_result
152  changed_when: '"Copying " in collectstatic_result.stdout'
153  tags: [website, test]
154
155- name: Compile gettext
156  command: "/opt/hkis-website/venv/bin/python manage.py compilemessages"
157  args:
158    chdir: "/opt/hkis-website/src"
159  notify: restart website
160  tags: [website, test]
161
162- name: Ensure website is running
163  service: name=hkis-daphne state=started enabled=yes
164  tags: website
165
166- name: Configure nginx host
167  template:
168    src: nginx-vhost
169    dest: "/etc/nginx/sites-available/{{ website_vhost }}"
170    owner: root
171    group: root
172    mode: 0644
173  notify: reload nginx
174  tags: website
175
176- name: Create symlink for API nginx site
177  file:
178    src: "/etc/nginx/sites-available/{{ website_vhost }}"
179    dest: "/etc/nginx/sites-enabled/{{ website_vhost }}"
180    state: link
181  notify: reload nginx
182  tags: website
183
184- name: Daily backup
185  cron:
186    user: website
187    name: "backup"
188    job: "/usr/bin/pg_dump --clean hkis > backup.sql"
189    hour: '2'
190    minute: '0'

Ça s’occupe des statiques, de l’i18n, du certificat HTTPS, de la configuration de nginx…

Libre à toi de cp -r, tout relire, élaguer ce qui ne t’es pas utile, renommer ce qui le doit, n’hésite pas à me poser des questions, te faire relire (je ne suis pas le seul ici à lire de l’Ansible, d’ailleurs je ne suis pas du tout le meilleur ici, je me contente de peu avec Ansible).

Attention ne cherche pas de gunicorn ou de uwsgi dans ma config hkis, j’utilise daphne car j’ai des websockets (et donc vite de l’asyncio), donc ça passe par asgi.py et pas wsgi.py.

Mais ça marche pareil sinon, ça sait très bien délivrer des vues synchrones aussi.

Je te déconseille de déployer automatiquement via de la CI/CI, du moins pas maintenant : KISS.

Pour héberger ça il te faut un serveur et un nom de domaine, dis-nous si tu as aussi besoin de guidage sur le sujet.