Ansible 可解条件

Ansible 可解条件,ansible,ansible-playbook,Ansible,Ansible Playbook,我编写了一个简单的ansible脚本,用于在尚未安装Rails版本的情况下安装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 但在运

我编写了一个简单的ansible脚本,用于在尚未安装Rails版本的情况下安装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]

您的
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时运行

对于这个用例,我会考虑使用安装Rails(和其他的GEM)。这将自动处理幂等性,通常使用Ansible时,最好的选择是始终使用更高级别的模块,而不是尽可能地使用

您的任务将如下所示:

---

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

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

您的
哪个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时运行

对于这个用例,我会考虑使用安装Rails(和其他的GEM)。这将自动处理幂等性,通常使用Ansible时,最好的选择是始终使用更高级别的模块,而不是尽可能地使用

您的任务将如下所示:

---

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

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

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


如果已经安装了rails,则需要调试为什么
哪些rails
出现故障。如果手动运行“which rails”成功,请尝试使用
shell:which rails

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


如果已经安装了rails,则需要调试为什么
哪些rails
出现故障。如果手动运行“which rails”成功,请尝试使用
shell:which rails

gem模块似乎是可行的,谢谢,似乎更干净。gem模块似乎是可行的,谢谢,似乎也更干净