Considerar este trivial ansible playbook y salida asociados a continuación. Por qué
hace la tarea 5 se ejecutan? Estas tareas se ejecutan en contra de debian. Tarea 1
no como se esperaba. Así que, ¿por qué y con ing
‘ansible_lsb.major_release|int < 14’ hacer realidad? ¿Tiene esto
algo que ver con la prioridad de operador?

-jk

---
- name: These tests run against debian
  hosts: frontend001
  vars:
    - bcbio_dir: /mnt/bcbio
    - is_ubuntu: "'{{ansible_distribution}}' == 'Ubuntu'"
    - is_debian: "'{{ansible_distribution}}' == 'Debian'"
  tasks:
    - name: 1. Expect skip because test is_ubuntu
      debug: msg="ansible distribution - {{ansible_distribution}}, release - {{ansible_distribution_release}}, {{ ansible_lsb.major_release }}"
      when: is_ubuntu 

    - name: 2. Expect to print msg because test is_debian
      debug: msg="ansible distribution - {{ansible_distribution}}, release - {{ansible_distribution_release}}, {{ ansible_lsb.major_release }}"
      when: is_debian

    - name: 3. Expect to print msg because release 7 of wheezy
      debug: msg="ansible distribution - {{ansible_distribution}}, release - {{ansible_distribution_release}}, {{ ansible_lsb.major_release }}"
      when:  ansible_lsb.major_release|int < 14

    - name: 4. Expect to print msg because true and true is true
      debug: msg="ansible distribution - {{ansible_distribution}}, release - {{ansible_distribution_release}}, {{ ansible_lsb.major_release }}"
      when: is_debian and ansible_lsb.major_release|int < 14

    - name: 5. Expect to skip because false and true is false
      debug: msg="ansible distribution - {{ansible_distribution}}, release - {{ansible_distribution_release}}, {{ ansible_lsb.major_release }}"
      when: is_ubuntu and ansible_lsb.major_release|int < 14 


$ ansible-playbook -i ~/.elasticluster/storage/ansible-inventory.jkcluster  zbcbio.yml 

PLAY [These tests run against debian] ***************************************** 

GATHERING FACTS *************************************************************** 
ok: [frontend001]

TASK: [1. Expect skip because test is_ubuntu] ********************************* 
skipping: [frontend001]

TASK: [2. Expect to print msg because test is_debian] ************************* 
ok: [frontend001] => {
    "msg": "ansible distribution - Debian, release - wheezy, 7"
}

TASK: [3. Expect to print msg because release 7 of wheezy] ******************** 
ok: [frontend001] => {
    "msg": "ansible distribution - Debian, release - wheezy, 7"
}

TASK: [4. Expect to print msg because true and true is true] ****************** 
ok: [frontend001] => {
    "msg": "ansible distribution - Debian, release - wheezy, 7"
}

TASK: [5. Expect to skip because false and true is false] ********************* 
ok: [frontend001] => {
    "msg": "ansible distribution - Debian, release - wheezy, 7"
}

PLAY RECAP ******************************************************************** 
frontend001                : ok=5    changed=0    unreachable=0    failed=0   

Editado:
Listado de los cambios basados en tedder42 la respuesta de abajo, en caso de que alguien le está siguiendo en casa.

1) Cambiado

- is_ubuntu: "'{{ansible_distribution}}' == 'Ubuntu'"

a

- is_ubuntu: "{{ansible_distribution == 'Ubuntu'}}"

2) cambio

when: is_ubuntu and ansible_lsb.major_release|int < 14 

a

when: is_ubuntu|bool and ansible_lsb.major_release|int < 14 

Que lo hizo!

-jk

OriginalEl autor John | 2014-10-03

1 Comentario

  1. 14

    TLDR: la variable se emite como una cadena, no se evalúa. Revisión de la evaluación mediante la jinja2 y luego filtrar el var como |bool.

    Depuración

    Sólo te falta una cosa para depurar este problema. He aquí lo que me encontré en mi local OSX cuadro:

    - name: stackoverflow 26188055
      hosts: local
      vars:
        - bcbio_dir: /mnt/bcbio
        - is_ubuntu: "'{{ansible_distribution}}' == 'Ubuntu'"
        - is_debian: "'{{ansible_distribution}}' == 'Debian'"
      tasks:
        - debug: var=is_ubuntu
        - debug: var=is_debian
        - debug: msg="this shows the conditional passes even though it shouldnt"
          when: is_ubuntu and true
    

    Y la salida:

    TASK: [debug var=is_ubuntu] *************************************************** 
    ok: [127.0.0.1] => {
        "is_ubuntu": "'MacOSX' == 'Ubuntu'"
    }
    
    TASK: [debug var=is_debian] *************************************************** 
    ok: [127.0.0.1] => {
        "is_debian": "'MacOSX' == 'Debian'"
    }
    
    TASK: [debug msg="this shows the conditional passes even though it shouldnt"] *** 
    ok: [127.0.0.1] => {
        "msg": "this shows the conditional passes even though it shouldnt"
    }
    

    La evaluación de

    Por lo que yo sé, usted no puede realmente evaluar abajo a un valor booleano. Típicamente, esto se hace por desenrollar la variable (colocar en cada «cuando»). Sin embargo, puede ser llevado a cabo como usted puede conseguir un booleano como una cadena, luego la echó a un bool como se indicó en las Variables de ansible página (de la búsqueda para «valor booleano»).

    - name: stackoverflow 26188055
      hosts: local
      vars:
        - bcbio_dir: /mnt/bcbio
        - is_ubuntu: "{{ansible_distribution == 'Ubuntu'}}"
        - is_debian: "{{ansible_distribution == 'Debian'}}"
      tasks:
        - debug: var=is_ubuntu
        - debug: var=is_debian
        - debug: msg="this shows the conditional passes even though it shouldnt"
          when: is_ubuntu|bool and true
    

    Y aquí está el resultado.

    TASK: [debug var=is_ubuntu] *************************************************** 
    ok: [127.0.0.1] => {
        "is_ubuntu": "False"
    }
    
    TASK: [debug var=is_debian] *************************************************** 
    ok: [127.0.0.1] => {
        "is_debian": "False"
    }
    
    TASK: [debug msg="this shows the conditional passes even though it shouldnt"] *** 
    skipping: [127.0.0.1]
    

    Versión filtro de comparación

    Nota es posible que desee tomar ventaja de Ansible del version_compare filtro. El uso se deja como ejercicio para el lector.

    OriginalEl autor tedder42

Dejar respuesta

Please enter your comment!
Please enter your name here