Praktik terbaik untuk pembaruan Linux otomatis

11

Kami sedang berupaya untuk melakukan pembaruan otomatis untuk server berbasis RHEL / RHEL kami.

Gagasan awal: Menggunakan Puppet, kami menonaktifkan repositori default dan menunjuk ke milik kami. Kemudian, kami menggunakan ensure => latestpaket yang ingin kami perbarui secara otomatis.

Masalah: Kami melihat beberapa layanan memulai kembali setelah pembaruan (duh).

Pertanyaan: Apakah ada yang punya saran tentang cara mengotomatiskan pembaruan dan strategi Linux dengan lebih baik untuk mengurangi layanan restart otomatis? Kami lebih suka solusi yang mencakup Wayang tetapi, jika kami perlu menggunakan layanan lain, itu bukan pemecah kesepakatan.

Edit

Solusi yang mungkin: Saya mengajukan solusi yang mengimplementasikan banyak dari apa yang disarankan @ voretaq7 dan @ewwhite. Sepertinya ini adalah rute yang saya tempuh untuk saat ini. Jika Anda memiliki saran lain, silakan komentar atau kirimkan jawaban.

Belmin Fernandez
sumber

Jawaban:

14

Strategi pembaruan umum Anda bagus: Anda memiliki repo lokal (yang saya anggap Anda uji dalam lingkungan pengembang), dan Anda memperbarui semuanya berdasarkan repo (saya anggap bagus) repo.

Hal memulai kembali layanan tidak terhindarkan: Jika kode yang mendasarinya telah berubah, Anda harus memulai kembali layanan agar perubahan tersebut berlaku. Gagal melakukannya dapat mengakibatkan konsekuensi yang lebih buruk (menjalankan kode tidak sinkron dengan pustaka bersama yang menyebabkan aplikasi macet).
Di lingkungan saya, saya menganggap patch windows triwulanan menjadi triwulan "REBOOT ALL THE THINGS!" jendela juga. Keuntungan dari kebijakan semacam itu adalah Anda tahu bahwa server Anda akan muncul kembali setelah restart, dan Anda tahu mereka akan berfungsi dengan baik (karena Anda mengujinya secara teratur).


Saran terbaik saya kepada Anda adalah untuk menjadwalkan rilis perangkat lunak (mungkin ini berarti Anda harus memicu mereka "secara manual" dengan boneka), dan memberi tahu pengguna Anda tentang pemeliharaan / downtime yang direncanakan.
Atau (atau sebagai bagian dari ini) Anda dapat mengkonfigurasi redundansi di lingkungan Anda sehingga Anda dapat memiliki beberapa mesin atau layanan restart dan masih memberikan layanan kepada pengguna akhir. Ini mungkin tidak sepenuhnya menghilangkan gangguan, tetapi dapat membantu meminimalkannya.

Penambahan redundansi juga melindungi Anda jika terjadi kegagalan perangkat keras, yang tidak bisa dihindari dalam skala waktu yang cukup lama.

voretaq7
sumber
4
+1 untuk Reboot Semua Hal.
Tom O'Connor
2
@ TomO'Connor Saya sudah belajar dengan cara yang sulit. Saya merasa sangat nyaman hingga sekitar 3 bulan antara reboot, setelah itu saya mulai bertanya-tanya apa yang saya lakukan yang akan hilang. Reboot terakhir kami benar-benar kehilangan terowongan VPN (Terowongan itu hard-coded & muncul, tetapi rute untuk itu tidak ditambahkan, jadi ... yeah.)
voretaq7
Diposting solusi yang mungkin terinspirasi oleh Anda @ voretaq7
Belmin Fernandez
@ BeamingMel-Bin Anda harus memposting itu sebagai jawaban - kedengarannya seperti pendekatan yang masuk akal.
voretaq7
Terima kasih. Diposting bersama dengan beberapa modifikasi pada alur kerja per beberapa pemikiran yang saya lakukan di perjalanan pulang.
Belmin Fernandez
5

Apakah ada masalah dengan memulai kembali layanan setelah pembaruan paket? Uji dalam skala kecil sebelum Anda menyebarkan untuk melihat apakah ada masalah. Saya baru-baru punya masalah jelek dengan paket rpmforge dari DenyHosts . Itu benar-benar mengubah lokasi konfigurasi dan direktori kerja antara revisi dari pembaruan yum. Itu perilaku yang benar-benar tidak diinginkan. Biasanya, dalam revisi RHEL yang sama, tidak ada terlalu banyak masalah, tetapi Anda tidak akan pernah bisa yakin tanpa menguji dan mengamati efeknya dengan cermat.

