2017-01-09 2 views
1

В задаче Ansible, как зарегистрировать переменную, чтобы я мог использовать ее в качестве контрольной инструкции в Template. Задачи являются:Необязательная переменная регистра в задаче и использовать ее в шаблоне

- name: Check if certificate file exists 
    stat: path=/etc/nginx/ssl/{{ sitename }}.pem 
    register: ssl_cert_check 

- name: Create vhost from template 
    template: "src={{ vhost_conf }} dest=/etc/nginx/conf/vhost.conf" 

В шаблоне виртуального хоста для listen 80 всегда доступен, и я хочу, чтобы добавить блок для listen 443 только тогда, когда сертификат доступен:

server { 
    listen 80; 
    ........ 

} 
{% if ssl_cert_check == True %} # This doesn't issue error but doesn't work either 
server { 
    listen 443; 
    .............. 
} 
{% endif %} 

Когда я запускаю выше случае второй серверный блок не выполняется, это означает, что в конфигурации vhost печатается только серверное прослушивание 80.

Однако если удалить Истинную для if заявления и добавить stat.exists в шаблоне, то я получаю сообщение об ошибке:

# This issues error 
{% if ssl_cert_check.stat.exists %} 
server { 
    listen 443; 
    .............. 
} 
{% endif %} 

Ошибка является: "msg": "AnsibleUndefinedVariable: 'dict object' has no attribute 'stat' даже если я использовал модуль стата перед регистрацией переменного.

Есть ли другой способ передать переменную, определенную в Ansible task, и использовать ее в шаблоне Jinja2?

Значение, отображаемое на - debug: var=ssl_cert_check задачи перед Create vhost from template является:

"ssl_cert_check": { 
     "changed": false, 
     "msg": "All items completed", 
     "results": [ 
      { 
       "_ansible_item_result": true, 
       "_ansible_no_log": false, 
       "changed": false, 
       "invocation": { 
        "module_args": { 
         "checksum_algorithm": "sha1", 
         "follow": false, 
         "get_checksum": true, 
         "get_md5": true, 
         "mime": false, 
         "path": "/etc/nginx/ssl/abc.pem" 
        }, 
        "module_name": "stat" 
       }, 
       "item": { 
        ........ 
       }, 
       "stat": { 
        "exists": false 
       } 
      } 
     ] 
    } 
+0

Я обновил вопрос с помощью отладочного сообщения, пожалуйста, взгляните на него. –

ответ

0

Если вы посмотрите на ssl_cert_check у вас есть, вы заметите, что Булева ключ exists хранится в stat словаре под results список, так на самом деле вы должны перебирать элементы в списке внутри шаблона.

Если то, что вы вывесили является последовательным примером, вы можете обратиться к первому элементу в списке с помощью:

{% if ssl_cert_check.results[0].stat.exists %} 

Однако путь ssl_cert_check создается в вашем случае, скорее всего, означает:

  • у вас есть какие-то петли в коде
  • sitename не скаляр, а сам список

Если цикл длился несколько раз, или у вас было более одного элемента на sitename, результаты могут быть несовместимыми.

Вы должны скорее исправить первопричину, чем пойти с обходным путем results[0].

+0

спасибо за советы, я многому научился у вас о отладке ... Но чтобы ответить на мой вопрос, точно есть «массив» результатов, поэтому, '{% if ssl_cert_check.results [0] .stat.exists%}' работал ... он не работал с «результатами», поэтому мне пришлось добавить этот '[0]' в качестве своего первого массива. Если вы отредактируете это в своем ответе, я приму это. Еще раз, спасибо. –

+0

Существует массив из-за того, что вы решили не включать в свой вопрос. Если бы это было только то, что вы опубликовали, оно будет работать с 'ssl_cert_check.stat.exists'. – techraf

+0

Я не уверен, как массив приходит туда, но если бы я использовал одну и ту же зарегистрированную переменную в задаче типа '-name: abC# \ n file: #its task \ n, когда: ssl_cert_check.stat.exists', то' ssl_cert_check .stat.exists' отлично работает. Только использование этой переменной в шаблоне Jinja было проблемой, и добавление 'results [0]' также исправить это. –

0

Обратите внимание: пропущен задача будет засчитана переменная:

- name: Check if certificate file exists 
    stat: path=/etc/nginx/ssl/{{ sitename }}.pem 
    register: ssl_cert_check 

- name: Check if certificate file exists 
    stat: path=/etc/nginx/ssl/{{ sitename }}.pem 
    register: ssl_cert_check 
    when: nonexistent is defined 

В этом случае регистр будет иметь значение:

"ssl_cert_check": { 
    "changed": false, 
    "skip_reason": "Conditional result was False", 
    "skipped": true 
} 

Наиболее вероятно, лучше использовать уникальные имена для каждого регистра?

Смежные вопросы