如果尚未安装某个版本的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]
答案 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
。