Tương đương với Puppet's `trừ khi trong Ansible là gì?


9

Bối cảnh: trong Puppet có thể thực thi một lệnh trừ khi nó đã được thực thi:

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',
}

Mục đích: để thực thi một lệnh trừ khi nó đã được chạy trong Ansible

Phương pháp

nhiệm vụ / main.yml

- name: add vhost sensu
  command: rabbitmqctl add_vhost /sensu

Các kết quả

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": []}

Thảo luận

Googling unless ansiblecho thấy tài liệu này vềwhen . Dựa trên tài liệu đó, một whentuyên bố đã được thêm vào:

- name: add vhost sensu
  command: rabbitmqctl add_vhost /sensu
  when: rabbitmqctl list_vhosts | grep sensu

chạy mã dẫn đến:

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"}
  1. Trước hết, hãy tưởng tượng rằng whenđã thành công thì lệnh sẽ không chạy và sau đó nó trông giống như onlyiftrong Puppet .
  2. Thứ hai, nếu khi nào thành công thì nên sử dụng dấu leo ​​thang để mô phỏng trừ khi?
  3. Sử dụngregister . Điều gì xảy ra nếu tập tin đó bị mất hoặc vhost đã bị xóa ví dụ như con người? Con rối unlessluôn thực thi các lệnh để rõ ràng liệu lệnh có cần được thực thi hay không.

Câu trả lời:


9

Tôi nghĩ những gì bạn đang làm là đây:

- name: get vhosts
  command: rabbitmqctl list_vhosts
  register: vhosts
  changed_when: false

- name: add vhost sensu
  command: rabbitmqctl add_vhost /sensu
  when: "'/sensu' not in vhosts.stdout"

Re: # 3 registerkhông tạo tập tin. Nếu bạn đang nắm bắt đầu ra của rabbitmqctl list_vhoststhông qua register, nội dung sẽ có giá trị như trạng thái hiện tại của hệ thống.


3

Vấn đề là dòng when: rabbitmqctl list_vhosts | grep sensu. Không thể sử dụng bash ở đây.

Bạn cần đặt rabbitmqctl list_vhosts | grep sensumột nhiệm vụ riêng biệt và đăng ký kết quả để sử dụng nó trong mệnh đề khi. Bạn có thể sử dụng notbộ lọc để có được unlesshành vi như.

Một cái gì đó như thế này sẽ hoạt động:

- name: Get rabbitmq vhosts.
  command: rabbitmqctl list_vhosts | grep sensu
  register: rabbitmq_vhosts

- name: add vhost sensu
  command: rabbitmqctl add_vhost /sensu
  when: not 'sensu' in rabbitmq_vhosts.stdout

Trong Get rabbitmq vhosts.ví dụ này sẽ luôn luôn được thực thi. Các add vhost sensuchỉ khi chuỗi sensu không có trong đăng ký rabbitmq_vhosts.

Tham khảo tài liệu về các bộ lọc có điều kiệnjinja để biết thêm thông tin.


Vấn đề vẫn tồn tại: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": []}
030

hm, có lẽ là lỗi của tôi Tôi đoán đó là một mất tích .stdoutchỉnh sửa câu trả lời của tôi.
Henrik Pingel

0

Các whentùy chọn là điều duy nhất Ansible đã liên quan đến điều kiện. Nhưng bạn không thể trực tiếp xác định một lệnh ở đó. whenmong đợi một biểu thức Jinja và hơn nữa được đánh giá trên máy chủ điều khiển Ansible. Vì vậy, trước tiên bạn cần chạy một tác vụ để lấy kết quả và đăng ký nó.

- shell: rabbitmqctl list_vhosts | grep sensu
  register: sensu_vhosts

- name: add vhost sensu
  command: rabbitmqctl add_vhost /sensu
  when: sensu_vhosts.stdout_lines < 1

stdout_lineslà một mảng của tất cả các dòng tác vụ shell được trả về. Vì vậy, bạn có thể đếm số lượng mục nhập và chỉ chạy nhiệm vụ của mình khi trả về 0 mục


2
nếu / Sensu vhost không tồn tại, kết quả là: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": []}
030
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.