Manajemen konfigurasi: topologi berbasis push versus pull

22

Sistem manajemen konfigurasi (CM) yang lebih mapan seperti Puppet dan Chef menggunakan pendekatan berbasis tarikan: klien melakukan jajak pendapat master terpusat secara berkala untuk pembaruan. Beberapa dari mereka menawarkan pendekatan tanpa master juga (jadi, berbasis push), tetapi menyatakan bahwa itu 'tidak untuk produksi' (Saltstack) atau 'kurang scalable' (Wayang). Satu-satunya sistem yang saya tahu yang berbasis push dari awal adalah runner-up Ansible.

Apa keuntungan skalabilitas spesifik dari sistem berbasis tarikan? Mengapa lebih mudah menambahkan lebih banyak master tarik daripada agen push?

Misalnya, agiletesting.blogspot.nl menulis:

dalam sistem 'tarik', klien menghubungi server secara independen satu sama lain, sehingga sistem secara keseluruhan lebih terukur daripada sistem 'dorong'

Di sisi lain, Rackspace menunjukkan bahwa mereka dapat menangani sistem 15K dengan model berbasis push.

infastructures.org menulis:

Kami bersumpah dengan metodologi tarikan untuk memelihara infrastruktur, menggunakan alat seperti SUP, CVSup, server rsync, atau cfengine. Daripada mendorong perubahan ke klien, setiap mesin klien individu harus bertanggung jawab untuk polling server emas saat boot, dan secara berkala setelahnya, untuk mempertahankan level revnya sendiri. Sebelum mengadopsi sudut pandang ini, kami mengembangkan skrip berbasis push yang luas berdasarkan ssh, rsh, rcp, dan rdist. Masalah yang kami temukan dengan r-command (atau ssh) adalah ini: Ketika Anda menjalankan skrip berbasis r-command untuk mendorong perubahan ke mesin target Anda, kemungkinannya adalah jika Anda memiliki lebih dari 30 host target, salah satunya akan turun pada waktu tertentu. Mempertahankan daftar mesin yang ditugaskan menjadi mimpi buruk. Dalam proses penulisan kode untuk memperbaiki hal ini, Anda akan berakhir dengan kode pembungkus yang rumit untuk menangani: timeout dari host yang mati; logging dan mencoba lagi host yang mati; forking dan menjalankan pekerjaan paralel untuk mencoba memukul banyak host dalam jumlah waktu yang wajar; dan akhirnya mendeteksi dan mencegah kasus menggunakan semua soket TCP yang tersedia pada mesin sumber dengan semua sesi rsh keluar. Maka Anda masih memiliki masalah untuk mendapatkan apa pun yang baru saja Anda lakukan ke dalam gambar instalasi untuk semua host baru yang akan diinstal di masa depan, serta mengulanginya untuk host yang mati dan harus dibangun kembali besok. Setelah masalah yang kami alami untuk menerapkan replikasi berbasis r-command, kami menemukan itu tidak layak. Kami tidak berencana mengelola infrastruktur dengan r-command lagi, atau dengan mekanisme push lainnya. Mereka tidak skala serta metode berbasis tarik. forking dan menjalankan pekerjaan paralel untuk mencoba memukul banyak host dalam jumlah waktu yang wajar; dan akhirnya mendeteksi dan mencegah kasus menggunakan semua soket TCP yang tersedia pada mesin sumber dengan semua sesi rsh keluar. Maka Anda masih memiliki masalah untuk mendapatkan apa pun yang baru saja Anda lakukan ke dalam gambar instalasi untuk semua host baru yang akan diinstal di masa depan, serta mengulanginya untuk host yang mati dan harus dibangun kembali besok. Setelah masalah yang kami alami untuk menerapkan replikasi berbasis r-command, kami menemukan itu tidak layak. Kami tidak berencana mengelola infrastruktur dengan r-command lagi, atau dengan mekanisme push lainnya. Mereka tidak skala serta metode berbasis tarik. forking dan menjalankan pekerjaan paralel untuk mencoba memukul banyak host dalam jumlah waktu yang wajar; dan akhirnya mendeteksi dan mencegah kasus menggunakan semua soket TCP yang tersedia pada mesin sumber dengan semua sesi rsh keluar. Maka Anda masih memiliki masalah untuk mendapatkan apa pun yang baru saja Anda lakukan ke dalam gambar instalasi untuk semua host baru yang akan diinstal di masa depan, serta mengulanginya untuk host yang mati dan harus dibangun kembali besok. Setelah masalah yang kami alami untuk menerapkan replikasi berbasis r-command, kami menemukan itu tidak layak. Kami tidak berencana mengelola infrastruktur dengan r-command lagi, atau dengan mekanisme push lainnya. Mereka tidak skala serta metode berbasis tarik. dan akhirnya mendeteksi dan mencegah kasus menggunakan semua soket TCP yang tersedia pada mesin sumber dengan semua sesi rsh keluar. Maka Anda masih memiliki masalah untuk mendapatkan apa pun yang baru saja Anda lakukan ke dalam gambar instalasi untuk semua host baru yang akan diinstal di masa depan, serta mengulanginya untuk host yang mati dan harus dibangun kembali besok. Setelah masalah yang kami alami untuk menerapkan replikasi berbasis r-command, kami menemukan itu tidak layak. Kami tidak berencana mengelola infrastruktur dengan r-command lagi, atau dengan mekanisme push lainnya. Mereka tidak skala serta metode berbasis tarik. dan akhirnya mendeteksi dan mencegah kasus menggunakan semua soket TCP yang tersedia pada mesin sumber dengan semua sesi rsh keluar. Maka Anda masih memiliki masalah untuk mendapatkan apa pun yang baru saja Anda lakukan ke dalam gambar instalasi untuk semua host baru yang akan diinstal di masa depan, serta mengulanginya untuk host yang mati dan harus dibangun kembali besok. Setelah masalah yang kami alami untuk menerapkan replikasi berbasis r-command, kami menemukan itu tidak layak. Kami tidak berencana mengelola infrastruktur dengan r-command lagi, atau dengan mekanisme push lainnya. Mereka tidak skala serta metode berbasis tarik. Maka Anda masih memiliki masalah untuk mendapatkan apa pun yang baru saja Anda lakukan ke dalam gambar instalasi untuk semua host baru yang akan diinstal di masa depan, serta mengulanginya untuk host yang mati dan harus dibangun kembali besok. Setelah masalah yang kami alami untuk menerapkan replikasi berbasis r-command, kami menemukan itu tidak layak. Kami tidak berencana mengelola infrastruktur dengan r-command lagi, atau dengan mekanisme push lainnya. Mereka tidak skala serta metode berbasis tarik. Maka Anda masih memiliki masalah untuk mendapatkan apa pun yang baru saja Anda lakukan ke dalam gambar instalasi untuk semua host baru yang akan diinstal di masa depan, serta mengulanginya untuk host yang mati dan harus dibangun kembali besok. Setelah masalah yang kami alami untuk menerapkan replikasi berbasis r-command, kami menemukan itu tidak layak. Kami tidak berencana mengelola infrastruktur dengan r-command lagi, atau dengan mekanisme push lainnya. Mereka tidak skala serta metode berbasis tarik. atau dengan mekanisme dorong lainnya dalam hal ini. Mereka tidak skala serta metode berbasis tarik. atau dengan mekanisme dorong lainnya dalam hal ini. Mereka tidak skala serta metode berbasis tarik.

