0

Я знаю об окружающей среде Ansible: команда в верхней части playbook, но я не думаю, что это будет работать для меня, видя, как я не знаю значения переменных до исполнения playbook. Я пытаюсь получить версии пакетов и модули PHP и зарегистрировать их в файле. Я хочу использовать regex для захвата версии и сохранения ее в переменной среды. Затем я хочу написать, что переменная равна значению переменной для файла среды с помощью команды оболочки. Я также хочу вытащить массив из среды и пройти через это. Ansible, похоже, не сохраняет среду оболочки, а переменная среды обрывается между командами. Это просто в Баше. Возможно ли это в Ansible? Я пытаюсь:Ansible Set Динамические переменные окружения

--- 
- hosts: all 
    become: yes 
    vars: 
     site_variables: 
      code_directory: /home/ 
     dependency_versions: 
      WGET_VERSION: placeholder 
      PHP_MODULES: placeholder 

    tasks: 
    - name: Retrieve Environment 
     shell: export WGET_VERSION=$(wget --version | grep -o 'Wget [0-9]*.[0-9]*\+') 
     shell: export PHP_MODULES=$(php -m) 
     shell: echo "export {{ item }}={{ lookup('env', item) }}" >> {{ site_variables.code_directory }}/.env.log 
     with_items: 
     - WGET_VERSION 


    - name: Write PHP Modules Out 
     shell: export PHP_MODULES=$(php -m) 
     shell: export PHP_MODULES=$(echo {{ lookup('env', 'PHP_MODULES') }} | sed 's/\[PHP Modules\]//g') 
     shell: export PHP_MODULES=$(echo {{ lookup('env', 'PHP_MODULES') }} | sed 's/\[Zend Modules\]//g') 
     shell: export PHP_MODULES=({{ lookup('env', 'PHP_MODULES') }}) 
     shell: echo "# - {{ item.0 }}" >> {{ site_variables.code_directory }}/.env.log 
     with_items: 
     - "{{ lookup('env', 'PHP_MODULES') }}" 

ответ

2

Здесь многое происходит.

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

Для получения дополнительной информации: https://docs.ansible.com/ansible/playbooks_lookups.html

Во-вторых, переменные окружения не распространяются от ребенка к родителю. Если у вас есть скрипт, который делает это ...

export MYVARIABLE=foo 

... и запустить этот сценарий, текущая среда не будет внезапно иметь переменную с именем MYVARIABLE. Это справедливо и для процессов, порожденных Ansible, так же как для процессов, порожденных вашей оболочкой.

Если вы хотите установить анзибль переменных, рассмотреть вопрос об использовании register ключевого слова, чтобы получить значение:

- hosts: localhost 
    gather_facts: false 
    tasks: 
    - name: get wget version 
     command: wget --version 
     register: wget_version_raw 

    - name: extract wget version 
     set_fact: 
     wget_version: "{{ wget_version_raw.stdout_lines[0].split()[2] }}" 

    - name: show wget version 
     debug: 
     msg: "wget version is: {{ wget_version }}" 
+0

Не уверен, что если я после вас полностью. Я отправился на удаленный хост и вручную установил WGET_VERSION ... так, скажем, WGET_VERSION = 1.1.1. {{lookup ('env', item)}} фактически вытащил переменную окружения из remote_host, которую я установил вручную (1.1.1), и выполнил его правильную запись. Он просто не устанавливал новое значение через Ansible в shell: export WGET_VERSION = $ (wget -version | grep -o 'Wget [0-9] *. [0-9] * \ +'). Мне, вероятно, просто нужно подумать об этом больше, так как мне определенно нужно кормить все через массив в конце. Возможно, Ansible просто не способ сделать это. – Nabsta

+0

Большое спасибо за ваш совет! Я новичок в Ansible, и это определенно полезно. – Nabsta

+0

Еще раз спасибо! Я получил его работу с помощью set_fact, набора параллельных массивов и экранированных операторов regex. Похоже, что в этом случае прямолинейный bash является более подходящим и более чистым: P. – Nabsta

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