Menjalankan skrip saat boot pertama melalui layanan systemd

Pastikan bahwa Anda telah menyelesaikan langkah-langkah yang diuraikan dalam halaman penyiapan awal sebelum memulai tutorial ini.

Dalam tutorial ini, kita akan menjalankan skrip saat boot pertama melalui layanan systemd. Kita akan menambahkan hal-hal berikut ke konfigurasi Butane dari skenario sebelumnya:

  • Tambahkan skrip di /usr/local/bin/public-ipv4.sh.

  • Konfigurasikan layanan systemd untuk menjalankan skrip tersebut saat boot pertama.

Menulis skrip

Mari kita tulis skrip kecil yang menggunakan icanhazip.com untuk membuat berkas issue yang akan ditampilkan sebagai pesan sebelum login di konsol dan simpan ke public-ipv4.sh.

Ini hanya contoh untuk menunjukkan cara menjalankan layanan saat boot. Jangan gunakan skrip ini jika Anda tidak mempercayai pengelola situs icanhazip.com.
cat <<'EOF' > public-ipv4.sh
#!/bin/bash
echo "Detected Public IPv4: is $(curl https://ipv4.icanhazip.com)" > \
    /etc/issue.d/50_public-ipv4.issue
EOF

Hal ini bisa berguna di lingkungan cloud di mana Anda mungkin memiliki alamat publik dan privat yang berbeda.

Kita akan menyimpan skrip ini ke /usr/local/bin/public-ipv4.sh saat kita melakukan penyediaan mesin.

Menulis layanan systemd

Kita perlu memanggil skrip dari bagian sebelumnya menggunakan unit systemd. Mari kita tulis unit systemd ke dalam berkas issuegen-public-ipv4.service yang menjalankan tugas ini hanya sekali saat boot pertama:

cat <<'EOF' > issuegen-public-ipv4.service
[Unit]
Before=systemd-user-sessions.service
Wants=network-online.target
After=network-online.target
ConditionPathExists=!/var/lib/issuegen-public-ipv4

[Service]
Type=oneshot
ExecStart=/usr/local/bin/public-ipv4.sh
ExecStartPost=/usr/bin/touch /var/lib/issuegen-public-ipv4
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

Menulis konfig Butane dan mengonversi ke Ignition

Sekarang kita dapat membuat konfigurasi Butane yang akan menyertakan skrip dan berkas unit systemd dengan mengambil isi berkas lokal public-ipv4.sh dan issuegen-public-ipv4.service. Konfigurasi Butane akhir, disimpan dalam services.bu, adalah sebagai berikut:

variant: fcos
version: 1.6.0
systemd:
  units:
    - name: serial-getty@ttyS0.service
      dropins:
      - name: autologin-core.conf
        contents: |
          [Service]
          # Override Execstart in main unit
          ExecStart=
          # Add new Execstart with `-` prefix to ignore failure`
          ExecStart=-/usr/sbin/agetty --autologin core --noclear %I $TERM
    - name: issuegen-public-ipv4.service
      enabled: true
      contents_local: issuegen-public-ipv4.service
storage:
  files:
    - path: /etc/hostname
      mode: 0644
      contents:
        inline: |
          tutorial
    - path: /etc/profile.d/systemd-pager.sh
      mode: 0644
      contents:
        inline: |
          # Tell systemd to not use a pager when printing information
          export SYSTEMD_PAGER=cat
    - path: /usr/local/bin/public-ipv4.sh
      mode: 0755
      contents:
        local: public-ipv4.sh
Periksa contoh dan spesifikasi konfigurasi Butane untuk detail lebih lanjut tentang penyertaan berkas lokal.

Dengan berkas public-ipv4.sh, issuegen-public-ipv4.service, dan services.bu berada di direktori kerja saat ini, kita dapat mengonversinya menjadi konfigurasi Ignition dengan menjalankan:

butane --pretty --strict --files-dir=./ services.bu --output services.ign

Pengujian

Seperti sebelumnya, kita akan menggunakan perintah berikut untuk menjalankan instance:

# Atur label SELinux yang benar agar dapat mengakses konfigurasi
chcon --verbose --type svirt_home_t services.ign

# Jalankan mesin virtual Fedora CoreOS
virt-install --name=fcos --vcpus=2 --ram=2048 --os-variant=fedora-coreos-stable \
    --import --network=bridge=virbr0 --graphics=none \
    --qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=${PWD}/services.ign" \
    --disk="size=20,backing_store=${PWD}/fedora-coreos.qcow2"

Dan lihat di konsol bahwa Detected Public IPv4 ditampilkan di output konsol tepat sebelum Anda masuk ke prompt login:

Fedora CoreOS 38.20230709.3.0
Kernel 6.3.11-200.fc38.x86_64 on an x86_64 (ttyS0)

SSH host key: SHA256:tYHKk26+NZ/+ZytWLXClGz813PQJDGP/2+AiuZ8fiqk (ECDSA)
SSH host key: SHA256:jJASZec/91zXd4or0uiFsvsfaLC6viLronfxIwQlNCs (ED25519)
SSH host key: SHA256:2XlSZAehEu666fmXeM8d47lpIJd92MBOqgMazT4GsVw (RSA)
enp1s0: 192.168.124.150 fe80::475a:7a10:2302:b670
Ignition: ran on 2023/08/03 16:40:45 UTC (this boot)
Ignition: user-provided config was applied
No SSH authorized keys provided by Ignition or Afterburn
Detected Public IPv4: is 3.252.102.80
tutorial login: core (automatic login)

Fedora CoreOS 38.20230709.3.0
[core@tutorial ~]$

Dan layanan menunjukkan bahwa ia berhasil dijalankan:

[core@tutorial ~]$ systemctl status --full issuegen-public-ipv4.service
● issuegen-public-ipv4.service
     Loaded: loaded (/etc/systemd/system/issuegen-public-ipv4.service; enabled; preset: enabled)
    Drop-In: /usr/lib/systemd/system/service.d
             └─10-timeout-abort.conf
     Active: active (exited) since Thu 2023-08-03 16:40:55 UTC; 1min 7s ago
    Process: 1423 ExecStart=/usr/local/bin/public-ipv4.sh (code=exited, status=0/SUCCESS)
    Process: 1460 ExecStartPost=/usr/bin/touch /var/lib/issuegen-public-ipv4 (code=exited, status=0/SUCCESS)
   Main PID: 1423 (code=exited, status=0/SUCCESS)
        CPU: 84ms

Aug 03 16:40:55 tutorial systemd[1]: Starting issuegen-public-ipv4.service...
Aug 03 16:40:55 tutorial public-ipv4.sh[1424]:   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Aug 03 16:40:55 tutorial public-ipv4.sh[1424]:                                  Dload  Upload   Total   Spent    Left  Speed
Aug 03 16:40:55 tutorial public-ipv4.sh[1424]: [158B blob data]
Aug 03 16:40:55 tutorial systemd[1]: Finished issuegen-public-ipv4.service.

Pembersihan

Sekarang mari kita hentikan instance untuk pengujian berikutnya. Pertama, putuskan sambungan dari konsol serial dengan menekan CTRL + ], lalu hapus mesin tersebut:

virsh destroy fcos
virsh undefine --remove-all-storage fcos

Anda sekarang dapat melanjutkan ke tutorial berikutnya.