#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 и «классический» синтаксис. Лучший способ понять это-тоже попробовать.