Как проверить строковое условие глубоко в переменной списка Ansible?

#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» и обратные галочки не влияют на приведенные выше мои комментарии), не знаю почему 😉