Ansible ad-hoc командная команда оболочки внутри кавычек — как сбежать?

У меня есть довольно простая команда adhoc, использующая оболочку для запуска chfn:

ansible all -i ./inventory/all  -s -K -m shell -a 'chfn -f "$HOSTNAME root" root'

chfn нужны двойные кавычки, и я пробовал несколько разных способов избежать их, но безуспешно. Я пробовал заключать команду оболочки в двойные и одинарные кавычки, а также использовать / для выхода из двойных кавычек, а также пробовал использовать одинарные кавычки. Запуск chfn -f "$HOSTNAME root" root работает нормально, но я не могу понять, как заставить его запускаться таким образом. (Я знаю, что это вариант, но я бы предпочел не превращать его в сценарий оболочки и запускать его таким образом через ansible, если это возможно)


person Blake    schedule 15.05.2017    source источник


Ответы (2)


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

Сделайте окружающие кавычки одинарными кавычками ' , тогда вам не нужно экранировать двойные кавычки ", и вы можете избежать одинарных кавычек в своей команде с помощью другой одинарной кавычки, например ''

 - name: Notify on slack
    command: 'curl -X POST -H ''Content-type: application/json'' --data ''{"text":"{{inventory_hostname}} has been updated"}'' https://hooks.slack.com/services/XXXX/YYY/ZZZ'
    when: inventory_hostname == 'host1.de' or inventory_hostname == 'host.de'
    delegate_to: localhost
person Ralf Kramer    schedule 23.10.2018

ansible сложна в этом в специальных командах. если вы хотите передать его как есть, вам нужно избежать кавычек. несколько примеров ниже:

ansible localhost -a 'echo \"$HOSTNAME\"'
localhost | SUCCESS | rc=0 >>
"$HOSTNAME"

ansible localhost -a "echo $HOSTNAME"
localhost | SUCCESS | rc=0 >> 
my_hostname
person Steve Miskiewicz    schedule 09.01.2018