LINUX.ORG.RU
ФорумAdmin

Передача параметров в ansible-playbook

 


0

2

Есть такой скриптец который считывает с токена и передает на удаленный комп контейнер с эцп крипто-про.

cat xxx.sh

#!/bin/sh
cont_name='\\.\Aktiv Co. Rutoken S 00 00\ab70d299-d9b0-4e2b-8cdc-f919540f20e9'
echo "cont_name: "$cont_name
cont_name2='\\.\HDIMAGE\1'
echo "cont_name2: "$cont_name2
/opt/cprocsp/bin/amd64/csptest -keycopy -pinsrc 12345678 -contsrc "$cont_name" -contdest "$cont_name2" -pindest 12345678
ansible-playbook -s /etc/ansible/playbooks/transfer_ecp_cont.yml -i /etc/ansible/all -e "var1=$cont_name" -e "var2=$cont_name2"

Собственно текст playbook-а ansible, которому передаются имена контейнеров исходного и приёмного, чтобы на удаленной машине записать контейнеры назад на токен.

cat transfer_ecp_cont.yml

# Переброска контейнеров с эцп на удаленный токен
---
- name: transfer
  hosts: all
  vars:
       cont1: "{{var1}}"
       cont2: "{{var2}}"
  tasks:
     - name: Print Container1
       debug:
         msg: "cont1:{{ cont1 }}"
     - name: Print Container2
       debug:
         msg: "cont2:{{ cont2 }}"
     - name: Запускаем update.sh
       shell: "/opt/cprocsp/bin/amd64/csptest -keycopy -pinsrc 12345678 -contsrc {{ cont2 }} -contdest {{ cont1 }} -pindest 12345678"

На выходе имеем:

...
PLAY [transfer template] ********************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************
ok: [192.168.1.35]

TASK [Print Conteiner1] *********************************************************************************************************************************************************
ok: [192.168.1.35] => {
    "msg": "cont1:\\.\\Aktiv Co. Rutoken S 00 00\f192b87c-0e1f-43c9-8b47-4ac397fb05be"
}

TASK [Print Conteiner2] *********************************************************************************************************************************************************
ok: [192.168.1.35] => {
    "msg": "cont2:\\.\\HDIMAGE\\1"
}
...

Проблема заключается в том, что некорректно передаются параметры (имена контейнеров) в ansible

Передаём: сont_name: \\.\Aktiv Co. Rutoken S 00 00\f192b87c-0e1f-43c9-8b47-4ac397fb05be сont_name2: \\.\HDIMAGE\1

Ansible получает: сont1:\\.\\Aktiv Co. Rutoken S 00 00\f192b87c-0e1f-43c9-8b47-4ac397fb05be" сont2:\\.\\HDIMAGE\\1"

Лишние «\» в первой переменной в одном месте, сразу перед Aktiv Co и во второй переменной в двух местах, перед HDIMAGE и после. Соответственно запись контейнеров назад на токен завершается с ошибкой, т.к. не верные имена.

Как бороться с данным косяком? Пробовал «экранировать» переменные по всякому, но результат отрицательный.


Зачем тебе лишние `vars` и `set_facts`, если `-e «var1=$cont_name»` и так установит этот факт?

vrutkovs ★★
()

кмк, проблема не в том что дублируются «\» - это внутреннее экранирование

Скорее проблема в том, что первые символы не получают экранирование (т.е. остаются «\\» вместо «\\\\»)

добавил в плейбук запись переменных в локальный файл:

- local_action: copy content="{{ cont1 }}\n{{ cont2 }}\n" dest="file"

получил:

TASK [print cont1] ******************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "cont1:\\.\\Aktiv Co. Rutoken S 00 00\u0007b70d299-d9b0-4e2b-8cdc-f919540f20e9"
}

TASK [print cont2] 
ok: [localhost] => {
    "msg": "cont2:\\.\\HDIMAGE\\1"
}

TASK [copy] 
changed: [localhost -> localhost]

PLAY RECAP 
localhost                  : ok=4    changed=1    unreachable=0    failed=0 

но

cat file
\.\Aktiv Co. Rutoken S 00 00b70d299-d9b0-4e2b-8cdc-f919540f20e9
\.\HDIMAGE\1
видно, что пропал 1 «\» вначале, а также \a сначала преобразовался в \u0007, а потом вообще потерялся

а вот если, например, занести переменные в файл (с одинарными кавычками)

cat vars.yml 
---
var1: '\\.\Aktiv Co. Rutoken S 00 00\ab70d299-d9b0-4e2b-8cdc-f919540f20e9'
var2: '\\.\HDIMAGE\1'
и запустить с -e «@vars.yml»
TASK [print cont1] 
ok: [localhost] => {
    "msg": "cont1:\\\\.\\Aktiv Co. Rutoken S 00 00\\ab70d299-d9b0-4e2b-8cdc-f919540f20e9"
}

TASK [print cont2] 
ok: [localhost] => {
    "msg": "cont2:\\\\.\\HDIMAGE\\1"
}
cat file
\\.\Aktiv Co. Rutoken S 00 00\ab70d299-d9b0-4e2b-8cdc-f919540f20e9
\\.\HDIMAGE\1
на выходе получается правильное значение

Думаю, нужно как-то от этого идти

CaHbl4
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.