Strávil som nejaký čas pokusmi o prekonvertovanie curl | bash mágie z oficiálnej dokumentácie Caddy na ansible playbook. Teda, pravdepodobne som len prepísaním do ansible neznížil žiadne riziká ako nedostatok transparentnosti, man-in-the-middle útoky, škodlivé payloady alebo chýbajúce overenie pravosti spojené s postupom curl-pipe-bash.

Stále používame repozitár tretej strany, aj keď dôveryhodný. Povedzme, že to robíme „ansible štýlom” len pre cvičenie. V čase písania vyzerá oficiálna inštalácia Caddy na Ubuntu 22.04 (aktuálny LTS) takto:

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

Keďže s ansible nie som v tomto bode príliš zdatný a predtým som sa sústredil na automatizáciu Archu namiesto Ubuntu a ponáral som sa hlboko do králičej nory menom rootless docker, aj takáto zdanlivo triviálna úloha mi zabrala nejaký čas.

Pridanie kľúča repozitára #

Druhý riadok, ktorý slúži na pridanie kľúča repozitára, sa preloží do nasledujúcej ansible úlohy:

- name: Add Cloudsmith repository
  apt_key:
    url: "https://dl.cloudsmith.io/public/caddy/stable/gpg.key"
    state: present

Po spustení tejto úlohy môžeme skontrolovať výsledok na cieľovom stroji pomocou zastaraného nástroja apt-key list:

/etc/apt/trusted.gpg
--------------------
pub   rsa4096 2016-04-01 [SC]
      6576 0C51 EDEA 2017 CEA2  CA15 155B 6D79 CA56 EA34
uid           [ unknown] Caddy Web Server <[email protected]>
sub   rsa4096 2020-12-29 [S] [expires: 2025-12-28]

Rozdiel oproti pôvodnému skriptu je v tom, že jednoducho nešpecifikujeme umiestnenie súboru ako /usr/share/keyrings/caddy-stable-archive-keyring.gpg. Práve tento názov súboru je potom odkazovaný v zdrojoch:

curl https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt

Čo vypíše nasledovné:

# Source: Caddy
# Site: https://github.com/caddyserver/caddy
# Repository: Caddy / stable
# Description: Fast, multi-platform web server with automatic HTTPS

deb [signed-by=/usr/share/keyrings/caddy-stable-archive-keyring.gpg] https://dl.cloudsmith.io/public/caddy/stable/deb/debian any-version main

deb-src [signed-by=/usr/share/keyrings/caddy-stable-archive-keyring.gpg] https://dl.cloudsmith.io/public/caddy/stable/deb/debian any-version main

Všimni si atribút signed-by, ktorý odkazuje na daný súbor s kľúčom. Ešte treba trochu pogoogliť, aby som pochopil dôsledky úplného vynechania umiestnenia súboru. Pozrime sa ešte raz na tretí riadok skriptu:

curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list

Ten explicitne hovorí, že súbor by mal mať názov caddy-stable.list. Našťastie môžeme názov súboru zadať pomocou vhodne pomenovaného parametra filename. Poznámka: prípona .list sa doplní automaticky.

Zoznamy zdrojov #

S čerstvo nadobudnutými znalosťami môžeme skonštruovať nasledujúce dve úlohy:

- name: Add Caddy repository to sources list
  apt_repository:
    repo:
      "deb https://dl.cloudsmith.io/public/caddy/stable/deb/debian
      any-version main"
    state: present
    filename: caddy-stable

- name: Add Caddy src repository to sources list
  apt_repository:
    repo:
      "deb-src https://dl.cloudsmith.io/public/caddy/stable/deb/debian
      any-version main"
    state: present
    filename: caddy-stable

Skúsil som tieto dve úlohy spojiť do jednej s nádejou, že repo prijme pole, no zdá sa, že akceptuje iba reťazec. Každopádne, môžeme to spätne overiť na hostiteľskom stroji:

cat /etc/apt/sources.list.d/caddy-stable.list

Čo teraz celkom zjavne vypíše nasledovné:

deb https://dl.cloudsmith.io/public/caddy/stable/deb/debian any-version main
deb-src https://dl.cloudsmith.io/public/caddy/stable/deb/debian any-version main

Výsledný playbook teda vyzerá takto:

---
- name: Install Caddy web server
  hosts: my_hosts
  become: true
  become_user: root

  tasks:
    - name: Install required packages
      apt:
        update_cache: yes
        name:
          - debian-keyring
          - debian-archive-keyring
          - apt-transport-https
        state: present

    - name: Add Cloudsmith repository
      apt_key:
        url: "https://dl.cloudsmith.io/public/caddy/stable/gpg.key"
        state: present

    - name: Add Caddy repository to sources list
      apt_repository:
        repo:
          "deb https://dl.cloudsmith.io/public/caddy/stable/deb/debian
          any-version main"
        state: present
        filename: caddy-stable

    - name: Add Caddy src repository to sources list
      apt_repository:
        repo:
          "deb-src https://dl.cloudsmith.io/public/caddy/stable/deb/debian
          any-version main"
        state: present
        filename: caddy-stable

    - name: Install Caddy
      apt:
        update_cache: yes
        name: caddy
        state: present

    - name: Enable and start Caddy service
      service:
        name: caddy
        enabled: yes
        state: started

Enjoy!

Odkazy #