#ansible #lxc
#ansible #lxc
Вопрос:
Я регистрирую переменную списка lxcs_info.results
в моем сборнике воспроизведения Ansible, который заполняется следующими данными, связанными с LXC:
ok: [webserver] => {
"lxcs_info": {
"changed": false,
"results": [
{
"_ansible_item_result": true,
"changed": false,
"invocation": {
"module_args": {
"name": "cndev",
"state": "started",
"template": "ubuntu",
},
"module_name": "lxc_container"
},
"item": {
"backing_store": "dir", ,
"container_config": [
"lxc.group = dev",
"lxc.group = mdblxc",
"lxc.network.type = veth",
"lxc.network.link = lxcbr0"
],
"name": "cndev",
"state": "started",
"template": "ubuntu",
},
"lxc_container": {
"interfaces": [
"eth0",
"lo"
],
"ips": [
"10.0.3.2"
],
"name": "cndev",
"state": "running"
}
},
{
# another result-item like the above
},
{
# yet another item with same structure as above
}
]
}
}
Поскольку меня в основном интересует container_config
-section, мне нужна задача, которая выполняет команду на основе состояния содержимого этих элементов, в частности, при условии, что содержимое в item.container_config точно lxc.group = mdblxc
.
Как я должен написать when
для него предложение -? Я попытался выполнить следующую задачу,
- name: Test task
debug: msg="Found mdblxc in {{ item }}"
with_items: lxcs_info.results
when: item.item.container_config.0.lxc.group == "mdblxc"
но это не работает — ansible-playbook завершается с ошибкой:
fatal: [webserver]: FAILED! => {
"failed": true,
"msg": "The conditional check '( item.item.container_config.0.lxc.group == "mdblxc")' failed.
The error was: error while evaluating conditional (( item.item.container_config.0.lxc.group == "mdblxc" ): 'unicode object' has no attribute 'lxc'
The error appears to have been in 'mytask.yaml': line nnn, column 3, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
with_items: lxcs_info.results
- name: Test task
^ here
"
}
Ответ №1:
Если вы обратите пристальное внимание container_config
, вы заметите, что это список строковых элементов.
Вы не можете получить доступ lxc.group
к строке "lxc.group = mdblxc"
.
Итак, ваше when
утверждение должно выглядеть так:
when: '"lxc.group = mdblxc" in item.item.container_config'
Комментарии:
1. Спасибо @konstantin-suvorov за ваш правильный ответ! Я заметил, что список yaml / json содержит эти строковые элементы глубоко в структуре, но не нашел способа настроить их таргетинг на операции сравнения в задачах, но теперь ваш A работает, и в моем учебнике я немного расширил его (чтобы соответствовать моим потребностям в процессе выполнения задачи). Вот как выглядит предложение when в рабочей тетради:
2. ` когда: ‘(«lxc.group = mdblxc» в item.container_config и «dbserver» == inventory_hostname) или («lxc.group = weblxc» в item.container_config и «webserver» == inventory_hostname) `
3. Хм. кажется, что markdown не работает в этих комментариях («at» и обратные галочки не влияют на приведенные выше мои комментарии), не знаю почему 😉