2015-01-02 3 views
3

Я хочу, чтобы определить анзибль роль и регистрации динамических переменных:Как динамически регистрировать переменные с помощью Ansible?

--- 
- name: Check for {{ package }} 
    stat: path=/opt/packages/{{ package }} 
    register: "{{ package | regex_replace('-', '_') }}" 
- name: Install {{ package }} {{ package_version }} 
    command: "custom-package-installer {{ package }} {{ package_version }}" 
    when: "not {{ package | regex_replace('-', '_') }}.stat.exists" 

Использование выглядит следующим образом:

- include: install_package.yml package=foo package_version=1.2.3 

Однако анзибль не признает условное:

TASK: [example | Install foo 1.2.3] *********************************** 
fatal: [my-server] => error while evaluating conditional: not foo.stat.exists 

FATAL: all hosts have already failed -- aborting 

Как я могу определить переменные динамически, расширяя {{}}?

+0

http://stackoverflow.com/questions/29512443/register- dynamic-variable-names-in-ansible-playbook – pcrews

ответ

4

Невозможно зарегистрировать динамическую переменную. В регистре нет места для замещающего {{ var }}. Однако существует гораздо более чистый способ выполнить то, что, как я думаю, вы пытаетесь достичь: Ansible: it's a fact.

Краткое резюме:

Вы можете написать простой скрипт, который печатает JSON как:

#!/bin/python #or /bin/bash or any other executable 
.... 

print """{ "ansible_facts": { 
       "available_packages": ["a", "b", "c"] 
       } 
      }""" 

и положить его в ваши местные факты папку на компьютере (в виде исполняемого скрипта с .fact окончание):

Your second task would then look like: 

- name: Install {{ package }} {{ package_version }} 
    command: "custom-package-installer {{ package }} {{ package_version }}" 
    when: "not package in ansible_facts['available_packages']" 

Ansible docs on facts.

0

Как и многие вещи, это возможно, если вы действительно хотите это сделать, но из-за невозможности он не поддерживается.

Тем не менее, ansible написан на языке python, и вы можете вызывать плейбуки непосредственно из кода python. Способ, которым я это делаю, - динамически генерировать проигрыватели, а затем выполнять их в двухэтапном процессе.

Фактически, это похоже на динамические проигрыватели. Итак, подведем итог ...

  1. Сгенерировать playbook используя любую логику.
  2. Выполнить playbook используя возможность.
2

Вам не нужно динамической переменной в этом случае делать:

--- 
- name: Check for {{ package }} 
    stat: path=/opt/packages/{{ package }} 
    register: current_package 

- name: Install {{ package }} {{ package_version }} 
    command: "custom-package-installer {{ package }} {{ package_version }}" 
    when: not current_package.stat.exists 

прекрасно подходит ...

+0

Работает ли это, даже если есть несколько пакетов пакета? – pjz