Pilihan lain adalah memperbarui layanan secara selektif. Apakah Anda selalu membutuhkan paket terbaru, misalnya? Ini kembali ke memahami alasan Anda untuk menjalankan pembaruan. Apa tujuan sebenarnya?

Keuntungan menjalankan repo Anda sendiri adalah Anda dapat melakukan rilis atau peluncuran dan mengatur jadwal. Bagaimana jika Anda memiliki vendor perangkat keras atau perangkat lunak yang membutuhkan RHEL 5.6 dan akan rusak di bawah 5.7? Itulah salah satu manfaat mengelola paket Anda sendiri.

putih
sumber
Saya akan mengatakan jika set pembaruan memicu restart layanan Anda pasti ingin melakukan restart itu. Tentu saja jika Anda TIDAK PERLU untuk melakukan pembaruan itu (itu tidak membeli Anda fitur, peningkatan keamanan, atau sesuatu yang Anda butuhkan) saya tidak akan melakukannya, atau saya akan menunggu sampai saya bisa menjadwalkan pemadaman untuk nyaman bagi saya dan pengguna saya.
voretaq7
2

@Beaming Mel-Bin

Penyederhanaan akan menghilangkan kebutuhan untuk menggunakan ssh untuk alat loop, untuk memulai / menghentikan boneka.

Pertama-tama Anda perlu mengubah manifes Anda untuk memasukkan variabel yang disebut "noop" yang nilainya bersumber dari ENC.

Jadi Anda akan memiliki sesuatu seperti ini di kelas:

noop => $noop_status

Di mana noop_statusdiatur dalam ENC Anda. Saat Anda menetapkan nilai noop_statuske true, manifes akan berjalan dalam mode hanya di atas.

Jika Anda memiliki 100 atau 1000 host, Anda dapat menggunakan ENC seperti Dasbor atau Foreman yang memungkinkan Anda mengubah parameter secara massal untuk banyak host, dengan mewarisi mereka di level "Hostgroup" atau "Domain". Anda kemudian dapat menetapkan nilai ke "false" untuk sejumlah kecil host pengujian, mengesampingkan nilai Hostgroup.

Dengan ini, setiap perubahan diterapkan hanya pada host terpilih.

Mengubah satu parameter di lokasi pusat dapat memengaruhi sejumlah host, tanpa perlu menghidupkan / mematikan boneka dengan ssh untuk alat loop. Anda dapat membagi host Anda dalam beberapa grup untuk keselamatan / manajemen.

Juga perhatikan bahwa alih-alih nomor versi paket yang mengkode keras dalam manifes, Anda dapat memasukkannya ke dalam ENC. Dan seperti di atas, Anda dapat secara selektif menerapkan perubahan dan mengelola peluncuran.

Jika Anda ingin lebih granularity (dan kompleksitas) Anda bahkan dapat memiliki parameter per kelas, suka noop_status_apacheClassdan sebagainya.

Ini mungkin lebih sulit untuk dikelola jika Anda includekelas di kelas lain.

Tidak sekarang
sumber
1

Solusi yang mungkin berdasarkan jawaban @ voretaq7:

  1. Nomor versi keras kode paket dalam puppetmanifes dan mengelola paket dalam repositori kami sendiri.

  2. Ketika kami membutuhkan versi baru dari paket untuk melakukan sesuatu yang ditawarkannya (mis. Peningkatan keamanan, fitur yang dibutuhkan oleh pelanggan kami, dll.), Kami mengunduh paket ke repositori.

  3. Uji paket yang diperbarui pada server uji.

  4. Setelah pembaruan diuji, gunakan sesuatu seperti funcatau psshuntuk mematikan puppetagen pada node yang terpengaruh.

  5. Perbarui puppetmanifes untuk memastikan bahwa versi baru paket diinstal pada node yang terpengaruh.

  6. Akhirnya, jalankan puppet agent --onetime && rebootdi server menggunakan funcataupssh

Tolong beri komentar dan beri tahu saya jika Anda menemukan kekurangan dalam solusi ini atau apa pun yang dapat disederhanakan.

Belmin Fernandez
sumber
1
Dimungkinkan untuk menyederhanakan ini menggunakan ENC dan parameter. Ini akan membutuhkan beberapa pengaturan ulang dari manifes, yang mungkin tidak mungkin untuk semua.
Tidak Sekarang
Tolong jelaskan @NotNow dan poskan jawaban. Penasaran ingin tahu.
Belmin Fernandez