Bukankah itu masalah implementasi, bukan masalah arsitektur? Mengapa lebih sulit untuk menulis push client yang berulir daripada server tarik berulir?

Willem
sumber
4
Hanya sebuah catatan, Ansible dapat melakukan tarik juga, via ansible-pull.
ceejayoz
1
Satu keuntungan utama adalah melintasi NAT dan firewall. Ini sering bukan penghalang jalan, tapi kadang-kadang itu adalah pengubah permainan.
Dan Garthwaite
SALT menggunakan pub / sub ZeroMQ. Yang berbeda.
Dan Garthwaite
1
Ada perdebatan yang luas tentang hal ini dalam penerapan Deplikasi vs utas konfigurasi sistem pada milis [devops-toolchain] [1]. [1]: code.google.com/p/devops-toolchain
sciurus
1
btw - HP Server Automation adalah model push, dan dapat mengelola puluhan ribu perangkat {pengungkapan - Saya seorang Arsitek Otomasi untuk mitra HP}
warren

Jawaban:

8

Masalah dengan sistem berbasis push adalah Anda harus memiliki model lengkap dari seluruh arsitektur pada node push pusat. Anda tidak dapat mendorong ke mesin yang tidak Anda ketahui.

Jelas dapat bekerja, tetapi butuh banyak pekerjaan untuk tetap sinkron.

