Ini adalah bagian dari playbook yang saya gunakan ( server.yml
):
- name: Determine Remote User
hosts: web
gather_facts: false
roles:
- { role: remote-user, tags: [remote-user, always] }
File host saya memiliki grup server yang berbeda, mis
[web]
x.x.x.x
[droplets]
x.x.x.x
Sekarang saya ingin menjalankan ansible-playbook -i hosts/<env> server.yml
dan menimpa hosts: web
dari server.yml
untuk menjalankan pedoman ini [droplets]
.
Bisakah saya menimpa sebagai satu kali waktu, tanpa mengedit server.yml
secara langsung?
Terima kasih.
ansible
ansible-playbook
luqo33
sumber
sumber
hosts: "{{ variable_host | default('web')}}"
ansible-playbook server.yml --extra-vars "variable_host=newtarget(s)"
group_vars/all
muncul dapat dipecah setelah padahosts:
garis pedoman tersebut. Namun, variabel divars:
dan variabel divars_files:
diurai sebelumhosts:
baris? CATATAN Saya tidak bertanya tentang prioritas.-e
bukan--extra-vars
.Untuk siapapun yang mungkin datang mencari solusinya.
Mainkan Buku
Inventaris
Command:
ansible-playbook deplyment.yml -i hosts --extra-vars "host=droplets"
Jadi Anda dapat menentukan nama grup di extra-varssumber
play_hosts
dan tidak mendapatkan hasil yang diharapkan karena saya lupa bahwa ituplay_hosts
adalah var Ansible internal untuk semua tuan rumah dalam permainan saat ini.Ini agak terlambat, tetapi saya pikir Anda dapat menggunakan
--limit or -l
perintah untuk membatasi pola ke host yang lebih spesifik. (versi 2.3.2.0)Kamu bisa saja
- hosts: all (or group) tasks: - some_task
dan kemudian
ansible-playbook playbook.yml -l some_more_strict_host_or_pattern
gunakan--list-hosts
bendera untuk melihat di host mana konfigurasi ini akan diterapkan.sumber
limit
daftar host yang terkena dampak playbook dapat menyebabkan banyak kerusakan.--extra-vars "variable_host=newtarget(s)"
seperti solusi yang diterima sama berbahayanya dan solusi yang lebih rumit. Ini menggunakan host defaultweb
yang dapat diterapkan di sini juga sebagai gantiall
. Anda dapat menggunakan grup host yang ketat sebagai default untuk menghindari membuat kesalahan dan menggunakan--list-hosts
tanda untuk memiliki pemahaman yang jelas tentang host mana yang Anda pengaruhi.--limit
(jika tidak maka akan mempengaruhi semua host yang mungkin, yang mungkin bukan perilaku yang Anda inginkan)Kami menggunakan sederhana tugas gagal untuk memaksa pengguna menentukan opsi Batas yang memungkinkan , sehingga kami tidak mengeksekusi pada semua host secara default / tidak sengaja.
Cara termudah yang saya temukan adalah ini:
Sekarang kita harus menggunakan
-l
(=--limit
option) saat menjalankan playbook, misBatasi dokumen opsi :
sumber
Saya menggunakan pendekatan lain yang tidak memerlukan inventaris apa pun dan bekerja dengan perintah sederhana ini:
Untuk melakukan itu, Anda memerlukan pedoman dengan dua drama:
Contoh yang berfungsi (salin dan jalankan dengan perintah sebelumnya):
sumber
Saya mengubah milik saya ke default menjadi tidak ada host dan memiliki cek untuk menangkapnya. Dengan begitu pengguna atau cron dipaksa untuk menyediakan satu host atau grup, dll. Saya suka logika dari komentar dari @wallydrag. Tidak
empty_group
berisi host di inventaris.Kemudian tambahkan tugas check in:
sumber
Baru saja menemukan googling ini untuk mendapatkan solusi. Sebenarnya, ada satu di Ansible 2.5. Anda dapat menentukan file inventaris Anda dengan
--inventory
, seperti ini:ansible --inventory configs/hosts --list-hosts all
sumber
-i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY specify inventory host path or comma separated host list. --inventory-file is deprecated
Jika Anda ingin menjalankan tugas yang terkait dengan sebuah host, tetapi pada host yang berbeda, Anda harus mencoba delegate_to .
Dalam kasus Anda, Anda harus mendelegasikan ke localhost Anda (master yang memungkinkan) dan
ansible-playbook
perintah panggilansumber
Saya menggunakan ansible 2.5 (persis 2.5.3), dan tampaknya file vars dimuat sebelum param host dijalankan. Jadi, Anda dapat mengatur host di vars.yml file dan menuliskannya
hosts: {{ host_var }}
di playbook AndaMisalnya, di playbook.yml saya:
Dan di dalam vars / project.yml:
sumber
Inilah solusi keren yang saya temukan untuk menentukan host dengan aman melalui
--limit
opsi. Dalam contoh ini, permainan akan berakhir jika pedoman dijalankan tanpa host yang ditentukan melalui--limit
opsi.Ini telah diuji pada Ansible versi 2.7.10
sumber
Solusi lain adalah menggunakan variabel khusus
ansible_limit
yang merupakan konten--limit
opsi CLI untuk eksekusi Ansible saat ini.Jika
--limit
opsi dihilangkan, maka Ansible mengeluarkan peringatan, tetapi tidak melakukan apa-apa karena tidak ada host yang cocok.sumber