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

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
1
Priyanka 28 Май 2019 в 09:07

2 ответа

Лучший ответ

Как объясняется в debug документации модуля, { Параметр {X1}} ожидает имя переменной, а не скаляр для вывода. Вы получаете ошибку, потому что \ не ожидается в имени переменной. Запуск 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
1
Zeitounator 28 Май 2019 в 06:37

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

- 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\$'
0
Vladimir Botka 28 Май 2019 в 09:56