drno-reg
@drno-reg
см не кратко

Как передать контекст, в котором есть двойные кавычки на remote хост?

Сразу хотел бы оговориться, что да в ansible есть возможность сохранения контекста в файле на remote хосте

- hosts: "{{ TARGET_HOSTS }}"
  tasks:
    - name: create target file on target host
      copy:
        content: "{{ TARGET_FILE_CONTEXT }}"
        dest: "{{ TARGET_PATH_FILE }}"
        force: yes
        owner: "{{ TARGET_USERNAME }}"
        group: "{{ TARGET_USERGROUP }}"
        mode: "u=rwx,g=rx,o=rx"


но мне хотелось используя только

- hosts: "{{ TARGET_HOSTS }}"
  tasks:
    - name: execute shell script
      shell: "{{ SHELL_SCRIPT }}"


из jenkinsfile транслировать контекст типа

def CONSUL_HCL_FILE_CONTEXT(name,port,target_host){
def CONTEXT="""
service {
name = "${name}"
port = ${port}
enable_tag_override = false
tags = ["prometheus"]
check {
name = "${name}"
tcp = "${target_host}:${port}"
interval = "60s"
}
}
"""
return CONTEXT;
}


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

service {
name = "metrics_from_hive"
port = 8006
enable_tag_override = false
tags = ["prometheus"]
check {
name = "metrics_from_hive"
tcp = "remote-001:8006"
interval = "60s"
}
}


Вот такая попытка

deploy = sh(script: "ansible -m shell -a 'echo \"${CONSUL_HCL_FILE_CONTEXT("${project}","${port}","${target_host}")}\" | tee /etc/consul.d/${project}.hcl' ${prometheus_host}", returnStdout: true).trim() as String


приводит к тому, что

service {
name = metrics_from_hive
port = 8006
enable_tag_override = false
tags = [prometheus]
check {
name = metrics_from_hive
tcp = remote-001:8006
interval = 60s
}
}
  • Вопрос задан
  • 116 просмотров
Пригласить эксперта
Ответы на вопрос 1
saboteur_kiev
@saboteur_kiev Куратор тега bash
software engineer
Сложный пример, лень читать столько текста.
Но как минимум, вы не экранируете кавычки вообще. Как я понял,шлете ${CONSUL_HCL_FILE_CONTEXT... как есть, без изменений, а внутри лежат обычные кавычки. Естественно echo с ними не подружится в таком виде.
Разберитесь с экранированием ваших шаблонов.
На крайняк можно вообще кодировать весь файл в base64, передавать как строку, а там декодировать ее в файл.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы