2016-06-17 18 views
8

Tôi có nhiệm vụ sau đây trong một playbook Tôi đang viết (kết quả liệt kê bên cạnh báo cáo kết quả debug trong <>):Ansible "khi biến == true" không hành xử như mong đợi

- debug: var=nrpe_installed.stat.exists <true> 
    - debug: var=force_install <true> 
    - debug: var=plugins_installed.stat.exists <true> 

    - name: Run the prep 
    include: prep.yml 
    when: (nrpe_installed.stat.exists == false or plugins_installed.stat.exists == true or force_install == true) 
    tags: ['prep'] 

    - debug: var=nrpe_installed.stat.exists <true> 
    - debug: var=force_install <true> 
    - debug: var=force_nrpe_install <false> 

    - name: Install NRPE 
    include: install-nrpe.yml 
    when: (nrpe_installed.stat.exists == false or force_install == true or force_nrpe_install == true) 
    tags: ['install_nrpe'] 
    vars: 
     nrpe_url: 'http://url.goes.here' 
     nrpe_md5: 3921ddc598312983f604541784b35a50 
     nrpe_version: 2.15 
     nrpe_artifact: nrpe-{{ nrpe_version }}.tar.gz 
     nagios_ip: {{ nagios_ip }} 
     config_dir: /home/ansible/config/ 

Và Tôi đang chạy nó với lệnh sau đây:

ansible-playbook install.yml -i $invFile --extra-vars="hosts=webservers force_install=True" 

đầu tiên bao gồm chạy, nhưng bỏ qua thứ hai với sản lượng này:

skipping: [server1] => {"changed": false, "skip_reason": "Conditional check failed", "skipped": true} 

Tôi bị ấn tượng rằng việc kiểm tra có điều kiện phải được chuyển cho tất cả chúng là force_install == true đánh giá là true sẽ làm cho toàn bộ số when được đánh giá là đúng (vì đó là một chuỗi 'HOẶC').

Làm cách nào để có thời điểm chạy khi các biến được đặt thích hợp?


Edit:

Thay đổi thứ hai khi cho Install NRPE bao gồm các công trình sau đây, nhưng không giải thích lý do tại sao một trong những khác, Run the prep chạy một cách thích hợp:

làm việc:

when: (not nrpe_installed.stat.exists or force_install or force_nrpe_install) 

Cũng hoạt động:

when: (nrpe_installed.stat.exists == false or plugins_installed.stat.exists == true or force_install == true) 

Không làm việc:

when: (nrpe_installed.stat.exists == false or force_install == true or force_nrpe_install == true) 

Các cắt ngắn đầu ra (bản sao loại bỏ) trong đó phần cụ thể của vở kịch là:

TASK [debug] ******************************************************************* 
ok: [server2] => { 
    "nrpe_installed.stat.exists": true 
} 

TASK [debug] ******************************************************************* 
ok: [server2] => { 
    "plugins_installed.stat.exists": true 
} 

TASK [debug] ******************************************************************* 
ok: [server2] => { 
    "force_install": true 
} 

TASK [Run the prep] ************************************************************ 
included: /tasks/nrpe-install/prep.yml for server2, server3, server4, server5, server6, server7 

TASK [Prep and configure for installation | Install yum packages] ************** 
ok: [server6] => (item=[u'gcc', u'glibc', u'glibc-common', u'gd', u'gd-devel', u'make', u'net-snmp', u'openssl-devel', u'unzip', u'tar', u'gzip', u'xinetd']) => {"changed": false, "item": ["gcc", "glibc", "glibc-common", "gd", "gd-devel", "make", "net-snmp", "openssl-devel", "unzip", "tar", "gzip", "xinetd"], "msg": "", "rc": 0, "results": ["gcc-4.1.2-55.el5.x86_64 providing gcc is already installed", "glibc-2.5-123.el5_11.3.i686 providing glibc is already installed", "glibc-common-2.5-123.el5_11.3.x86_64 providing glibc-common is already installed", "gd-2.0.33-9.4.el5_4.2.x86_64 providing gd is already installed", "gd-devel-2.0.33-9.4.el5_4.2.i386 providing gd-devel is already installed", "make-3.81-3.el5.x86_64 providing make is already installed", "net-snmp-5.3.2.2-20.el5.x86_64 providing net-snmp is already installed", "openssl-devel-0.9.8e-40.el5_11.x86_64 providing openssl-devel is already installed", "unzip-5.52-3.el5.x86_64 providing unzip is already installed", "tar-1.15.1-32.el5_8.x86_64 providing tar is already installed", "gzip-1.3.5-13.el5.centos.x86_64 providing gzip is already installed", "xinetd-2.3.14-20.el5_10.x86_64 providing xinetd is already installed"]} 

TASK [Prep and configure for installation | Make nagios group] ***************** 
ok: [server2] => {"changed": false, "gid": 20002, "name": "nagios", "state": "present", "system": false} 

TASK [Prep and configure for installation | Make nagios user] ****************** 
ok: [server6] => {"append": false, "changed": false, "comment": "User for Nagios NRPE", "group": 20002, "home": "/home/nagios", "move_home": false, "name": "nagios", "shell": "/bin/bash", "state": "present", "uid": 20002} 

TASK [debug] ******************************************************************* 
ok: [server2] => { 
    "nrpe_installed.stat.exists": true 
} 

TASK [debug] ******************************************************************* 
ok: [server2] => { 
    "force_install": true 
} 

TASK [debug] ******************************************************************* 
ok: [server2] => { 
    "force_nrpe_install": false 
} 

TASK [Install NRPE] ************************************************************ 
skipping: [server2] => {"changed": false, "skip_reason": "Conditional check failed", "skipped": true} 

Trả lời

30

Bạn cần phải chuyển đổi biến để một boolean:

force_install|bool == true 

Tôi không yêu cầu tôi hiểu e logic đằng sau nó. Trong python bất kỳ chuỗi không có sản phẩm nào phải là sự thật. Nhưng khi được sử dụng trực tiếp trong điều kiện nó đánh giá sai.

Bộ lọc bool sau đó lại diễn giải các chuỗi "true" và "yes" (không phân biệt dạng chữ) là true. Bất kỳ chuỗi nào khác đều sai.

Bạn có thể muốn cũng đặt một giá trị mặc định trong trường hợp force_install không được định nghĩa, vì nó sẽ cho kết quả thành một không xác định biến lỗi :

force_install|default(false)|bool == true 
+4

không '== true' dôi dư? –

+4

Phải, bạn có thể bỏ qua điều đó tất nhiên. 'force_install | default (false) | bool' – udondan

+0

Và vì' None', 'False',' 0' và '" "' (chuỗi trống) là các giá trị sai và các chuỗi không trống là các giá trị đúng, bạn thường có thể bỏ qua chuyển đổi 'bool' và chỉ nói ví dụ 'force_install | mặc định (False)'. – akaihola

Các vấn đề liên quan