Bagaimana cara membersihkan hal-hal dari peran yang tidak digunakan lagi di server?

15

Misalkan saya memiliki host yang, antara lain, server web, di mana peran Ansible yang terkait menginstal nginx, melakukan beberapa konfigurasi penting di /etc/nginx, dan membuka port 80 dan 443 di firewall.

Pada titik tertentu saya ingin host tertentu tidak menjadi server web lagi, karena untuk beberapa alasan saya memindahkan layanan itu ke tempat lain. Hanya menghapus server dari [webservers]dalam inventaris akan meninggalkan sampah di server. Idealnya, saya ingin menghapus instalasi nginx, menghapus /etc/nginxdirektori (dan beberapa direktori lainnya), dan menutup port 80 dan 443 di firewall.

Dalam Wayang aku bisa melakukan ini. Host yang merupakan server web akan memiliki sesuatu seperti ini dalam konfigurasinya:

class { 'nginx':
  ensure => present,
}

dan yang harus saya lakukan adalah mengganti "sekarang" dengan "tidak ada". Jika nginxkelas ditulis dengan baik, itu akan membatalkan perubahan yang telah dibuatnya. (Biasanya seorang administrator akan mengganti "sekarang" dengan "tidak ada", dan kemudian, ketika dia yakin bahwa semua host yang terpengaruh telah membatalkan konfigurasi, ia akan menghapus item dari manifes.)

Terlebih lagi, saya berpikir bahwa modul firewall Wayang secara otomatis menghapus aturan firewall yang tidak dapat ditemukan dalam manifes lagi; jadi saya pikir, untuk firewall, Anda bahkan tidak perlu melakukan hal "absen" di atas, firewall akan tetap menutup secara otomatis.

Bagaimana saya bisa mencapai hal-hal ini dengan Ansible?

Antonis Christofides
sumber
1
Saya kira, pertanyaan hipotetis tidak pada topik di sini, meskipun pertanyaan Anda sendiri bukan tanpa alasan. Alih-alih "mari kita berpura-pura ..." ulang kata-kata dan mengatakan misalnya "Dalam wayang saya bisa mengubah peran server dan uninstall nginx yang dipasang sebelumnya dengan mengubah ensure => present ke ensure => absentyang juga akan ... Bagaimana melakukan hal yang sama dengan ansible" dll Idealnya dengan contoh apa pun yang sudah Anda coba.
HBruijn
2
Saya berpendapat Ansible sebenarnya tidak dirancang untuk hal semacam ini. Ini ditargetkan pada server yang dapat direproduksi dan sekali pakai. Jika Anda tidak ingin mesin menjadi server web lagi, Anda cukup menghapusnya (atau menghentikannya jika itu adalah contoh cloud) alih-alih menggunakannya kembali.
ceejayoz
@ceejayoz yang paling banyak saya baca tentang Ansibles ada di Game Ender's Orson Scott Card Card & sequals, tetapi apa yang Anda katakan sangat masuk akal dalam orkestrasi cloud
HBruijn
@ceejayoz: Saat ini saya tidak menggunakan Ansible untuk pengaturan multi-server, tetapi untuk mengkonfigurasi server otonom kecil. Saya pikir ini adalah penggunaan yang valid. Jadi server dapat memiliki nginx + django + PostgreSQL. Jika nanti saya memutuskan untuk meletakkan nginx atau nginx + Django di tempat lain, memusnahkan seluruh server dan perlu mengembalikan PostgreSQL dari cadangan akan tampak kurang optimal (belum lagi downtime).
Antonis Christofides

Jawaban:

10

Dengan Ansible, Anda tidak akan benar-benar melakukan ini secara berbeda dari bagaimana Anda akan melakukannya dengan Wayang.

Dalam contoh Anda di mana Anda akan mengatur

class { 'nginx':
  ensure => absent,
}

Anda bergantung pada penulis modul boneka yang telah menulis kode yang diperlukan untuk menangani menghapus semuanya. Tidak setiap modul boneka memiliki ini.

