Tag yang dapat digunakan hanya dapat menjalankan sebagian tugas / peran. Ini berarti bahwa secara default semua tugas dijalankan dan kami hanya dapat mencegah beberapa tugas untuk dijalankan.
Bisakah kita membatasi tugas yang akan dikecualikan hanya ketika tag "foo" ditentukan? Bisakah kita menggunakan tag saat ini di when
bagian tugas?
Jawaban:
Kemungkinan 2,5 dilengkapi dengan tag khusus
never
danalways
. Tagnever
dapat digunakan tepat untuk tujuan ini. Misalnya:Dalam contoh ini, tugas hanya akan berjalan ketika tag
debug
(ataunever
) diminta secara eksplisit. [Referensi tentang dokumen yang memungkinkan]sumber
Meskipun ini adalah solusi bundaran, ia bekerja.
Di dalam daftar tugas, daftarkan variabel saat eksekusi normal berjalan. Kemudian, tambahkan kondisi ketika yang memeriksa variabel itu ke tugas yang ditandai.
sumber
untagged
untuk mencapai ini:- set_fact: untagged_run=true
tags: untagged
Saya tidak memiliki reputasi yang cukup untuk meningkatkan atau mengomentari jawaban yang menyarankan penggunaan variabel baris perintah (
--extra-vars
), tetapi saya memiliki ini untuk ditambahkan:Anda dapat mencegah kegagalan bermain dengan tidak adanya
--extra-vars
definisi dengan menetapkan nilai default di dalam buku pedoman itu sendiri:Mengganti melalui
--extra-vars
masih akan berfungsi karena variabel yang ditentukan pada baris perintah didahulukan dari semua definisi lainnya.Hasilnya adalah bahwa permainan berjalan tanpa kesalahan ketika
thorough
tidak diubah ketrue
pada baris perintah.sumber
thorough | default('no') | bool
.when: thorough is defined and thorough
jika Anda lebih menyukai sintaks ituis defined and
sintaksis. lebih dari beberapa pipa yang saya rasa tidak intuitif.Anda dapat menggunakan Kondisional untuk melindungi terhadap tugas yang tidak sengaja berjalan yang seharusnya dieksekusi jika Anda tidak menentukan tag. Peringatan untuk metode ini adalah bahwa permainan akan kesalahan dan gagal jika Anda tidak mendefinisikan variabel tambahan itu.
Menggunakan argumen extra-vars Anda dapat memicu kondisi Anda untuk dieksekusi.
Dari ansible-playbook --help:
Contoh:
test.yaml:
sumber
thorough | default("false") | match("true")
. Default tidak harusfalse
, hanya apa saja yang tidak cocoktrue
, tetapi meningkatkan keterbacaan.Memeriksa variabel 'tag' tidak berfungsi di An 2.1.1.0. Lihat di bawah untuk tes. Saya punya ide lain untuk mengeksekusi tugas hanya ketika tag didefinisikan, bekerja untuk Ansible 1.9.X dan 2.XY:
Dengan itu, saat menjalankan playbook tanpa tag apa pun, variabel 'foo' akan disetel ke true lalu menjadi false, sehingga tidak ada yang dijalankan. Jika Anda menambahkan tag 'bilah', hanya pengaturan pertama yang akan diterapkan, sehingga variabel 'foo' akan benar, maka tugas Anda akan dieksekusi. Nikmati!
Dan inilah tes tentang variabel 'tag' di An 2.1.1.0:
Ini buku pedomannya:
Dan inilah hasilnya:
sumber
Iya. Menjalankan playbook yang mungkin dengan
--tags foo
bendera akan memastikan bahwa hanya tugas yang ditandai denganfoo
yang dijalankan. Misalnya, anggap kita memiliki buku pedoman bernama example.yml:berlari:
Akan memastikan hanya tugas yum yang dieksekusi.
Jadi sebenarnya Anda tidak benar-benar perlu menggunakan tag ketika bagian untuk menjalankan tugas kondisional. Perhatikan bahwa tergantung pada kerumitan buku pedoman / peran Anda, Anda mungkin perlu menggunakan kombinasi --tags dan --skip-tag untuk mengontrol tugas yang dijalankan. Misalnya, jika tugas yang disertakan ditandai sebagai 'foo' dan beberapa tugas di dalam buku pedoman yang disertakan ditandai sebagai 'bilah' dan Anda menjalankan
Tugas internal (hanya ditandai sebagai 'bilah') akan dieksekusi. Untuk menghindari pelaksanaan semua tugas internal yang ditandai sebagai 'bilah' Anda harus menjalankan perintah berikut
sumber
ansible-playbook
opsi yang tepat , tetapi saya pikir OP meminta cara untuk membubuhi keterangan tugas sehingga tidak dieksekusi kecuali tag tertentu ditambahkan secara eksplisit dalamansible-playbook
perintah.Ada tag khusus - "tidak pernah" , yang akan mencegah tugas berjalan kecuali jika tag diminta secara khusus.
sumber
ketika klausa tidak dapat mengevaluasi keberadaan tag. Sebagai solusinya, saya menggunakan variabel dan tag secara bersamaan untuk menjalankan tugas khusus untuk tag / variabel tersebut.
Contoh: Bayangkan sebuah buku pedoman dan inventaris
Dengan pendekatan ini, Anda menggunakan tag untuk hanya memilih tugas di uninstall.yml, tetapi Anda juga perlu mengatur variabel 'uninstall_links' menjadi sesuatu untuk mengaktifkannya. Jadi, jika Anda menjalankan playbook tanpa parameter apa pun, secara default, akan menjalankan tugas instal. Untuk mencopot pemasangan, Anda dapat mengatur tag 'mencopot' ke buku pedoman Anda (atau cmdline) dan HARUS mengatur variabel. Jika Anda tidak menetapkan tag, itu akan menjalankan semuanya (instal dan hapus instalan) dalam urutan itu, yang bagus untuk menguji seluruh proses.
Cara menjalankan semuanya (ini akan menginstal dan menghapus instalan):
$
ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true"
Cara menjalankan hanya tag 'copot pemasangan' pada grup dev
$
ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true" -t uninstall
Karenanya, variabel dan tag juga bisa ada di file site.yml / inventaris, memungkinkan Anda untuk berkomitmen ke dalam SCM Anda dan mencatat niat Anda.
sumber
nootal benar, pendekatan saya tidak bekerja - abaikan saja :( Saya sekarang menggunakan "kapan: myvar didefinisikan" dan saklar baris perintah "-e" myvar = X "untuk menjalankan tugas hanya ketika diminta secara eksplisit.
Bahkan lebih mudah (setidaknya dengan an 2.1.1.0):
-> hanya akan mengeksekusi ketika tag telah disediakan DAN tag termasuk "foo"
sumber
Pada
Ansible 2.3.2.0
, inilah solusi saya untuk masalah ini:Dimulai dengan menetapkan
in_tag
untukTrue
maka adaset_fact
yang menetapkan kembali keFalse
atas ketika Anda tidak menentukantags
dariansible-playbook
.Ketika Anda menentukan tag,
in_tag
tetap diTrue
danfail
tugas berjalan.PS: Anda dapat menambahkan logika ke tugas apa pun yang Anda inginkan
PS2: Anda juga dapat memperluas logika dan hardcode semua tag yang Anda miliki dan
set_fact: in_tag_blah=True
dikombinasikan dengantags: ["blah"]
tentu saja.sumber