Script untuk menambahkan server dari Google Cloud ke config ssh

Anotasi Artikel tentang skrip yang sangat sederhana yang membentuk konfigurasi untuk ssh Linux dari daftar server. Diuji pada Ubuntu 18, menggunakan Goodle Cloud SDK, Python 2.7, Bash.


Setelah peningkatan tajam dalam jumlah server yang harus saya kerjakan, saya menyadari bahwa penyimpanan kata sandi dan CMDB tidak lagi menyediakan akses operasional seperti itu, seperti pada masa itu ketika saya hanya mengingat semua ip dan detail dengan hati. Mungkin karena CMDB yang belum kita kuasai. Namun demikian, bagaimanapun juga perlu untuk memecahkan masalah akses cepat melalui SSH ke sejumlah besar server.


Berikutnya - dari sudut pandang terminal Linux (dilakukan pada Ubuntu 18). Mungkin bekerja di distribusi lain dan, mungkin, bahkan ada analog pada Windows - saya tidak melihat.


Persyaratan utama:


  • Mudah diulang. Beberapa administrator
    dan Anda memerlukan kemampuan untuk mengonfigurasi yang sama untuk semua orang. Selain itu, kami mengizinkan pekerjaan jarak jauh - setidaknya setiap laptop memiliki situasi, tetapi kadang-kadang Anda tidak bekerja di komputer "lama yang disetel dan disadap" seperti biasanya.
  • Server ditambahkan, dihapus, alamat diubah. Ini harus dipertimbangkan.

Untuk melakukan ini, saya memutuskan untuk menggunakan alias host di pengaturan ssh, mendapatkan daftar server melalui klien gcloud cli GCP, dan mengotomatisasi semua ini menggunakan Python 2.7 (karena secara default di Ubuntu dan saya memutuskan untuk mempelajarinya bekerja dengan data). Script itu sendiri dengan deskripsi di bawah potongan.


Pernyataan masalah


Idenya adalah ini: simpan daftar alias server komunikasi dan alamat mereka saat ini sedemikian rupa sehingga hanya nama yang dapat digunakan untuk membuat koneksi. Pada saat yang sama, daftar itu sendiri secara berkala diperbarui dari GCP oleh API.