Menggunakan hal-hal seperti Mcollective, Anda dapat mengubah Wayang dan CM lainnya menjadi sistem berbasis push. Secara umum, mudah untuk mengubah sistem tarik menjadi sistem berbasis push, tetapi tidak selalu mudah untuk sebaliknya.

Ada juga pertanyaan tentang politik organisasi. Sistem berbasis push menempatkan semua tangan kontrol admin pusat. Sangat sulit untuk mengelola kompleksitas dengan cara itu. Saya pikir masalah penskalaan adalah herring merah, baik skala pendekatan jika Anda hanya melihat jumlah klien. Dalam banyak hal, dorongan lebih mudah untuk diukur. Namun, konfigurasi dinamis kurang lebih menyiratkan bahwa Anda memiliki setidaknya versi tarik dari pendaftaran klien.

Pada akhirnya, ini tentang sistem mana yang cocok dengan alur kerja dan kepemilikan dalam organisasi Anda. Sebagai aturan umum, sistem tarikan lebih fleksibel.

Fred Anjing Ajaib Ajaib
sumber
2
Terima kasih! Tetapi mengapa konfigurasi dinamis menyiratkan menarik? Mungkin menggunakan dorongan dinamis, misalnya. Jadi tampaknya fakta bahwa Wayang tidak dapat melakukan dorongan dinamis, adalah batasan implementasi, bukan batasan arsitektur, kan?
Willem
4
@ Willem Lingkungan yang benar-benar "dinamis" berarti mesin baru dapat muncul di mana saja, kapan saja, dan memerlukan konfigurasi. Sistem berbasis push mengharuskan Anda untuk mengonfigurasi sistem itu di simpul pusat; sistem berbasis tarikan dapat menarik konfigurasi (umum) tanpa administrator lingkungan perlu melakukan apa pun ke server konfigurasi.
voretaq7
1
Zabbix menemukan host, Kemungkinan dapat menggunakan inventaris dinamis untuk mendorong konfigurasi tarikan ke host yang baru ditemukan.
bbaassssiiee
ya, ansible dapat menggunakan banyak sumber untuk inventaris dinamisnya, jadi misalnya ESX API. Dengan begitu Anda tahu tentang VM segera setelah dibuat, dan dapat menjalankan permainan pada pertandingan pola.
JM Becker
11

Dalam hal ini menarik bagi siapa pun, saya kira minimal saya bisa memberikan laporan pengalaman pengguna setelah menggunakan pertama saya kemampuan Ansible's out of the box push dalam konteks manajemen patch pengaturan multi-host pengaturan sistem mission-critical di awan Amazon. Untuk memahami prasangka atau bias saya, saya harus menjelaskan bahwa saya memiliki preferensi untuk Ruby di tingkat scripting otomatisasi dan telah menyiapkan proyek untuk menggunakan konfigurasi boneka master-agent per-proyek-Vpc di masa lalu. Jadi pengalaman saya memungkiri prasangka masa lalu, jika ada.

Pengalaman saya baru-baru ini sangat menguntungkan untuk mendorong dinamis ke real yang berubah dari puluhan ke ratusan server yang dapat meningkatkan atau menurunkan, diakhiri dan disegarkan. Dalam situasi saya, perintah Ad hoc 1.7 sederhana yang bisa saya lakukan adalah membuat patch. Namun mengingat efektivitas pengaturan AnsibleController (pada t2.micro) per Vpc untuk tujuan tersebut, di masa depan saya bermaksud untuk memperluas teknik untuk persyaratan yang lebih kompleks.

