Desplegueu la vostra base de codi PHP amb Ansible i GitHub Actions

Aquest tutorial us mostrarà com podeu automatitzar el desplegament de la vostra base de codi PHP amb l’ajuda de GitHub Actions i Ansible.

Hi ha molts enfocaments diferents quan es tracta de desplegar la vostra aplicació PHP als vostres servidors de producció. Actualment, la majoria de projectes utilitzen git i viuen en una plataforma com GitHub, GitLab o Bitbucket. Però, com implementeu els vostres canvis al vostre servidor? Podeu utilitzar SSH manualment al vostre servidor després de cada canvi i treure el codi més recent de GitHub, podeu utilitzar els webhooks de GitHub per fer-ho automàticament o podeu utilitzar un programari extern per gestionar i fer totes les implementacions per vosaltres. Tanmateix, avui m’agradaria mostrar-vos com podeu automatitzar les vostres implementacions amb una eina anomenada Ansible i GitHub Actions. Ansible és un potent programari d’automatització de codi obert escrit en Python que simplifica el procés de configuració i gestió de màquines remotes de manera automatitzada.

En general, Ansible funciona així: heu de crear un Inventari Ansible que conté la informació dels vostres servidors i heu de configurar una manera perquè Ansible iniciï sessió en aquests servidors. L’ideal és que creeu un usuari nou al vostre servidor només per a Ansible que iniciï sessió amb una clau SSH per a més seguretat. Tota la resta es configura amb fitxers YAML.
Podeu fer moltes coses amb Ansible: configurar els vostres servidors (web), mantenir-los actualitzats, instal·lar programari, augmentar o reduir automàticament i molt més; tanmateix, aquesta guia només se centrarà en com implementeu automàticament la darrera versió del vostre codi amb Ansible. Prepararem els nostres servidors i configurarem una acció de GitHub que executarà automàticament Ansible i desplegarà el nostre codi al nostre servidor en cada empenta al nostre production branca.

Preparatius

Perquè Ansible es pugui connectar i treballar al vostre servidor, heu de fer dues coses: instal·lar algun programari necessari (Python i Git) i crear un usuari administrador independent al vostre servidor per a Ansible. Per fer-ho, connecteu-vos al vostre servidor mitjançant SSH i executeu les ordres següents:

1# 1. Install Python and Git

2sudo apt install python3 git

3

4# 2. Create a superuser named "ansible"

5sudo useradd -m -G sudo ansible

6sudo passwd ansible

Ara que tens un ansible usuari del vostre servidor, també hauríeu de crear un parell de claus SSH perquè l’utilitzi en lloc d’una contrasenya, de manera que es pugui connectar de manera més segura. Assegureu-vos d’habilitar aquesta clau SSH per al nou creat ansible usuari, no per defecte root usuari al servidor:

Si teniu diversos servidors, repetiu aquest pas per a cadascun d’ells (idealment, utilitzeu la mateixa clau pública SSH per als usuaris d’Ansible a tots els servidors).

Configura l’inventari

L’anomenada Inventari Ansible conté tota la informació sobre els vostres servidors i qualsevol variable addicional possible. Podeu posar el contingut en un fitxer o bé posar-lo en un “Secret del repositori” de GitHub i obtenir el contingut més tard a la vostra acció de GitHub. Recomanaria anar amb la segona opció, perquè part del contingut de l’inventari (per exemple, les adreces IP dels servidors) es pot considerar confidencial i no hauria d’aparèixer al vostre control de versions de git (especialment quan el vostre servidor està darrere d’un Tallafoc Cloudflare o alguna cosa semblant).

L’estructura de l’inventari es divideix en grups de servidors i és bastant senzilla:

1---

2all:

3 vars:

4 # here you can put any global variables you might need in Ansible playbooks

5

6webserver: # the name of our first server group, you can rename this group or add more groups as you like

7 hosts:

8 254.254.254.254: # replace this with the IP address of your server. If you have multiple servers, just add them in the following lines

Crea el llibre de jugades

Per dir-li a Ansible què ha de fer quan es desplega el nostre codi, hem de crear un anomenada Ansible Playbook. És un fitxer YAML amb instruccions per a Ansible separades en diferents tasques (passos).
Us recomanaria que creeu un nou directori per al vostre Ansible Playbook al vostre dipòsit de codi PHP.
També podeu crear un repositori nou només per als vostres Ansible Playbooks i configurar-lo perquè les empenta a la vostra branca principal des del vostre dipòsit de codi PHP desencadenin l’execució de l’acció de GitHub al vostre repositori Ansible; això és fantàstic si voleu mantenir aquestes coses més. separats, però és una mica més complicat de configurar. És per això que us recomanaria que seguiu la ruta fàcil de moment i només creeu un directori al vostre repositori principal.

