1 poin oleh GN⁺ 4 jam lalu | 1 komentar | Bagikan ke WhatsApp
  • Tulis tugas otomatisasi server sebagai kode Python dan jalankan secara paralel lewat SSH, sehingga perintah dijalankan secara idempoten tanpa agen
  • pyinfra menonjolkan klaim 6x lebih cepat daripada Ansible pada workload yang sama, dengan eksekusi konkuren berbasis gevent dan SSH
  • Dengan opsi --dry, Anda dapat memeriksa diff perubahan per host sebelum diterapkan, dan saat eksekusi nyata hasilnya dikembalikan sebagai streaming paralel
  • Host target hanya memerlukan shell dan SSH, tanpa daemon, file status, atau control plane
  • Menekankan konfigurasi yang berpusat pada kode dengan menggunakan loop dan conditional Python apa adanya, tanpa mengenkode alur kontrol ke dalam YAML

Fitur inti dan alur eksekusi

  • Otomatisasi ribuan server

    • pyinfra adalah alat otomatisasi agentless yang native Python dan mengeksekusi perintah lewat SSH
    • Eksekusi perintah menekankan konkurensi, idempoten, dan kecepatan, serta mengklaim 6x lebih cepat daripada Ansible pada workload yang sama
    • Perintah instalasinya adalah $ uv tool install pyinfra
    • Persyaratan dasar yang ditampilkan adalah lisensi MIT, Python 3.10 atau lebih baru, tanpa agen, dan zero config
  • Contoh kode deployment

    • Operasi apt, files, dan systemd diimpor sebagai kode Python untuk memasang paket, menempatkan template, dan me-reload layanan
    • Kode contoh memasang paket nginx dan certbot, lalu menempatkan templates/nginx.conf.j2 ke /etc/nginx/sites-enabled/api
    • Pada langkah terakhir, layanan nginx di-reload dengan systemd.service("nginx", reloaded=True)
    from pyinfra.operations import apt, files, systemd
    
    apt.packages(
        packages=["nginx", "certbot"],
        update=True,
    )
    
    files.template(
        src="templates/nginx.conf.j2",
        dest="/etc/nginx/sites-enabled/api",
    )
    
    systemd.service("nginx", reloaded=True)
    
  • Inventaris dan hasil eksekusi

    • Contoh inventaris menyusun host web dari web-01.prod hingga web-23.prod, serta host database db-01.prod dan db-02.prod
    • Perintah $ pyinfra inventory.py deploy.py --limit web membatasi eksekusi hanya ke target web
    • Output eksekusi berjalan dalam urutan pemuatan inventaris, pengumpulan fact secara konkuren, eksekusi deploy.py, lalu ringkasan
    • Ringkasan contoh mencatat 23 host berhasil, 18 berubah, 0 gagal, dengan total 2,1 detik
  • Pemeriksaan sebelum perubahan

    • --dry membuat pyinfra terlebih dahulu menampilkan diff per host dari semua tindakan yang akan dijalankan
    • Pada eksekusi nyata, hasil di-streaming secara paralel sehingga jumlah perubahan dan waktu eksekusi tiap host ditampilkan
    • Contoh eksekusi mencatat dari 24 host, 18 berubah, 6 tidak berubah, 0 gagal, dengan total 2,1 detik

Karakteristik, perbandingan dengan Ansible, dan prinsip

  • Enam alasan memilih pyinfra

    • Just Python: menulis alur kontrol yang sesungguhnya dalam Python, tanpa YAML dan Jinja-di-dalam-YAML
    • Concurrent SSH: menjalankan secara konkuren berbasis gevent dan SSH, dan mengklaim 6x lebih cepat daripada Ansible pada workload yang sama
    • Diff before apply: dengan --dry, semua perubahan dapat dilihat lebih dulu, dan operasi idempoten akan menjadi no-op saat dijalankan ulang
    • 0 agents: host hanya memerlukan shell dan SSH, tanpa daemon, file status, atau control plane
    • Scale-ready: berjalan dari 1 host hingga 10.000 host, serta mendukung eksekusi paralel dan output streaming real-time
    • Hackable: operasi kustom bisa dibuat dalam 10 baris, dan dapat terhubung ke docker, lxc, k8s yang berkomunikasi lewat shell
  • Perbandingan kode Ansible dan pyinfra

    • Contoh Ansible menggunakan playbook.yml 16 baris untuk memasang nginx, merender template, dan me-reload layanan berbasis handler
    • Contoh pyinfra menggunakan deploy.py 8 baris untuk menulis alur yang sama dalam kode Python
    • Dalam contoh pyinfra, systemd.service("nginx", reloaded=True) hanya dijalankan ketika cfg.will_change dari hasil files.template bernilai true
    from pyinfra.operations import apt, files, systemd
    
    apt.packages(["nginx"], update=True)
    
    cfg = files.template(
        src="nginx.conf.j2",
        dest="/etc/nginx/sites-enabled/api",
    )
    if cfg.will_change:
        systemd.service("nginx", reloaded=True)
    
  • Pernyataan prinsip

    • Code > config: loop tetap loop, dan alur kontrol tidak dienkode ke dalam YAML
    • Show, then do: lihat diff terlebih dahulu, lalu terapkan untuk menghindari perubahan tak terduga
    • Stay out of the way: jalankan langsung lewat SSH tanpa agen, file status, atau control plane
    • Read like english: operasi terbaca seperti bentuk nomina dan verba, misalnya apt.packages, files.template, systemd.service
  • Perintah memulai

    • Perintah instalasinya adalah $ uv tool install pyinfra
    • Disediakan panduan untuk membaca quickstart 5 menit dan men-deploy host pertama

