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が成功した場合、コマンドは実行されずonlyif、Puppetのようになります。
  2. 次に、いつ成功するかをエスカレーションマークを使用して、notifyをシミュレートする必要がありますか?
  3. の使用register。そのファイルが失われた場合、またはvhostが人間などによって削除された場合はどうなりますか?Puppetは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"

Re:#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文字列の扇子が登録されていない場合にのみrabbitmq_vhosts

詳細については、条件ジンジャフィルターに関するドキュメントを参照してください。


問題が解決しない: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 16

0

whenオプションはAnsibleが条件に関するました唯一のものです。ただし、そこでコマンドを直接定義することはできません。whenJinja式を期待し、さらに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のバーチャルホストが存在しない場合には、その結果: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.