Как можно зацикливать элементы в качестве входных параметров на роль - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь преобразовать существующую сборную плейбука (для извлечения содержимого веб-страницы из нескольких URL-адресов веб-страницы параллельно) в повторно используемые роли.Мне нужна роль, чтобы принимать переменные в цикле и производить вывод для всех элементов в одной задаче, которую может выполнять мой текущий playbook.Но текущая роль способна только выводить последний элемент в цикле

Я пытался зарегистрировать содержимое веб-страницы внутри и вне ролей, но безрезультатно.А также зацикливание результатов ответа with_items так же, как и для роли, приводит к получению результатов для значений, отличных от 200

К вашему сведению Я получил ожидаемый результат, включив цикл в роль, но он побеждает цель поддержанияроль для вызова GET, потому что мне не понадобится цикл каждый раз для вызова GET.Поэтому я ожидаю зациклить роль в testplaybook.yml.

Test-Role: main.yml

  uri: 
    url: "{{ URL_Variable }}"
    method: GET
    status_code: 200
    return_content: yes
  register: response
  ignore_errors: true

testplaybook.yml:

- hosts: localhost
  gather_facts: true
  tasks:  
    - name: Include roles
      include_role:
        name: Test-Role
      vars:
        URL_Variable: "http://{{ item }}:{{ hostvars[groups['group1'][0]]['port'] }}/{{ hostvars[groups['group1'][0]]['app'] }}/"
      with_items: "{{ groups['group1'] }}"

    - name: "Display content"
      debug:
        var: response.results

Ожидаемый результат:

response.results:

ok: [127.0.0.1] => (item=[0, 'item1']) => {
    "ansible_loop_var": "item",
    "item": [
        0,
        "item1"
    ],
    "response": {
        "accept_ranges": "bytes",
        "changed": false,
        "connection": "close",
        "content": "content1",
        "content_length": "719",
        "content_type": "text/html",
        "cookies": {},
        "failed": false,
        "msg": "OK (719 bytes)",
        "redirected": false,
        "server": "42",
        "status": 200,
        "url": "http://item1:port/app/"
    }
}
ok: [127.0.0.1] => (item=[1, 'item2']) => {
    "ansible_loop_var": "item",
    "item": [
        1,
        "item2"
    ],
    "response": {
        "accept_ranges": "bytes",
        "changed": false,
        "connection": "close",
        "content": "content2",
        "content_length": "719",
        "content_type": "text/html",
        "cookies": {},
        "failed": false,
        "msg": "OK (719 bytes)",
        "redirected": false,
        "server": "42",
        "status": 200,
        "url": "http://item2:port/app/"
    }
}

1 Ответ

0 голосов
/ 07 июня 2019

попробуйте этот Test-Role: main.yml файл:

- uri: 
    url: "{{ URL_Variable }}"
    method: GET
    status_code: 200
    return_content: yes
  register: response
  ignore_errors: true

- name: Add response to responses array
  set_fact:
    responses_results: "{{ responses_results | default([]) + [{'URL': URL_Variable, 'response': response.content}] }}"

это работает с include_tasks, я предполагаю, что это будет работать и с include_role, переменная responses_results должна сохраняться в разных ролях, предполагая, что она в той же игре. если не работает, попробуйте вместо этого переключить свой код на одну роль с include_tasks.

надеюсь, это поможет

...