Ansible에서 Puppet의 'unless'에 해당하는 것은 무엇입니까?


9

배경 : Puppet에서는 명령 이 이미 실행 되지 않은 경우 명령을 실행할 수 있습니다 .

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

목표 : Ansible에서 이미 실행되지 않은 경우 명령 실행

행동 양식

tasks / main.yml

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

결과

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

토론

인터넷 검색 unless ansible나타났다 에 대한이 문서를when . 해당 문서를 기반으로 when진술이 추가되었습니다.

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

코드를 실행 한 결과 :

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. 우선, 이것이 when성공 했다고 가정 하면 명령이 실행되지 않고 onlyifPuppet에서 더 비슷하게 보입니다 .
  2. 두 번째로, 언제 성공할 수 있는지 여부를 시뮬레이션하기 위해 에스컬레이션 마크를 사용해야합니까?
  3. 의 사용register . 해당 파일이 유실되거나 사람과 같은 가상 호스트가 제거 된 경우 어떻게됩니까? 꼭두각시는 unless항상 명령을 실행하여 명령을 실행해야하는지 명확하게합니다.

답변:


9

나는 당신이 찾고있는 것이 이것이라고 생각합니다.

- 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"

다시 : # 3 register은 파일을 만들지 않습니다. rabbitmqctl list_vhostsvia 의 출력을 캡처하는 경우 register내용은 시스템의 현재 상태만큼 유효합니다.


3

문제는 선 when: rabbitmqctl list_vhosts | grep sensu이다. 여기서 bash를 사용할 수 없습니다.

rabbitmqctl list_vhosts | grep sensuwhen 절에 별도의 작업 을 넣고 결과를 등록해야합니다. not필터를 사용 하여 unless동작 을 수행 할 수 있습니다 .

이와 같은 것이 작동해야합니다.

- 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

Get rabbitmq vhosts.이 예에서는 항상 실행됩니다. add vhost sensu경우에만 문자열 sensu는 등록에 있지 않습니다 rabbitmq_vhosts.

자세한 내용은 조건부jinja 필터에 대한 설명서 를 참조하십시오.


문제가 지속됩니다 :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

흠, 아마 내 잘못이야 .stdout내 답변 이 누락 된 것 같습니다.
Henrik Pingel

0

when옵션은 Ansible 조건에 관한 한 유일한 것이다. 그러나 여기서 명령을 직접 정의 할 수는 없습니다. when은 Jinja 표현을 기대하며 Ansible 제어 호스트에서 평가됩니다. 따라서 먼저 결과를 가져 와서 등록하기 위해 작업을 실행해야합니다.

- 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_lines쉘 태스크가 리턴 한 모든 행의 배열입니다. 따라서 항목 수를 세고 0 항목이 반환 된 경우에만 작업을 실행할 수 있습니다


2
/ sensu vhost가 없으면 결과는 다음과 같습니다.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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.