- 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, dansystemddiimpor sebagai kode Python untuk memasang paket, menempatkan template, dan me-reload layanan - Kode contoh memasang paket
nginxdancertbot, lalu menempatkantemplates/nginx.conf.j2ke/etc/nginx/sites-enabled/api - Pada langkah terakhir, layanan
nginxdi-reload dengansystemd.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) - Operasi
-
Inventaris dan hasil eksekusi
- Contoh inventaris menyusun host web dari
web-01.prodhinggaweb-23.prod, serta host databasedb-01.proddandb-02.prod - Perintah
$ pyinfra inventory.py deploy.py --limit webmembatasi eksekusi hanya ke targetweb - 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
- Contoh inventaris menyusun host web dari
-
Pemeriksaan sebelum perubahan
--drymembuat 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.yml16 baris untuk memasangnginx, merender template, dan me-reload layanan berbasis handler - Contoh pyinfra menggunakan
deploy.py8 baris untuk menulis alur yang sama dalam kode Python - Dalam contoh pyinfra,
systemd.service("nginx", reloaded=True)hanya dijalankan ketikacfg.will_changedari hasilfiles.templatebernilai 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) - Contoh Ansible menggunakan
-
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
- Perintah instalasinya adalah
1 komentar
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
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
sedSaya 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
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
python3hanya untuk menjalankan beberapa perintah shellSaya jadi tahu
pyinfraberkat 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 konfirmasiKekurangannya adalah tugas bawaan hanya subset kecil dibanding modul Ansible, kodenya bisa cepat jadi spageti, dan pendekatan seperti
if 'web_server' in hosts.groupsjuga terasa kurang bagus. Mungkinoperation(..., filter_group='web_server')lebih baikBagian terburuknya adalah menulis konektor kustom itu sangat menyiksa. Sepertinya perlu
pyproject.tomldengan entry point khususpyinfra, dan bahkan denganuv, pengembangan konektor internal terasa seperti mimpi buruk. Seharusnya bisa dibuat sebagai file Python biasa di dalam proyekSaya 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
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
—dry, dan itu langsung muncul di layar awal pyinfraBagi 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