2017-01-08 4 views
4

Я пытаюсь вставить вывод оболочки Linux в переменную, но по какой-то причине переменная всегда пуста.Ansible: вывод сценария оболочки всегда пустой

Вот код анзибль:

- name: Check PHP version 
    shell: php -v 2> /dev/null | awk '{print $2; exit}' 
    register: php_version 

    - debug: var=php_version 

А вот выход:

ok: [10.0.0.5] => { 
    "php_version": { 
     "changed": true, 
     "cmd": "php -v 2> /dev/null | awk '{print $2; exit}'", 
     "delta": "0:00:00.015180", 
     "end": "2017-01-08 18:41:00.323773", 
     "rc": 0, 
     "start": "2017-01-08 18:41:00.308593", 
     "stderr": "", 
     "stdout": "", 
     "stdout_lines": [], 
     "warnings": [] 
    } 
} 

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

php -v 2> /dev/null | awk '{print $2; exit}' 
7.0.14 

В чем может быть проблема?

+1

Я не могу воспроизвести эту проблему. Я скопировал ваши пьесы и побежал на обоих ansible 2.0.1.0 на macos и ansible 2.3.0 на ubuntu, и я правильно понял stdout на обоих. –

+0

Я тоже не могу воспроизвести. Когда вы запускаете команду непосредственно на сервере, используете ли вы одного пользователя и shell '/ bin/sh', который использует Ansible? – Zlemini

+0

No. Ansible работает с другим пользователем с указанного сервера. – Omri

ответ

3

Что касается возможных причин, почему вы можете запустить команду из CLI, но не анзибль, скорее всего, путь к php исполняемым не определен в переменной PATH при запуске оболочки через неинтерактивный SSH сессию * (как Ansible).

Используйте полный путь вместо php в аргументе модуля shell.


Что может быть проблема?

Как вы используете трубопровод в вызове оболочки, код возврата будет то, что из последней команды (awk) и хотя первый один сломается, вы не будете уведомлены.

Awk не получает никакого ввода для обработки, и он прекращает изящество, и поскольку вы перенаправляете stderr на /dev/null, вы не видите никаких ошибок из команды php.

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

- name: Check PHP version 
    shell: qwerty -v 2> /dev/null | awk '{print $2; exit}' 
    register: php_version 

- debug: var=php_version 

вы также получите:

"rc": 0, 
"start": "2017-01-09 06:35:10.588258", 
"stderr": "", 
"stdout": "", 
"stdout_lines": [], 
"warnings": [] 

* См Difference between Login Shell and Non-Login Shell? вопрос о Unix.SE.

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