有条件的

时间:2015-10-28 11:38:42

标签: ansible ansible-playbook

如果尚未安装某个版本的rails,我已经安装了一个简单的ansible脚本来安装Rails 4.2.4

---

- name: detect rails version
  command: which rails
  register: rails_version
  ignore_errors: yes

- name: install rails
  command: gem install rails -v 4.2.4
  when: rails_version.rc != 0

但是当运行此任务时,即使已经安装了Rails,它似乎也会安装。这是输出:

TASK: [rails | detect rails version] ******************************************
failed: [192.168.33.100] => {"changed": true, "cmd": ["which", "rails"], "delta": "0:00:00.002084", "end": "2015-10-28 11:35:14.421897", "rc": 1, "start": "2015-10-28 11:35:14.419813", "warnings": []}
...ignoring

TASK: [rails | install rails] *************************************************
changed: [192.168.33.100]

PLAY RECAP ********************************************************************
192.168.33.100             : ok=3    changed=2    unreachable=0    failed=0

这是否意味着条件被忽略了,因为我期望输出更像:

TASK: [rails | install rails] **********************************
skipped: [192.168.33.100]

2 个答案:

答案 0 :(得分:2)

您的which rails命令返回非0返回代码,如输出中所示:

TASK: [rails | detect rails version] ******************************************
failed: [192.168.33.100] => {"changed": true, "cmd": ["which", "rails"], "delta": "0:00:00.002084", "end": "2015-10-28 11:35:14.421897", "rc": 1, "start": "2015-10-28 11:35:14.419813", "warnings": []}
...ignoring

所以显然Ansible将运行你的第二个任务,因为你的条件显然是在返回代码不为0时运行。

对于这个用例,我会考虑使用gem module来安装Rails(以及其他宝石)。这将自动处理幂等性,一般来说,Ansible总是使用更高级别的模块,而不是尽可能地使用它。

你的任务看起来像这样:

---

- name: install rails
  gem:
    name: rails
    version: 4.2.4

作为额外的奖励,即使您安装了非4.2.4版本的Rails,基于命令的任务也按预期工作,那么您的安装任务将保留原样而不是升级/降级版本以匹配您的指定的。

答案 1 :(得分:2)

输出显示条件正常工作:第一个任务失败,rc == 1。这意味着第二个任务应该运行,而且确实如此。

如果您已经安装了rails,则需要调试which rails失败的原因。如果正在运行'哪个导轨'手动成功,尝试使用shell: which rails