Я собрал простой доступный скрипт для установки Rails 4.2.4, если версия rails еще не установлена.

---

- 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]
1
Richlewis 28 Окт 2015 в 14:38

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 для установки Rails (и других драгоценных камней ). Это будет автоматически обрабатывать идемпотентность, и в целом с Ansible лучше всегда использовать модули более высокого уровня, а не выкладывать их там, где это возможно.

Тогда ваша задача будет выглядеть примерно так:

---

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

В качестве дополнительного бонуса, даже если ваши командные задачи работали должным образом, если бы у вас была установлена ​​версия Rails, отличная от 4.2.4, ваша задача установки оставила бы ее как есть, а не повысила / понизила версию до указанной вами.

2
ydaetskcoR 28 Окт 2015 в 11:47

Выходные данные показывают, что условие работает правильно: первая задача завершилась неудачно, с rc == 1. Это означает, что вторая задача должна выполняться, и она выполняется.

Если у вас уже установлены направляющие, вам нужно выяснить, почему which rails не работает. Если запуск "which rails" вручную завершился успешно, попробуйте использовать shell: which rails.

2
jazmit 28 Окт 2015 в 11:47