Извлеките элементы из списка и установите для него значение переменной (set_fact).

#list #loops #ansible

Вопрос:

Я передаю следующий список в свой скрипт в качестве дополнительного параметра

 ansible-playbook /home/ec2-user/ansible/start.yml --extra-vars  multi_config=['aa|111','bb|222','cc|444']
 

Это единственный способ, который я нашел для передачи переменных, содержащих список или ключ/значения (с | разделителем), и я не могу использовать файл json в качестве аргумента…

Я хотел бы зациклить этот multi_config список и найти элемент, содержащий «bb», и установить его в переменную, set_fact чтобы использовать его позже.

Я могу загрузить список следующим образом:

 - name: set multi_config
  set_fact:
    multi_config: "{{ multi_config}}"
  when: multi_config is defined
 

Но как я могу извлечь элемент, содержащий «bb»?

Ответ №1:

Дополнительные переменные, передаваемые Ansible из командной строки, всегда являются строками, например

     - debug:
        msg: "{{ multi_config|type_debug }}"
 

дает

   msg: str
 

Используйте фильтр from_yaml, преобразуйте строку в список и повторите элементы. Существует множество вариантов того, как анализировать данные. Например, разделите ключи и значения и объедините словарь

     - set_fact:
        mc_dict: "{{ mc_dict|default({})|combine({_key: _val}) }}"
      loop: "{{ multi_config|from_yaml }}"
      vars:
        _key: "{{ item.split('|').0 }}"
        _val: "{{ item.split('|').1 }}"
 

дает

   mc_dict:
    aa: '111'
    bb: '222'
    cc: '444'
 

Ответ №2:

На самом деле существует гораздо лучший способ передать вашу информацию в качестве --extra-vars встроенного json

 $ ansible localhost -m debug -a "msg={{ multi_config | type_debug }}" 
    -e '{"multi_config":{"aa":111,"bb":222,"cc":444}}'
localhost | SUCCESS => {
    "msg": "dict"
}

$ ansible localhost -m debug -a var=multi_config 
    -e '{"multi_config":{"aa":111,"bb":222,"cc":444}}'
localhost | SUCCESS => {
    "multi_config": {
        "aa": 111,
        "bb": 222,
        "cc": 444
    }
}

$ ansible localhost -m debug -a "msg={{ multi_config.cc }}" 
    -e '{"multi_config":{"aa":111,"bb":222,"cc":444}}'
localhost | SUCCESS => {
    "msg": "444"
}
 

Комментарии:

1. могу ли я передать встроенные параметры json и ordenary key=val ? ( так как все параметры key=value уже используются в сборнике пьес

2. Вы можете передать все в том же json или передать несколько дополнительных параметров vsrr в одной командной строке, смешивая json и «классический» синтаксис. Лучший способ понять это-тоже попробовать.