2015-12-23 3 views
2

Я использую ansible в качестве инструмента для оркестровки системы. Прежде всего, позвольте мне описать мою конечную цель.Группировка нескольких заданий под одним условием

Я хочу создать playbook или два, которые пойдут захват solr из Интернета, настройте себя, а затем запустите индекс, основанный на некоторой конфигурации. Если что-то из этого до сих пор звучит подозрительно, пожалуйста, остановите меня здесь.

Теперь я не хочу захватывать solr tarball, если мне это не нужно, поэтому у меня сейчас есть задача/игра, которая выглядит так.

- stat: path="path to solr home/solr/bin/init script" 
    register: solr_script 

- name: getting solr 
    when: solr_script.stat.exists == False 
    shell: mkdir -p "path to download dir" 
    get_url: url="download url" dest= "path to download dir" 
    shell: tar zxvf "path to download dir/tgz file" -C "path to solr home" 
    shell: rm -rf "path to download dir" 

- name: start solr 
    shell: "path to solr home/solr/bin/solr init script" start 
    sudo: yes 

Я пытаюсь проверить, был ли уже запущен скрипт инициализации solr, прежде чем идти и хватать его.

Когда я запустил этот сценарий, как есть, я получаю ошибку,

multiple actions specified in task: 'shell' and 'getting solr' 

Это кажется разумным иш, возможно форматирование не так? Я пробовал это

- name: getting solr 
    when: solr_script.stat.exists == False 
     shell: mkdir -p "path to download dir" 
     get_url: url="download url" dest= "path to download dir" 
     shell: tar zxvf "path to download dir/tgz file" -C "path to solr home" 
     shell: rm -rf "path to download dir" 

Получил ошибку синтаксиса.

На дополнительной странице документации я вижу этот бит информации.

Note that if you have several tasks that all share the same conditional statement, you can affix the conditional to a task include statement as below. All the tasks get evaluated, but the conditional is applied to each and every task: 

Это похоже на то, что мне нужно.

Но затем они следуют этому примеру.

- include: tasks/sometasks.yml 
    when: "'reticulating splines' in output" 

Я действительно не понимаю «включить», и этот пример, похоже, не иллюстрирует то, что я хочу. Итак, если мои первоначальные предположения верны, и это действительно то, как я хотел бы получить получение solr, как бы я написал бы важную задачу, которая условно выполнила бы группу задач.

ответ

0

Это не относится:

- name: getting solr 
    when: solr_script.stat.exists == False 
    shell: mkdir -p "path to download dir" 
    get_url: url="download url" dest= "path to download dir" 
    shell: tar zxvf "path to download dir/tgz file" -C "path to solr home" 
    shell: rm -rf "path to download dir" 

Задача состоит из имени (по желанию), одна задача/модуль и модификаторы, как when, with и т.д. Вы не можете иметь более одной задачи (в этом случае shell & get_url) в задаче. Так что вам нужно разбить это вниз на несколько задач:

- name: make solr directory 
    file: path=/path/to/download/dir" 
     state=directory 

- name: download solr 
    get_url: url=<url> dest=/path/to/download/dir 

- name: unpack solr 
    shell: tar xvzf ... 

И так далее ...

условно выполнить ряд задач, которые вы можете сделать несколько вещей:

  1. Вы можете использовать оператор include, как вы упомянули в своем вопросе, что позволит применить условное условие ко всем задачам внутри этого файла include.

  2. Вы можете создать роль, которая выполняет все задачи, и снова использовать условное выражение для ее вызова (или просто применить роль к хостам и т. Д.).что вы хотите применить эту роль)

  3. Вы можете добавить when к каждой вашей задаче индивидуально.

  4. Вы можете использовать параметры для shell и других модулей, таких как creates или removes, которые будут смотреть на наличие или отсутствие файла, с помощью которого определить, является ли или не выполнить задачу.

+0

благодарит за любезный совет. В основном я просто придерживался той же «когда» оговорки по всем моим задачам, которые чувствовали себя взломанными, но в итоге работали. Я не знал о создании/удалении, хотя, похоже, делает то, что я хочу, без дополнительной проверки, чтобы увидеть, существует ли файл. Принимая ответ, ваш список должен помочь другим. – Zack

5

В анзибле 2.0 это можно так:

- block: 
    - shell: mkdir -p "path to download dir" 
    - get_url: url="download url" dest= "path to download dir" 
    - shell: tar zxvf "path to download dir/tgz file" -C "path to solr home" 
    - shell: rm -rf "path to download dir" 
    when: solr_script.stat.exists == False 

Надеется, что это поможет.

+0

Возможно с возможностью использования <= 1.9, используя – radtek

0

Для устранения 2.x используйте другой принятый ответ. Вы можете использовать ansible 1.9.x для этого, используя инструкцию include.

Сначала создайте два .yml файлов для этого, main.yml и solr.yml в вашем текущем каталоге ролей.

Ваш main.yml должен выглядеть следующим образом:

- stat: path="path to solr home/solr/bin/init script" 
    register: solr_script 

- include: solr.yml 
    when: solr_script.stat.exists == False 

В solr.yml файле есть все задачи, которые вы хотите выполнить для включения условия в вашем main.yml:

- shell: mkdir -p "path to download dir" 
- get_url: url="download url" dest= "path to download dir" 
- shell: tar zxvf "path to download dir/tgz file" -C "path to solr home" 
- shell: rm -rf "path to download dir" 

еще на include statements. Надеюсь, это имеет смысл, Cheers!

Смежные вопросы