2017-01-10 14 views
1

У меня проблема с командой оболочки в моем сценарии Ansible. Эта команда оболочки не работает должным образом в скрипте, в то время как она отлично работает непосредственно на сервере.Escape characters in Ansible script

Вот проблемный код:

- name: export keys 
    shell: "export NR_INSTALL_PATH=$(which php | sed 's/\/php$//g') ; export NR_INSTALL_KEY='somekey'; export NR_INSTALL_SILENT=1; newrelic-install install" 

После того как я исследовал этот вопрос, я заметил, что проблемная часть:

which php | sed 's/\/php$//g' 

Этот код предполагают, чтобы получить путь к исполняемому файлу РНР, и удалите последний каталог из пути. Вместо ожидаемого результата я получаю только первый каталог пути (/bin).

  • Эта проблема связана с символами эвакуации? Может кто-нибудь сказать мне, как это исправить?
  • У меня есть больше символов из исходной команды, которые мне нужно убежать?
  • Есть ли способ распечатать команду bash, которая фактически была получена сервером? (Вот как я смогу узнать, что было изменено из исходной команды).
+0

Что такое вывод 'which php'? –

+0

У меня есть несколько выходов. Это зависит от дистрибутивов пакетов. – Omri

ответ

1

Этот синтаксис должен работать:

- name: export keys 
    shell: 'export NR_INSTALL_PATH=$(which php | sed "s/\/php$//g") ; export NR_INSTALL_KEY="somekey"; export NR_INSTALL_SILENT=1; newrelic-install install' 

Например:

- set_fact: 
    php_path: /usr/bin/php 

- shell: 'export NR_INSTALL_PATH=$(echo {{ php_path }} | sed "s/\/php$//g") ; echo $NR_INSTALL_PATH' 
    register: result 

- debug: var=result.stdout 

возвращается:

TASK [debug] ******************************************************************* 
ok: [localhost] => { 
    "result.stdout": "/usr/bin" 
} 

Есть ли способ распечатать команду bash, которая фактически была получена сервером?

Не является анзибль путь (потому что он не обращает внимания на то, как оболочка интерпретирует команду), но вы можете запустить оболочку с -x опция включена:

- command: /bin/bash -x -c 'export NR_INSTALL_PATH=$(echo {{ php_path }} | sed "s/\/php$//g") ; echo $NR_INSTALL_PATH' 
    register: result 

- debug: var=result.err 

И вы получите полный след в журнал.

Уведомление: вы спрашивали о «bash», но это необязательно должно быть bash - Ansible может запустить /bin/sh по умолчанию.