Migration d'un VPS testing du Canada vers la France

Avec un VPS qui se trouve dans une région éloignées pour d'obscurs raisons il est difficile de communiquer rapidement avec. J'ai donc décidé de rapatrier celui-ci vers un VPS en France.

La création avec le dashboard d'OVH est, bien que simple, une purge par sa lenteur, j'ai l'impression que c'est le cas pour toutes les interfaces dite cloud. Mais jusque là tout va bien, il suffit de sélectionner les options qui nous intéressent: Système d'exploitation Debian 12, clé publique de l'ordinateur que j'utilise actuellement et nous voilà parti... Une fois que j'ai l'IP public de la machine je m'attèle à faire un playbook Ansible pour faire le backup et la migration.

Je commence par un inventory.yml pour y lister les hôtes dont je vais avoir besoin.

testing:
  hosts:
    51.92.13.12:

old:
  hosts:
    91.121.12.13:

J'écris ensuite le fameux playbook dont j'ai besoin que je nomme migration-playbook.yml, j'ai besoin d'effectuer les tâches suivantes:

  • Installer docker
  • Avoir l'utilisateur de base dans le groupe docker
  • Transférer les clefs d'autorisations publiques
  • Transférer le fichier acme pour le SSL
  • Transférer le fichier compose du loadbalancer

J'en suis donc arrivé au fichier qui se trouve en dessous. Ce n'est pas le plus optimal car j'aurais très bien pu faire une simple copie via SSH avec SCP mais de cette manière j'ai des étapes reproductibles facilement, l'installation de docker a d'ailleurs été reprise d'un de mes précédents playbooks.

---
- name: Install Docker
  hosts: testing
  remote_user: debian
  tags: docker

  tasks:
    - name: Update System
      become: true
      ansible.builtin.apt:
        update_cache: true
        only_upgrade: true
    - name: Installing Docker
      ansible.builtin.script: scripts/install-docker.sh
    - name: Docker rights
      ansible.builtin.shell: sudo usermod -aG docker $USER
      register: output
      changed_when: output.rc == 0

- name: Gather authorized keys
  hosts: old
  remote_user: debian
  tags: ssh

  tasks:
    - name: Save authorized_keys
      ansible.builtin.fetch:
        src: ~/.ssh/authorized_keys
        dest: data/authorized_keys
        flat: true


- name: Deploy authorized keys
  hosts: testing
  remote_user: debian
  tags: ssh

  tasks:
    - name: Deploy
      ansible.posix.authorized_key:
        user: debian
        state: present
        key: "{{ lookup('file', './data/authorized_keys') }}"


- name: Backup files
  hosts: old
  remote_user: debian
  tags: backup

  tasks:
    - name: Backup Acme
      become: true
      ansible.builtin.fetch:
        src: /home/debian/acme.json
        dest: ./data/acme.json
        flat: true
    - name: Backup compose
      ansible.builtin.fetch:
        src: /home/debian/loadbalancer.compose.yml
        dest: ./data/
        flat: true


- name: Migrate files
  hosts: testing
  remote_user: debian
  become: true
  tags: migrate

  tasks:
    - name: Migrate acme
      ansible.builtin.copy:
        src: ./data/acme.json
        dest: ~/acme.json
        owner: root
        group: root
        mode: "0600"
    - name: Migrate compose files
      ansible.builtin.copy:
        src: ./data/loadbalancer.compose.yml
        dest: /home/debian/loadbalancer.compose.yml
        mode: "0644"
        owner: debian
        group: debian

Le lancement s'effectue avec la commande suivante: ansible-playbook -i ./inventory.yml ./migration-playbook.yml.

Ce n'est pas sur ça que performe le plus Ansible, la copie de plusieurs fichiers avec fetch n'est pas terrible, c'est plus utile pour installer sur plusieurs machines en même temps les mêmes outils et appliquer les mêmes configurations. Néanmoins, je sais qu'il me suffit d'avoir un nouveau VPS pour le rendre fonctionnel rapidement. Je pourrais améliorer le tout en ajoutant par exemple le réseau traefik directement et démarrer le loadbalancer.