Saya tidak pernah menggunakan Ansible tetapi sejak beberapa minggu, saya mencoba mencari tahu apa yang bisa dilakukan Ansible dibandingkan dengan skrip shell - Yang membuktikan, setidaknya dalam kasus saya, bahwa kampanye iklan menghantui yang mereka jalankan efektif! Setelah banyak usaha yang gagal - yang membuktikan bagaimana dokumentasi mereka gagal menjawab salah satu pertanyaan yang paling jelas - saya pikir saya akhirnya mendapatkannya:
Sekarang, mari kita tonton video pendahuluan dan secara acak sebagai pengguna baru yang potensial melalui materi pendahuluan untuk ansible ans, mari kita bandingkan dengan apa yang dapat dihasilkan oleh programmer shell yang ahli.
Kesimpulan saya adalah bahwa lebih dari scripting shell, Ansible pada dasarnya menawarkan 1. Kemungkinan memeriksa bahwa suatu sistem setuju dengan keadaan yang diinginkan, 2. kemampuan untuk berintegrasi dengan Ansible Tower, yang merupakan sistem pembayaran yang tampaknya mencakup kemampuan pemantauan. Dalam beberapa kasus penting, seperti ketika menerapkan pola server yang tidak dapat diubah, poin 1 mungkin tidak terlalu berguna, jadi daftarnya, agak tipis.
Kesimpulan saya adalah bahwa manfaat yang ditawarkan oleh Ansible lebih dari scripting shell, seperti yang disajikan oleh dokumentasi, dapat masuk akal dalam beberapa kasus optimis yang tercakup dengan baik oleh modul yang tersedia tetapi kecil atau bahkan hipotetis dalam kasus umum. Bagi seorang programmer shell yang terampil, manfaat ini kemungkinan besar diimbangi oleh aspek trade-off lainnya.
Tapi ini mungkin hanya membuktikan betapa buruknya materi pengantar!
Video mulai cepat:
Ada video mulai cepat . Ini dimulai dengan halaman yang mengklaim bahwa ... yah ini bukan benar-benar klaim, ini adalah daftar peluru, artefak yang biasa digunakan untuk menunda penilaian kritis dalam presentasi (karena logika tidak ditampilkan, tidak dapat dikritik!)
1. Ansible sederhana:
1.1 Otomatisasi yang dapat dibaca manusia - Spesifikasi adalah dokumen teknis, bagaimana mungkin
name: upgrade all packages
yum:
name: '*'
state: latest
lebih mudah dibaca daripada doa yum terkait yang ditemukan dalam skrip shell? Selain itu, siapa pun yang memiliki kontak dengan AppleScript mati tertawa ketika mereka membaca "otomatisasi yang dapat dibaca manusia".
1.2 Tidak diperlukan keahlian pengkodean khusus - Apa itu pengkodean jika tidak menulis spesifikasi formal? Mereka memiliki kondisional, variabel, jadi, bagaimana itu bukan pengkodean? Dan mengapa saya membutuhkan sesuatu yang tidak dapat saya programkan, yang selanjutnya akan menjadi tidak fleksibel? Pernyataan itu sangat tidak akurat!
1.3 Tugas dieksekusi secara berurutan - Ya, mungkin beberapa penggemar codegolf mengetahui bahasa yang mengeksekusi tugas-tugas dalam kekacauan, tetapi menjalankan tugas-tugas dalam urutan hampir tidak terlihat luar biasa.
1.4 Dapatkan produktif dengan cepat - Pemrogram shell yang terampil sekarang produktif. Argumen tandingan ini sama seriusnya dengan argumen awal.
2. Ansible sangat kuat
Trik penjual yang populer untuk menjual artefak adalah membodohi orang agar percaya bahwa mereka akan mendapatkan "kekuatan" artefak ini. Sejarah iklan untuk mobil atau minuman isotonik harus menyediakan daftar contoh yang meyakinkan.
Di sini Ansible dapat melakukan "penyebaran aplikasi" - tetapi skrip shell tentu saja melakukannya, "manajemen konfigurasi" tetapi ini hanyalah pernyataan tujuan dari alat tersebut, bukan fitur, dan "alur kerja orkestrasi" yang terlihat agak megah tetapi tidak ada contoh yang berlaku melampaui apa yang bisa dilakukan GNU Parallel .
3. Ansible tidak agen
Untuk mengisi kolom, mereka menulis dalam tiga cara yang berbeda bahwa ini hanya perlu ssh, yang, karena semua orang tahu adalah daemon dan tidak ada hubungannya dengan agen - agen ini yang meliputi manajemen konfigurasi dunia!
Sisa video
Sisa video memperkenalkan inventaris, yang merupakan daftar sumber daya statis (seperti server) dan menunjukkan cara menggunakan Apache di tiga server secara bersamaan. Ini benar-benar tidak sesuai dengan cara saya bekerja, di mana sumber daya sangat dinamis dan dapat dihitung dengan tool-line perintah yang disediakan oleh penyedia cloud saya, dan dikonsumsi oleh fungsi shell saya menggunakan |
operator pipa . Juga, saya tidak menggunakan Apache pada tiga server secara bersamaan, melainkan, saya membangun gambar contoh master yang kemudian saya gunakan untuk memulai 3 contoh yang merupakan replika yang tepat dari yang lain. Jadi bagian “mengatur” argumentasi tidak terlihat sangat relevan.
Dokumentasi acak langkah 1: Integrasi dengan EC2
EC2 adalah layanan komputasi dari Amazon, berinteraksi dengannya didukung oleh beberapa modul Ansible . (Penyedia komputasi awan populer lainnya juga disediakan):
# demo_setup.yml
- hosts: localhost
connection: local
gather_facts: False
tasks:
- name: Provision a set of instances
ec2:
key_name: my_key
group: test
instance_type: t2.micro
image: "{{ ami_id }}"
wait: true
exact_count: 5
count_tag:
Name: Demo
instance_tags:
Name: Demo
register: ec2
Shell-script yang sesuai pada dasarnya akan identik dengan YAML digantikan oleh JSON:
provision_a_set_of_instances()
{
aws --output=text ec2 run-instances --image-id …
}
atau versi JSON
provision_a_set_of_instances()
{
aws --output=text ec2 run-instances --cli-input-json "$(provision_a_set_of_instances__json)"
}
provision_a_set_of_instances__json()
{
cat <<EOF
{
"ImageId": …
}
EOF
}
Kedua versi pada dasarnya identik, sebagian besar payload adalah enumerasi nilai inisialisasi dalam struktur YAML atau JSON.
Dokumentasi acak langkah 2: Pengiriman Berkelanjutan dan Peningkatan Kemampuan
Bagian terbesar dari panduan ini tidak menampilkan fitur yang benar-benar menarik: ia memperkenalkan variabel (IIRC, skrip shell juga memiliki variabel) !, dan modul Ansible menangani mysql, sehingga jika alih-alih mencari setelah "bagaimana cara membuat pengguna mysql dengan hak istimewa di XY ”dan diakhiri dengan sesuatu seperti
# Create Application DB User
mysql --host "${mysql_host}" --user "${mysql_user}" --password "${mysql_password}" "${mysql_table}" <<EOF
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
EOF
Anda mencari setelah "bagaimana cara membuat pengguna mysql dengan hak istimewa di XY tidak mungkin " dan berakhir dengan
- name: Create Application DB User
mysql_user: name={{ dbuser }} password={{ upassword }}
priv=*.*:ALL host='%' state=present
Perbedaannya mungkin masih tidak terlalu berarti. Pada halaman itu kami juga menemukan bahwa Ansible memiliki bahasa pemrograman-meta templat
{% for host in groups['monitoring'] %}
-A INPUT -p tcp -s {{ hostvars[host].ansible_default_ipv4.address }} --dport 5666 -j ACCEPT
{% endfor %}
Ketika saya melihat ini, saya benar-benar berada di zona nyaman saya. Jenis meta-pemrograman sederhana untuk bahasa-bahasa deklaratif ini persis dengan paradigma teoretis yang sama dengan Makefiles BSD! Yang kebetulan telah saya programkan secara luas. Kutipan ini menunjukkan kepada kita bahwa janji untuk bekerja dengan file YAML rusak (jadi saya tidak bisa menjalankan buku pedoman saya melalui parser YAML, misalnya ). Ini juga menunjukkan kepada kita bahwa Ansible harus membahas seni halus dari urutan evaluasi: kita harus memutuskan apakah variabel diperluas pada "bagian deklaratif" bahasa atau pada meta-bagian "imperatif" bahasa. Di sini pemrograman shell lebih sederhana, tidak ada meta-pemrograman, selain dari sumber skrip eksplisit eval
atau eksternal. Kutipan shell ekuivalen hipotetis akan menjadi
enumerate_group 'monitoring' | {
while read host; do
…
done
}
yang kompleksitasnya dibandingkan dengan varian Ansible mungkin dapat ditoleransi: itu hanya menggunakan konstruksi sederhana, teratur, membosankan dari bahasa.
Dokumentasi acak langkah 3: Strategi pengujian
Terakhir, kami bertemu dengan apa yang ternyata menjadi fitur menarik pertama dari Ansible: “Sumber daya yang memungkinkan adalah model dari keadaan yang diinginkan. Dengan demikian, tidak perlu menguji apakah layanan dimulai, paket diinstal, atau hal-hal lain semacam itu. Ansible adalah sistem yang akan memastikan hal-hal ini benar secara deklaratif. Alih-alih, tegaskan hal-hal ini di buku pedoman Anda. ”Sekarang mulai sedikit menarik, tetapi:
Selain beberapa situasi standar yang mudah diimplementasikan oleh modul yang tersedia, saya harus memberi makan bit mengimplementasikan tes sendiri, yang kemungkinan besar akan melibatkan beberapa perintah shell.
Memeriksa kesesuaian instalasi mungkin tidak terlalu relevan dalam konteks di mana pola server yang tidak dapat diimplementasikan: di mana semua sistem yang berjalan biasanya muncul dari gambar master (misalnya gambar atau gambar buruh pelabuhan misalnya) dan tidak pernah diperbarui - mereka diganti oleh baru sebagai gantinya.
Kekhawatiran yang belum terselesaikan: pemeliharaan
Materi pengantar dari Ansible mengabaikan pertanyaan tentang rawatan. Dengan dasarnya tidak ada sistem tipe, skrip shell memiliki kemudahan pemeliharaan JavaScript, Lisp atau Python: refactoring luas hanya dapat dicapai dengan sukses dengan bantuan testuite otomatis yang luas - atau setidaknya desain yang memungkinkan pengujian interaktif mudah. Yang mengatakan, sementara skrip shell adalah lingua franca dari konfigurasi dan pemeliharaan sistem, hampir setiap bahasa pemrograman memiliki antarmuka ke shell. Oleh karena itu benar-benar layak untuk memanfaatkan keunggulan rawat-kesehatan dari bahasa-bahasa maju, dengan menggunakannya untuk merekatkan bersama berbagai bit dari bit konfigurasi shell. Untuk OCaml, saya menulis Rashell yang pada dasarnya menyediakan pola interaksi umum untuk subproses, yang membuat terjemahan skrip konfigurasi ke OCaml pada dasarnya sepele.
Di sisi dari Ansible, struktur buku pedoman yang sangat lemah dan keberadaan fitur meta-pemrograman membuat situasi pada dasarnya seburuk itu untuk skrip shell, dengan poin minus yang tidak jelas bagaimana menulis unit test untuk Ansible , dan argumen untuk memperkenalkan ad-hoc bahasa tingkat yang lebih tinggi tidak dapat ditiru.
Idempotensi langkah konfigurasi
Dokumentasi Ansible menarik perhatian pada perlunya menulis langkah konfigurasi idempoten. Lebih tepatnya, langkah-langkah konfigurasi harus ditulis sehingga urutan langkah aba dapat disederhanakan menjadi ab , yaitu kita tidak perlu mengulangi langkah konfigurasi. Ini adalah kondisi yang lebih kuat daripada idempotensi. Karena Ansible memungkinkan playbook untuk menggunakan perintah shell sewenang-wenang, Ansible sendiri tidak dapat menjamin bahwa kondisi yang lebih kuat ini dihormati. Ini hanya bergantung pada disiplin programmer.