Присвоение переменной другой переменной в текущем списке / файле в Ansible - PullRequest
0 голосов
/ 20 марта 2019

У меня есть файл playbook.yml, который читает файлы инвентаризации, например, service_1.yml и service_2.yml. Мне нужно переназначить переменную ram_min и добавить некоторое число.

playbook.yml
---
- hosts: 127.0.0.1
  connection: local
  gather_facts: false
  tasks:
  - name: "Include var"
    set_fact:
      ram_list: "{{ ram_list | default([]) + [ lookup('file',item) | from_yaml ]}}"
    with_items:
      - service_1.yml
      - service_2.yml

  - debug:
      var: ram_list
...

service_1.yml
---
name: service_1
ram_min: 1024
ram_max: "{{ ( ram_min + 256 ) | int }}"
...

service_2.yml
---
name: service_2
ram_min: 2048
ram_max: "{{ ( ram_min + 256 ) | int }}"
...

В результате получаю:

TASK [debug] *********************************************
ok: [127.0.0.1] => {
    "ram_list": [
        {
            "name": "service_1",
            "ram_max": "{{ ( ram_min + 256 ) | int }}",
            "ram_min": 1024
        },
        {
            "name": "service_2",
            "ram_max": "{{ ( ram_min + 256 ) | int }}",
            "ram_min": 2048
        }
    ]
}

Хотелось бы увидеть:

TASK [debug] *********************************************
ok: [127.0.0.1] => {
    "ram_list": [
        {
            "name": "service_1",
            "ram_max": 1280,
            "ram_min": 1024
        },
        {
            "name": "service_2",
            "ram_max": 2304,
            "ram_min": 2048
        }
    ]
}

Подскажите, как мне решить эту проблему?

PS. Мне определенно нужно импортировать файлы инвентаризации, я делаю это через - "lookup ('file' .." "

UPDATE

playbook.yml
---
- hosts: 127.0.0.1
  connection: local
  gather_facts: false
  tasks:
  - name: "Include var"
    include_tasks:
      file: include_variables.yml
    with_filetree:
      - "{{ workspace_temp_dir }}"
    when:
      - app_list_temp.state == 'file'
      - app_list_temp.path.split('/')[0] in app | default(app_list_temp.path.split('/')[0])
      - not app_list_temp.path.split('/')[0] is match(exclude) | default([])
      - app_list_temp.path.split('/')[-1] == 'main.yml'
    loop_control:
      loop_var: app_list_temp
...

include_variables.yml
---
- name: "Include variable files to /"
  include_vars:
    file: "{{ app_list_temp.src }}"
- name: "Include variable files to /temp_list"
  include_vars:
    file: "{{ app_list_temp.src }}"
    name: temp_list
- name: "Combine variables to list"
  set_fact:
    app_list_combine: "{{ app_list_combine | default([]) + [ temp_list ] }}"
...

1 Ответ

0 голосов
/ 20 марта 2019

Проблема в том, что lookup ('file', item) не расширяет содержимое. include_vars необходимо. Следовательно, необходим цикл include_vars + set_fact , но зациклить блок невозможно. Единственное решение IMO - зациклить include_tasks . Игра ниже

- name: "Include var"
  include_tasks: create-ramlist.yml
  loop:
    - service_1.yml
    - service_2.yml
- debug:
    var: ram_list

с

create-ramlist.yml
---
- include_vars: "{{ item }}"
- set_fact:    
    ram_list: "{{ ram_list | default([]) + [ {'name': name,
                                              'ram_max': ram_max,
                                              'ram_min': ram_min} ] }}"
...

дает:

"ram_list": [
    {
        "name": "service_1", 
        "ram_max": "1280", 
        "ram_min": 1024
    }, 
    {
        "name": "service_2", 
        "ram_max": "2304", 
        "ram_min": 2048
    }
]
...