Ansible PLaybook: Escape '$' в пути Linux

У меня есть путь, который выглядит так -

base_dir/123/path/to/G\$/subdirectory/html/

Когда я пытаюсь установить этот путь в Ansible playbook, он выдает ошибку. Если добавить \$ вместо '\', выдается непредвиденная ошибка сбоя.

Playbkook -

- hosts: localhost
  vars:
    account_id: 123
  tasks:
  - name: Add \ to path
    debug:
      var: "base_dir/{{ account_id }}/path/to/G\\$/subdirectory/html/"

Результат -

TASK [Gathering Facts] *************************************************************************************************************************************************
task path: /playbooks/example_path.yml:2
ok: [localhost]
META: ran handlers

TASK [Add \ to path] ***************************************************************************************************************************************************
task path: /playbooks/exmaple_path.yml:6
fatal: [localhost]: FAILED! => {
    "msg": "Unexpected failure during module execution."
}

PLAY RECAP *************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=1
Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
1
0
86
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как объясняется в документации модуля debug, параметр var ожидает имя переменной, а не скаляр для вывода. Вы получаете сообщение об ошибке, потому что \ не ожидается в имени переменной. Запуск playbook с -vvv даст вам немного больше объяснений.

В этом случае вам нужно использовать опцию msg.

- hosts: localhost
  gather_facts: false
  vars:
    account_id: 123
  tasks:
    - name: Add \ to path
      debug:
        msg: "base_dir/{{ account_id }}/path/to/G\\$/subdirectory/html/"

Результат

PLAY [localhost] ***************************************************************

TASK [Add \ to path] ***********************************************************
ok: [localhost] => {
    "msg": "base_dir/123/path/to/G\\$/subdirectory/html/"
}

PLAY RECAP *********************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Следующий вариант — использовать Стиль с одинарными кавычками. См. пример ниже

- hosts: localhost
  vars:
    my_dir1: "/scratch/tmp/G1\\$"
    my_dir2: '/scratch/tmp/G2\$'
  tasks:
    - file:
        state: directory
        path: "{{ item }}"
      loop:
        - "{{ my_dir1 }}"
        - "{{ my_dir2 }}"

# ls -1 /scratch/tmp/
'G1\$'
'G2\$'

Другие вопросы по теме