Latar belakang: di Puppet dimungkinkan untuk mengeksekusi perintah kecuali jika sudah dieksekusi:
exec { '/bin/echo root >> /usr/lib/cron/cron.allow': path => '/usr/bin:/usr/sbin:/bin', unless => 'grep root /usr/lib/cron/cron.allow 2>/dev/null', }
Tujuan: untuk mengeksekusi perintah kecuali jika sudah dijalankan di Ansible
Metode
tugas / main.yml
- name: add vhost sensu
command: rabbitmqctl add_vhost /sensu
Hasil
TASK [ansible-rabbitmq : add vhost sensu] **************************************
fatal: [111.222.333.444]: FAILED! => {"changed": true, "cmd": ["rabbitmqctl",
"add_vhost", "/sensu"], "delta": "0:00:00.210140", "end":
"2016-07-29 12:55:19.384455", "failed": true, "rc": 2, "start":
"2016-07-29 12:55:19.174315", "stderr": "Error: vhost_already_exists: /sensu",
"stdout": "Creating vhost \"/sensu\" ...", "stdout_lines":
["Creating vhost \"/sensu\" ..."], "warnings": []}
Diskusi
Googling unless ansible
menunjukkan dokumen ini tentangwhen
. Berdasarkan dokumentasi itu, sebuah when
pernyataan ditambahkan:
- name: add vhost sensu
command: rabbitmqctl add_vhost /sensu
when: rabbitmqctl list_vhosts | grep sensu
menjalankan kode menghasilkan:
fatal: [192.168.0.9]: FAILED! => {"failed": true, "msg": "The conditional
check 'rabbitmqctl list_vhosts | grep sensu' failed. The error was: template
error while templating string: expected token 'end of statement block', got
'list_vhosts'. String: {% if rabbitmqctl list_vhosts | grep sensu %} True {%
else %} False {% endif %}\n\nThe error appears to have been in '/etc/ansible
/roles/ansible-rabbitmq/tasks/main.yml': line 10, column 3, but may\nbe
elsewhere in the file depending on the exact syntax problem.\n\nThe
offending line appears to be:\n\n\n- name: add vhost sensu\n ^ here\n"}
- Pertama-tama, bayangkan
when
itu berhasil maka perintah tidak akan berjalan dan kemudian lebih miriponlyif
di Wayang . - Kedua, jika kapan akan berhasil harus tanda eskalasi digunakan untuk mensimulasikan suatu kecuali?
- Penggunaan
register
. Bagaimana jika file itu hilang atau vhost telah dihapus oleh misalnya manusia? Wayangunless
selalu mengeksekusi perintah sehingga jelas apakah perintah perlu dieksekusi.
fatal: [IP]: FAILED! => {"changed": true, "cmd": ["rabbitmqctl", "add_vhost", "/sensu"], "delta": "0:00:00.198681", "end": "2016-07-29 13:43:00.870193", "failed": true, "rc": 2, "start": "2016-07-29 13:43:00.671512", "stderr": "Error: vhost_already_exists: /sensu", "stdout": "Creating vhost \"/sensu\" ...", "stdout_lines": ["Creating vhost \"/sensu\" ..."], "warnings": []}
.stdout
jawaban saya yang hilang diedit.The
when
pilihan adalah satu-satunya hal Ansible telah mengenai kondisi. Tapi Anda tidak bisa langsung mendefinisikan perintah di sana.when
mengharapkan ekspresi Jinja dan selanjutnya dievaluasi pada host kontrol yang memungkinkan. Jadi, pertama-tama Anda perlu menjalankan tugas untuk mengambil hasilnya dan mendaftarkannya.stdout_lines
adalah array dari semua baris yang dikembalikan tugas shell. Jadi, Anda dapat menghitung jumlah entri dan hanya menjalankan tugas Anda ketika 0 item telah dikembalikansumber
fatal: [IP]: FAILED! => {"changed": true, "cmd": "rabbitmqctl list_vhosts | grep sensu", "delta": "0:00:00.198769", "end": "2016-07-29 13:45:59.069981", "failed": true, "rc": 1, "start": "2016-07-29 13:45:58.871212", "stderr": "", "stdout": "", "stdout_lines": [], "warnings": []}