1 komentar

 
GN⁺ 4 jam lalu
Komentar di Lobste.rs
  • pyinfra terasa seperti versi Ansible yang seharusnya dari awal. Alih-alih menumpuk alur kontrol di atas YAML bercampur templat, otomasi bisa ditulis langsung dalam Python
    Setelah lama memakai Ansible, ini terasa segar, dan bukannya saya memang benci Ansible sejak awal

    • Lebih tepatnya, ini tampak bukan Ansible dalam Python, melainkan lebih seperti interpreter yang mengubah Python menjadi shell, dan itu punya masalah tersendiri
      Mungkin pendekatan hibrida yang juga memakai Python di server target akan lebih baik. Saat memperbarui file, itu mengurangi neraka tanda kutip dan juga menghindari batasan regex di sed
  • Saya suka pyinfra dan berharap ini dipakai lebih luas
    Semua perusahaan tempat saya bekerja sejauh ini memakai Ansible, terlepas dari apakah mereka juga memakai Terraform, dan tidak ada yang siap menulis ulang seluruh otomasi yang ada dengan alat yang belum dikenal karyawan
    pyinfra mengharuskan SysOps tahu Python, dan menurut saya pribadi, SysOps setidaknya memang seharusnya menguasai satu bahasa skrip. Terutama karena bahkan di Ansible pun, menulis modul dalam Python bisa mengurangi kekacauan YAML, tetapi setidaknya di Prancis, tampaknya itu bukan pandangan yang umum

    • Saya sudah cukup banyak memakai Ansible, dan pada dasarnya saya menganggapnya bahasa skrip yang menyamar
      Mungkin ini bukan bahan perdebatan yang terlalu panas juga
  • Saya memakai Ansible di homelab lalu makin lama makin frustrasi. Konfigurasi YAML mengerikan, semuanya terasa seperti hack, dan kecepatannya menyedihkan. Saya juga tidak bisa menerima bahwa server perlu python3 hanya untuk menjalankan beberapa perintah shell
    Saya jadi tahu pyinfra berkat Google AI Mode, dan dalam hampir sebulan pemakaian, rasanya jauh lebih menyegarkan. Kelebihannya adalah jauh lebih cepat daripada Ansible, pengulangan dan kondisi bisa ditulis dalam Python, tidak perlu role dan direktori bersarang, dan server cukup punya shell. Sebelum eksekusi, ia membuat rencana berdasarkan status saat ini dan kalau tidak diberi -y, ia juga meminta konfirmasi
    Kekurangannya adalah tugas bawaan hanya subset kecil dibanding modul Ansible, kodenya bisa cepat jadi spageti, dan pendekatan seperti if 'web_server' in hosts.groups juga terasa kurang bagus. Mungkin operation(..., filter_group='web_server') lebih baik
    Bagian terburuknya adalah menulis konektor kustom itu sangat menyiksa. Sepertinya perlu pyproject.toml dengan entry point khusus pyinfra, dan bahkan dengan uv, pengembangan konektor internal terasa seperti mimpi buruk. Seharusnya bisa dibuat sebagai file Python biasa di dalam proyek

  • Saya sedang mencoba pyinfra selama beberapa hari sebagai alat deployment homelab, dan dibanding Ansible, hal yang paling saya suka sejauh ini bukan sintaks Python melainkan kecepatannya
    Ansible selalu terasa lambat sampai sulit ditoleransi

    • Area ini menarik. Saya juga sedang membuat alat deployment dan memakainya untuk deployment sungguhan di pekerjaan utama saya
      Saya ingin menggantikan penggunaan Ansible dan Salt di banyak tempat
  • Menarik melihat infrastruktur sebagai kode berputar satu siklus penuh. Dari skrip ke YAML lalu kembali lagi ke skrip yang lebih canggih
    Setiap pendekatan punya titik yang pas, dan dari sudut pandang pengguna Ansible, pyinfra tampak cukup bagus

  • Alasan utama kami mengadopsi Ansible adalah mode dry-run dan melihat perbedaan. Karena itu kami bisa yakin tidak akan melakukan tindakan yang tidak terduga
    Tapi CLI pyinfra tampaknya tidak punya opsi seperti itu. Mungkin saya melewatkannya karena saya tidak bisa menemukan dokumen referensi yang merangkum semua opsi secara alfabetis

    • Ada flag —dry, dan itu langsung muncul di layar awal pyinfra
  • Bagi yang tertarik, saya juga punya proyek serupa berusia 14 tahun: https://github.com/sebastien/cuisine/tree/main
    Ini tanpa agen, hanya memakai SSH, dan menyediakan API bergaya Python di atas fungsi manajemen inti, tetapi tidak mendukung mode dry

  • Kami memakai Ansible untuk provisioning resource di OpenStack, lalu menangani sisanya dengan pyinfra, dan ini bekerja cukup baik selama beberapa tahun terakhir
    Kekurangan terbesarnya adalah komunitasnya kecil, jadi kami harus menulis solusi sendiri. Misalnya, secret bersama yang dibutuhkan untuk deployment kami simpan ke disk dengan keyring + privy, dan kami juga menulis beberapa baris kode sendiri untuk mengubah inventaris komputasi OpenStack menjadi data hosts