Saya menggunakan Ansible untuk beberapa tugas manajemen pengguna sederhana dengan sekelompok kecil komputer. Saat ini, saya sudah mengatur buku pedoman saya hosts: all
dan file host saya hanyalah satu grup dengan semua mesin terdaftar:
# file: hosts
[office]
imac-1.local
imac-2.local
imac-3.local
Saya sering menemukan diri saya harus menargetkan satu mesin. The ansible-playbook
batas perintah bisa bermain seperti ini:
ansible-playbook --limit imac-2.local user.yml
Tapi itu agak rapuh, terutama untuk buku pedoman yang berpotensi merusak. Mengibarkan limit
bendera berarti playbook akan dijalankan di mana-mana. Karena alat-alat ini hanya digunakan sesekali, sepertinya layak untuk mengambil langkah-langkah untuk memutar ulang sangat mudah sehingga kami tidak secara tidak sengaja mengeluarkan sesuatu beberapa bulan dari sekarang.
Apakah ada praktik terbaik untuk membatasi menjalankan buku pedoman ke satu mesin? Idealnya, buku pedoman harus tidak berbahaya jika beberapa detail penting ditinggalkan.
sumber
--limit office[0]
'{{ target }}'
- menurut docs.ansible.com/...run_once
masih bisa merusak sehingga itu bukan ide yang bagus.-e
setara dengan--extra-vars
hosts: "{{ target | default('no_hosts')}}"
Ada juga trik kecil yang lucu yang memungkinkan Anda menentukan satu host pada baris perintah (atau beberapa host, kurasa), tanpa inventaris perantara:
Catat koma ( , ) di bagian akhir; ini menandakan bahwa ini adalah daftar, bukan file.
Sekarang, ini tidak akan melindungi Anda jika Anda secara tidak sengaja memasukkan file inventaris nyata, jadi itu mungkin bukan solusi yang baik untuk masalah khusus ini. Tapi itu trik yang mudah diketahui!
sumber
skipping: no hosts matched
. Mungkin trik ini tidak lagi berfungsi sejak--limit
berhasil?$ ansible-playbook -kK --limit=myhost1 myplaybook.yml
. Lihat jawaban Marwan.all
dalam permainan - ini membutuhkan waktu beberapa saat untuk sayaPendekatan ini akan keluar jika lebih dari satu host disediakan dengan memeriksa variabel play_hosts . The gagal modul digunakan untuk keluar jika kondisi host tidak terpenuhi. Contoh di bawah ini menggunakan file host dengan dua host alice dan bob.
user.yml (playbook)
Jalankan playbook tanpa filter host
Jalankan playbook pada satu host
sumber
--limit
adalah cara untuk pergiplay_hosts
tidak digunakan lagi dalam Ansible 2.2 dan diganti denganansible_play_hosts
. Untuk berjalan di satu host tanpa perlu--limit
, Anda bisa menggunakanwhen: inventory_hostname == ansible_play_hosts[0]
.[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: {{ play_hosts|length }} == ''
pada An 2.8.8.Ada IMHO cara yang lebih nyaman. Anda memang dapat secara interaktif meminta pengguna untuk mesin yang ingin dia terapkan berkat playbook ke
vars_prompt
:sumber
--extra-vars
dan var normal di buku pedoman Anda ...{{ hosts }}
dievaluasi sebelum nilainya dimasukkan - atau ada trik khusus?Untuk memperluas jawaban joemailer, jika Anda ingin memiliki kemampuan pencocokan pola untuk mencocokkan setiap subset mesin jarak jauh (seperti yang dilakukan
ansible
perintah), tetapi masih ingin membuatnya sangat sulit untuk secara tidak sengaja menjalankan playbook pada semua mesin, ini adalah apa yang saya pikirkan:Buku pedoman yang sama dengan jawaban lain:
Mari kita memiliki host berikut:
Sekarang, untuk menjalankan perintah di semua perangkat, Anda harus secara eksplisit mengatur variabel target menjadi "semua"
Dan untuk membatasinya ke pola tertentu, Anda dapat mengatur
target=pattern_here
atau, sebagai alternatif, Anda dapat meninggalkan
target=all
dan menambahkan--limit
argumen, misalnya:yaitu.
ansible-playbook user.yml --extra-vars "target=all" --limit imac-1* --list-hosts
yang mengakibatkan:
sumber
Saya benar-benar tidak mengerti bagaimana semua jawaban itu sangat rumit, cara untuk melakukannya adalah:
The
check
mode memungkinkan Anda untuk menjalankan dalam mode kering-lari, tanpa membuat perubahan.sumber
--check
, jadi saya kira ini masih berguna sebagai dokumentasi, karena pertanyaan ini mungkin sangat googlablePengguna AWS yang menggunakan Script Inventaris Eksternal EC2 dapat dengan mudah memfilter berdasarkan id instan:
Ini berfungsi karena skrip inventaris membuat grup default .
sumber
Kami memiliki beberapa buku pedoman umum yang dapat digunakan oleh sejumlah besar tim. Kami juga memiliki file inventaris khusus lingkungan, yang berisi beberapa deklarasi grup.
Untuk memaksa seseorang yang memanggil playbook untuk menentukan grup yang akan dilawan, kami menambakan entri boneka di bagian atas playbook:
Kami kemudian menyertakan cek berikut sebagai langkah pertama dalam buku pedoman bersama:
Jika server-dummy muncul di daftar host, playbook ini dijadwalkan untuk dijalankan melawan (ansible_play_batch), maka penelepon tidak menentukan grup dan eksekusi playbook akan gagal.
sumber
ansible_play_batch
daftar batch saat ini saja, jadi ketika menggunakan batching ini masih tidak aman. Lebih baik digunakanansible_play_hosts
sebagai gantinya.Karena versi 1.7 dimungkinkan memiliki opsi run_once . Bagian ini juga berisi beberapa diskusi tentang berbagai teknik lainnya.
sumber
Ini menunjukkan cara menjalankan buku pedoman di server target itu sendiri.
Ini agak sulit jika Anda ingin menggunakan koneksi lokal. Tetapi ini harus OK jika Anda menggunakan variabel untuk pengaturan host dan dalam file host buat entri khusus untuk localhost.
Di (semua) buku pedoman ada host: baris disetel ke:
Dalam file host inventaris, tambahkan entri untuk localhost yang menetapkan koneksi menjadi lokal:
Kemudian pada baris perintah jalankan perintah secara eksplisit menetapkan target - misalnya:
Ini juga akan berfungsi saat menggunakan tarikan yang mungkin:
Jika Anda lupa mengatur variabel pada baris perintah, perintah tersebut akan error dengan aman (selama Anda belum membuat grup host yang disebut 'no_hosts'!) Dengan peringatan:
Dan seperti yang disebutkan di atas Anda dapat menargetkan satu mesin (selama itu ada di file host Anda) dengan:
atau grup dengan sesuatu seperti:
sumber
Saya memiliki skrip pembungkus yang disebut ketentuan yang memaksa Anda untuk memilih target, jadi saya tidak harus menanganinya di tempat lain.
Bagi mereka yang penasaran, saya menggunakan ENV vars untuk opsi yang digunakan vagrantfile saya (menambahkan argumen yang sesuai yang mungkin untuk sistem cloud) dan membiarkan sisa argumen yang memungkinkan melewati. Di mana saya membuat dan menyediakan lebih dari 10 server sekaligus, saya menyertakan coba ulang otomatis pada server gagal (selama kemajuan sedang dibuat - saya menemukan saat membuat 100 atau lebih server pada suatu waktu sering beberapa akan gagal saat pertama kali sekitar ).
sumber
Solusi yang sedikit berbeda adalah dengan menggunakan variabel khusus
ansible_limit
yang merupakan isi dari--limit
opsi CLI untuk pelaksanaan Ansible saat ini.Tidak perlu mendefinisikan variabel tambahan di sini, cukup jalankan playbook dengan
--limit
bendera.sumber