Модуль Ansible Command говорит, что '|' является незаконным персонажем
Я использую Ansible для развертывания моего проекта, и я пытаюсь проверить, установлен ли указанный пакет, но у меня проблема с ним, вот задача:
- name: Check if python-apt is installed
command: dpkg -l | grep python-apt
register: python_apt_installed
ignore_errors: True
И вот проблема:
$ ansible-playbook -i hosts idempotent.yml
PLAY [lxc-host] ***************************************************************
GATHERING FACTS ***************************************************************
ok: [10.0.3.240]
TASK: [idempotent | Check if python-apt is installed] *************************
failed: [10.0.3.240] => {"changed": true, "cmd": ["dpkg", "-l", "|", "grep", "python-apt"], "delta": "0:00:00.015524", "end": "2014-07-10 14:41:35.207971", "rc": 2, "start": "2014-07-10 14:41:35.192447"}
stderr: dpkg-query: error: package name in specifier '|' is illegal: must start with an alphanumeric character
...ignoring
PLAY RECAP ********************************************************************
10.0.3.240 : ok=2 changed=1 unreachable=0 failed=0
Почему этот символ не соответствует этому символу '|'.
Ответы
Ответ 1
Я не знаком с Ansible
, но из сообщения об ошибке |
фактически передается как аргумент dpkg
и не интерпретируется как канал между процессами. Вероятно, Ansible не выполняет команду через оболочку. Поэтому вы должны явно запросить его.
Я точно не знаю, как это сделать, попробуйте один из них:
command: bash -c "dpkg -l | grep python-apt"
или
command: bash -c 'dpkg -l | grep python-apt'
Если оба отказали, у вас все еще есть возможность поместить команды в оболочку script и использовать эту script в вашей команде...
EDIT: Из документа:
команда - выполняет команду на удаленном node
Модуль команды принимает имя команды, за которым следует список аргументы с пространственным разделением. Данная команда будет выполнена на всех выбранных узлов. Он не будет обрабатываться через оболочку, поэтому переменные типа $HOME и операции типа "<", " > ", "|" и "&". будем не работает (используйте модули оболочки, если вам нужны эти функции).
shell - выполняет команды в узлах
Модуль оболочки принимает имя команды, за которым следует список аргументов, разделенных пробелами. Это почти так же, как командный модуль, но выполняет команду через оболочку (/bin/sh) на пульте дистанционного управления node.
Вам, вероятно, придется использовать shell: dpkg -l | grep python-apt
Все еще задаюсь вопросом, сработало бы мое первоначальное предположение (bash -c "..."
)...
Ответ 2
читайте о командном модуле в документации Ansible:
Он не будет обрабатываться через оболочку, поэтому... операции типа "<", " > ", "|" и "&" не будет работать
Как он рекомендует, используйте оболочный модуль:
- name: Check if python-apt is installed
shell: dpkg -l | grep python-apt
register: python_apt_installed
ignore_errors: True
Для чего вы можете проверить/подтвердить установку в среде debian с помощью команды apt
:
- name: ensure python-apt is installed
apt: name=python-apt state=present