Akibatnya, ada beberapa tugas:


  1. Menghubungkan ke host dengan mengetik hanya nama yang mudah diingat (kami biasanya membentuk nama sesuai dengan aturan yang ketat, sehingga cukup untuk mengetahui klien dan sistem untuk hampir pasti menebak nama server). Nama bisa nyata (jika server dibuat sepenuhnya oleh kami) atau alias di dalam cmdb kami (jika server dibuat oleh klien dan nama tersebut diberikan sesuai dengan aturan klien). Bagaimanapun, mengingat nama lebih mudah daripada alamat. Alamatnya juga berubah.
  2. Mendapatkan daftar host saat ini dengan alamat yang valid. Karena platform utama adalah GCP dan 90% dari server ada, maka masalah ini akan diselesaikan melalui API mereka, dan bukan dengan alat pemantauan.
  3. Cari berdasarkan nama host. Meskipun lebih mudah diingat, angkanya bertambah, dan ingatannya tidak terbatas :) Ya, dan administrator baru lebih mudah.
  4. Perbarui alias bundel - alamat hanya ketika alamat berubah. Ini diperlukan untuk meninggalkan penulisan ulang lengkap semua bundel. Ini akan memungkinkan penyimpanan bundel tidak hanya untuk server GCP. Sejauh ini masalah ini belum terpecahkan :(

Deskripsi Solusi


Alias โ€‹โ€‹untuk terhubung


Semuanya di sini cukup sederhana dan tidak diputuskan oleh saya. Utilitas ssh Linux mendukung konfigurasi alias dalam file konfigurasi.


Lokasi File: ~ / .ssh / config


Format file yang kami gunakan sangat dangkal, tetapi sebenarnya kemungkinannya jauh lebih luas:


HOST alias_ HostName ip__- 

Anda dapat membaca lebih lanjut tentang opsi konfigurasi di sini , di sini atau di dokumentasi resmi .


Langkah selanjutnya


  1. Gunakan tombol yang berbeda untuk terhubung ke grup host yang berbeda. Sedikit paranoia dalam hal keamanan tidak akan sakit.
  2. Berikan cadangan file ini untuk melindungi dari perubahan yang tidak disengaja dan memperbarui kesalahan skrip.

Cari nama host


Di sini keputusan itu bukan milik saya sama sekali, tetapi untuk Ben Lobaugh dan dijelaskan dalam artikelnya .
Singkat kata, saya menggunakan sed, yang, untuk memudahkan memulai (aturan yang sangat panjang dalam parameter) disingkat via alias:


 alias sshhosts="sed -rn 's/^\s*HOST\s+(.*)\s*/\1/ip' ~/.ssh/config" 

Jika Anda perlu menemukan host dengan bagian nama, maka skrip ini sepenuhnya dilengkapi oleh utilitas grep dan hasilnya ternyata seperti ini:


 sshhost | grep '---' 

Ada opsi lain, misalnya, seperti dijelaskan di sini .


Nama host autocomplete


Terima kasih atas solusinya onix74 !
Tambahkan baris ke ~ / .bash_completion:


 complete -W "$(grep "^HOST " ~/.ssh/config | grep -v "\*" | sed 's/[^ ]* *\(.*\)/\1/')" ssh 

Untuk perintah ssh, pelengkapan otomatis akan berfungsi sesuai dengan daftar server alias. Yaitu Anda dapat menggunakan ssh untuk mengganti nama server ssh. Ini bekerja di bash.

Langkah selanjutnya


Saya berencana untuk membagi host menjadi grup sehingga Anda dapat memilih semua server klien tertentu atau dengan aplikasi tertentu. Tampaknya fitur ini akan menarik untuk eksekusi skrip massal dan koneksi Ansible; serta membuat detail koneksi yang berbeda untuk grup yang berbeda. Tetapi seberapa banyak hal itu benar-benar masuk akal masih harus dilihat.


Dapatkan daftar host dari GCP


Pada langkah ini, semuanya cukup sederhana, kecuali untuk pengaturan parameter (meskipun ini adalah masalah pengalaman). Saya memutuskan untuk menggunakan SDK GCloud untuk mendapatkan data, karena sementara saya jarang menggunakannya, tapi saya kira kadang-kadang ini akan memungkinkan saya untuk menggunakan antarmuka grafis semakin dan semakin menyederhanakan rutin administrasi. Oleh karena itu, argumen utamanya adalah untuk mendapatkan pengalaman.
Mungkin, hal yang sama dapat dilakukan dengan menggunakan curl dan API REST GCP, dan kemudian solusinya akan lebih universal (karena GCloud SDK membutuhkan instalasi dan inisialisasi terpisah, yang tidak begitu rumit, tetapi masih diperlukan).


Untuk mendapatkan informasi yang diperlukan, saya harus menggunakan format json. Meskipun ini sangat menyederhanakan pemrosesan lebih lanjut dari jawaban yang diterima, itu membuat orang berpikir sedikit tentang pengaturan parameter format di SDK.
Sebagai hasilnya, saya menerima perintah berikut:


 gcloud compute instances list --filter="status:running" --format="json(name, status, networkInterfaces[].accessConfigs[])" 

Ini hanya mengembalikan server yang saat ini aktif (tidak masuk akal untuk terhubung ke yang lain) dengan informasi tentang nama dan antarmuka jaringan mereka. Sejauh ini, hanya satu antarmuka eksternal yang digunakan untuk setiap server.


Hasil akhir tiba di json:


 [ ---...---- { "name": "-", "networkInterfaces": [ { "accessConfigs": [ { "kind": "compute#accessConfig", "name": "External NAT", "natIP": "ip-", "networkTier": "PREMIUM", "type": "ONE_TO_ONE_NAT" } ] } ], "status": "RUNNING" }, ----...--- ] 

Langkah selanjutnya


Temukan format yang outputnya akan meminimalkan atau bahkan menghilangkan pemrosesan selanjutnya.


Script untuk membuat daftar alias berdasarkan data dari GCP


Script ditulis dengan python 2.7 karena dua alasan:


  1. Saya memutuskan untuk mempelajarinya karena bekerja dengan data;
  2. python 2.7 secara default pada sebagian besar sistem yang menjalankan linux - tidak akan ada masalah menggunakannya di tempat lain. Mengingat bahwa bahkan menang sekarang memungkinkan Anda untuk menempatkan sistem kedua dan menggunakan Ubuntu sebagai terminal.

Algoritma adalah sebagai berikut:


  1. Kami mendapatkan daftar server dari Google Cloud menggunakan SDK, memulai eksekusi perintah di konsol dari python.
  2. Kami mem-parsing JSON yang dihasilkan menjadi tipe yang ramah-python.
  3. Kami memberikan output dalam format yang diperlukan untuk pengaturan ssh (jika perlu, output skrip dialihkan ke ~ / .ssh / config atau ke beberapa file perantara).

Lihat skrip
 #!/usr/bin/python import commands import json sComputeListOutput = commands.getoutput('gcloud compute instances list --filter="status:running" --format="json(name, status, networkInterfaces[].accessConfigs[])" ') s = json.loads(sComputeListOutput) for server in s: print 'HOST ',server['name'] print ' HostName ',server['networkInterfaces'][0]['accessConfigs'][0]['natIP'] 

Memperbarui Hanya Data Yang Dimodifikasi


Tugas ini masih dalam proses. Saya berencana untuk membaca file ssh / config dalam skrip yang sama, membandingkannya dengan nilai yang diterima, dan kemudian menulis kembali seluruh hasilnya. Atau buat file baru secara terpisah dan lakukan perbandingan menggunakan beberapa jenis diff - ini memungkinkan Anda untuk mengonfirmasi semua perubahan secara manual.

Source: https://habr.com/ru/post/id484500/


All Articles