Jadi izinkan saya kembali ke pertanyaan yang diajukan di utas ini: pro dan kontra dari dorongan dalam real yang berubah secara dinamis.

Asumsi dari jenis server estate yang saya targetkan adalah:

  • Tidak ada asumsi bahwa alamat IP atau nama host lokal yang dihasilkan Amazon akan tahan lama - keduanya bisa datang dan pergi
  • Semua instance dibuat dari gambar mesin yang sudah memiliki kemampuan untuk memungkinkan akses ssh dari satu pengguna administratif istimewa
  • Untuk individuate server, dan berpotensi mempartisi mereka menjadi kelompok-kelompok, sesuai dengan fungsinya atau sesuai dengan tahap pengembangan (mis. Tes atau prod) ini akan dilakukan melalui peluncuran tag Amazon spesifik dari Nama konvensional yang disepakati
  • Bahwa saya akan menambal mengelola server Linux dan Windows secara terpisah, dengan perintah ad hoc yang berbeda, oleh karena itu cukup membiarkan login spesifik Linux gagal ketika menghubungi server Windows dapat diterima

Dengan kondisi ini dalam pikiran, membuat gambar mesin dari AnsibleController untuk jatuh ke berbagai Vpcs dan mengkonfigurasi (dengan kredensial) in situ dalam akun server yang ada sangat sederhana. Otomatis dalam setiap instance yang dibuat dari gambar

  1. Tugas cron untuk mendorong tambalan ke server yang berjalan secara berkala sehingga estate yang diperlukan diakses terus-menerus pada interval
  2. Cara menghitung inventaris yang dimungkinkan pada setiap interval tersebut.

Item kedua dapat dibuat relatif canggih jika diperlukan (melalui struktur Info inventaris Ansible). Tetapi jika kecanggihan tidak diperlukan, berikut ini adalah contoh skrip yang sangat mudah untuk menghitung semua instance Amazon EC2 pada setiap interval cron dan mengarahkan hasilnya ke file inventaris yang sesuai (mis. / Etc / ansible / hosts) ...

#!/bin/bash
# Assumes aws-cli/1.3.4 Python/2.6.9 Linux/3.4.73-64.112.amzn1.x86_64 or greater
# http://aws.amazon.com/releasenotes/8906204440930658
# To check yum list aws-cli
# Assumes that server is equipped with AWS keys and is able to access some or all
# instances in the account within it is running.
# Provide a list of host IPs each on a separate line
# If an argument is passed then treat it as the filename, whether local or absolute 
# path, to which the list is written

function list-of-ips {
    /usr/bin/aws ec2 describe-instances --filters '[ {"Name": "instance-state-code", "Values": [ "16" ] } ]' | grep -w PrivateIpAddress | awk  '{x=$2; gsub("\"","", x); gsub(",","", x); if(x && FNR!=1){print x;}}' | uniq
 }

if [ -n "$1" ]; then
   list-of-ips > "$1"
else
   list-of-ips
fi

Satu-satunya peringatan untuk kasus penggunaan adalah bahwa perintah patch harus idempoten. Sangat diinginkan untuk melakukan pra-tes untuk memastikan bahwa ini memuaskan, sebagai bagian dari memastikan bahwa tambalan melakukan apa yang dimaksudkan.

Singkatnya, saya telah mengilustrasikan kasus penggunaan di mana dorongan dinamis efektif terhadap tujuan yang saya tetapkan. Ini adalah solusi berulang (dalam arti dienkapsulasi dalam gambar yang dapat diluncurkan di beberapa akun dan wilayah). Dalam pengalaman saya sampai saat ini, teknik dorong dinamis jauh lebih mudah untuk diberikan --- dan mulai beraksi --- daripada alternatif yang tersedia dari perangkat yang tersedia untuk kita saat ini.

John
sumber
2
//, @jonz, ini adalah jenis diskusi yang, menurut saya, pengembang berpengalaman telah menyukai model Stack Exchange. Saya terutama menyukai istilah yang Anda pilih, dan bahwa jawaban ini mencantumkan asumsi terlebih dahulu.
Nathan Basanese