Ansible не может отправить json переменную в вызове curl - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь отправить переменную json ({{parameter_var}}) в задание Jenkins из Ansible, используя вызов curl. Вот задача, которую я использую:

- name: Call Jenkins Job
  shell: curl -H "crumb:{{ response.json.crumb }}" '{{ jenkinshost }}/job/{{ jenkinsjob }}/buildWithParameters?token={{ jenkinstoken }}' --data-urlencode json='{"parameter": [{"name":"parameter", "value":\""{{ parameter_var }}"\"}]}'

Ошибка, которую я получаю:

             Syntax Error while loading YAML.\n  mapping values are not allowed in this context

Ansible говорит, что проблема:

           YAML thought it was looking for the start of a\nhash/dictionary and was confused to see a second "{".

Кажется, что вместо того, чтобы принимать {{parameter_var}} в качестве переменной, он пытается прочитать его как просто значение "{{parameter_var}}". Я попробовал несколько способов добавления или экранирования кавычек, но не могу понять, что ищет Ansible / YAML. Я просто неправильно добавляю свои кавычки или я просто не могу отправить переменную этим методом?

Я распечатал свой {{parameter_var}}. В этом нет ничего необычного, поэтому я не думаю, что это проблема:

{
    "msg": {
        "msg": "All items completed",
        "changed": false,
        "results": [
            {
                "content_length": "142", 
                 ...
            } ...
}

Цель, которую я пытаюсь достичь sh, - установить параметр "parameter" в Jenkins на значение { {parameter_var}}

Вот где я нашел синтаксис для отправки json Дженкинсу: https://wiki.jenkins.io/display/JENKINS/Remote+access+API

1 Ответ

1 голос
/ 24 марта 2020

В вашем вопросе есть много вопросов, требующих решения:

  • вы не должны использовать оболочку для curl, когда есть uri: модуль в ansible, предназначенном для этой цели
    • в связи с этим, вы исключили --fail из своего локона, так что ответ не-200 заставит shell: выйти из 0, что почти наверняка не то, что вы намеревались
  • вы не можете иметь символ :, за которым следует пробел в документе yaml, потому что именно так yaml определяет ключи в dict
  • , вы не должны пытаться строить вверх JSON с использованием шаблонов jinja2, лучше собрать структуру в dict или list и передать ее через | to_json, чтобы обеспечить правильное цитирование

Однако, если вы настаиваете именно на этом синтаксисе, вы можете исправить это с помощью небольшого редактирования:

- name: Call Jenkins Job
  shell: >-
     curl --fail -H "crumb:{{ response.json.crumb }}" 
     '{{ jenkinshost }}/job/{{ jenkinsjob }}/buildWithParameters?token={{ jenkinstoken }}'
     --data-urlencode json={{ json_data | to_json | quote }}
  vars:
    json_data:
      parameter:
      - name: "parameter"
        value: '{{ parameter_var }}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...