Assegureu-vos de configurar el vostre servidor web per prohibir l’accés públic a la vostra carpeta Ansible.

En aquest directori, creeu un fitxer YAML nou; l’anomenarem deploy-playbook.yml. En aquest llibre de jocs, diem a Ansible que faci les coses següents:

  1. Cloneu el nostre dipòsit de codi PHP en una carpeta temporal del servidor
  2. Opcional: Feu qualsevol pas addicional que puguem haver de fer durant el desplegament (p. ex. instal·lar paquets de compositor)
  3. Copieu el codi a la destinació correcta (en la majoria dels casos el DocumentRoot del vostre servidor web)
  4. Actualitzeu els permisos dels fitxers (perquè siguin accessibles pel servidor web)

Afegirem per a cadascun d’aquests passos una tasca al llibre de jugades:

1---

2- hosts: webserver

3 become: yes

4 become_user: root

5 vars:

6 temp_repo_path: "/tmp_repo" # path to the temporary downloadfolder of the repo

7 tasks:

8

9 # Get the latest code from your GitHub code repository

10 - name: Get latest Application Codebase

11 git:

12 repo: https://github.com/AnTheMaker/Pesto.git # place the HTTPS git URL of your codebase here

13 version: main # replace this with the name of your "production" branch (in most cases "main" or "master")

14 dest: "{{ temp_repo_path }}"

15 single_branch: yes

16 accept_hostkey: true

17 depth: 1

18

19 # if your git repository is private, you'll need to create a GitHub deploy key (https://docs.github.com/en/developers/overview/managing-deploy-keys#deploy-keys), upload the private key to your server and uncomment the following line:

20 # key_file: ~/github_deploy_private_key.key

21

22 register: code_upload # set a variable in Ansible if this task succeeds

23

24# do any additional tasks you may need to do. E.g. install composer packages: (uncomment/change as you like)

25# - name: Install Composer Packages

26# composer:

27# command: "install"

28# working_dir: "{{ temp_repo_path }}"

29# environment:

30# COMPOSER_NO_INTERACTION: "1"

31# when: code_upload.changed # only run this task when the code has changed

32

33 - name: Replace live Codebase

34 delegate_to: "{{ inventory_hostname }}"

35 synchronize:

36 src: "{{ temp_repo_path }}"

37 dest: /var/www/

38 recursive: yes

39 delete: yes

40 when: code_upload.changed # only run this task when the code has changed

41

42 - name: Update Permissions

43 file:

44 path: /var/www/html

45 state: directory

46 recurse: yes

47

48 # change the following two lines to the user of your webserver

49 owner: www-data

50 group: www-data

Configura les accions de GitHub

Ara que tenim un Ansible Playbook amb instruccions sobre com implementar el nostre codi i l’inventari que conté les IP del nostre servidor, només hem de configurar les accions de GitHub per executar automàticament Ansible sempre que premem al nostre production branca (o com l’hagueu anomenat al vostre repositori).

Afortunadament, ja existeix una gran acció de GitHub feta prèviament per fer-ho, anomenada Run Ansible Playbook; només hem de configurar-la perquè funcioni amb la nostra configuració.

Per fer-ho, hem de crear un fitxer YAML d’acció de GitHub al vostre dipòsit sota el camí següent: .github/workflows/main.yml

1name: Deploy

2on:

3 # Triggers this Action on push or pull request events on the "main" branch and when manually requested from the "Actions" tab

4 push:

5 branches: [ main ]

6 workflow_dispatch:

7

8jobs:

9 deploy_code:

10 runs-on: ubuntu-latest

11 steps:

12 - name: Run Ansible playbook

13 uses: dawidd6/action-ansible-playbook@v2.5.0

14 with:

15 playbook: ansible/deploy-playbook.yml # path to your Ansible playbook

16 directory: ./

17 key: ${{ secrets.ansible_ssh_private_key }} # the ssh private key for ansible to use to connect to the servers, stored as "ansible_ssh_private_key" in the GitHub secrets

18 inventory: ${{ secrets.ansible_inventory }} # the ansible inventory to use, stored as "ansible_inventory" in the GitHub secrets

Desar aquest fitxer de flux de treball i enviar-lo a GitHub hauria d’habilitar automàticament aquesta acció. A partir d’ara, sempre que feu clic a la producció (o sol·liciteu manualment una implementació des de la pestanya “Accions” dels vostres dipòsits), aquesta acció s’hauria d’executar que executarà Ansible, es connectarà al vostre servidor i desplegarà el vostre codi nou. Quan l’acció s’està executant, podeu fer clic a la pestanya “Accions” i veure l’acció en curs (juntament amb un registre en directe complet de l’execució d’Ansible amb els possibles errors o advertències).

Recursos addicionals

Leave a Comment

Your email address will not be published. Required fields are marked *