Demikian pula, dengan Ansible, Anda mungkin memiliki peran yang memiliki kedua langkah yang diperlukan untuk menginstalnya serta menghapusnya. Perbedaannya hanya pada bagaimana memohon keduanya.

Satu pendekatan bisa menjadi satu di mana peran dalam pertanyaan memperlihatkan variabel untuk beralih perilaku. Sebagai contoh, peran nginx mungkin mengambil variabel nginx_stateyang mengambil nilai installeddan absent.

Dalam peran itu tasks/main.yml, penulis peran mungkin memiliki sesuatu di sepanjang garis ..

- include: install.yml
  when: nginx_state|default('present') == "present"

- include: uninstall.yml
  when: nginx_state|default('present') == "absent"

..dengan masing-masing logika instal / hapus yang dipisah antara dua file yang termasuk dalam kondisi tersebut.

Peran yang dimungkinkan juga dapat disarangkan. Sebagai cara lain untuk melakukan hal yang sama, seorang penulis peran mungkin misalnya memberikan peran nginxdengan peran lain di dalamnya, yang disebut uninstalled. Anda kemudian dapat melakukan:

- name: Uninstall nginx
  hosts: some_group
  roles:
    - nginx/uninstalled

Mungkin, jika dibandingkan dengan Wayang, bisa dibilang memiliki lebih sedikit aturan dan pedoman tentang bagaimana hal-hal harus dilakukan sehingga praktik sedikit lebih bervariasi di alam liar, tetapi konsep yang sama berlaku.

Nick Groenen
sumber
1
Meskipun secara teknis Anda juga bisa meneruskan argumen langsung ke peran, saya akan merekomendasikan menggunakan peran bersarang. Saya akan merasa sangat aneh melihat dalam sebuah buku pedoman beberapa peran, yang sebenarnya akan dihapus pada pelaksanaan buku pedoman karena dalam variabel itu didefinisikan seperti itu. Setelah itu eksplisit melalui peran bersarang tampak jauh lebih bersih. Secara teknis dimungkinkan untuk meneruskan argumen ke peran ( - { role: nginx, state: absent }) tapi menurut saya sangat bertele-tele. Satu-satunya kelemahan untuk peran bersarang yang saya lihat adalah bahwa saya perlu menautkan vars default dari induknya.
bogdan.mustiata
Apa yang perlu Anda lakukan untuk sesuatu seperti roles: -nginx/uninstalledbekerja? Saya telah mencari di semua tempat, tetapi tidak dapat menemukan dokumentasi tentang peran bersarang dengan cara yang memungkinkan saya untuk melakukan itu.
aggregate1166877
1

Karena Anda memiliki konfigurasi / penyediaan di Ansible, Anda dapat menghapus seluruh server, menginstal ulang / menyediakan yang baru dan memiliki status bersih yang bagus untuk mengerjakannya.

Jika Anda benar-benar ingin "mengkonfigurasi ulang" untuk tujuan lain maka Anda harus membuat buku pedoman baru yang melakukan tugas pembersihan yang diperlukan.

Sejauh yang saya ketahui, semua modul pengemasan Anonim mendukung state=absentuntuk memastikan bahwa paket yang diberikan tidak diinstal pada server Anda. Selain itu, aptmodul memiliki purge=yesparameter yang akan membersihkan file konfigurasi kustom yang tersisa.

Anda juga dapat membuat tugas untuk mengonfirmasi bahwa port 80 adalah firewall. Namun, karena Anda tidak akan memiliki proses apa pun yang berjalan pada port itu, firewall tidak akan membuat perbedaan apa pun untuk keamanan server Anda.

Mxx
sumber
Untuk menambah ini, saya bertaruh sebagian besar permainan dalam peran itu bisa state=absentditambahkan. Ada peluang bagus yang akan menghapus atau membatalkan sebagian besar perubahan konfigurasi yang Anda buat. Bergantung pada seberapa besar perannya, ini mungkin PITA nyata untuk diuji.
Christopher Karel