Làm thế nào để chạy một tác vụ khi biến không được xác định trong ansible?


115

Tôi đang tìm cách thực hiện một tác vụ khi biến ansible không phải là sổ đăng ký / không xác định, ví dụ:

-- name: some task
   command:  sed -n '5p' "{{app.dirs.includes}}/BUILD.info" | awk '{print  $2}'
   when: (! deployed_revision) AND ( !deployed_revision.stdout )
   register: deployed_revision

Câu trả lời:


213

Từ các tài liệu có thể đọc được: Nếu một biến bắt buộc chưa được đặt, bạn có thể bỏ qua hoặc thất bại khi sử dụng thử nghiệm đã xác định của Jinja2. Ví dụ:

tasks:

- shell: echo "I've got '{{ foo }}' and am not afraid to use it!"
  when: foo is defined

- fail: msg="Bailing out. this play requires 'bar'"
  when: bar is not defined

Vì vậy, trong trường hợp của bạn, when: deployed_revision is not definednên làm việc


4
cảm ơn vì điều này đã làm việc cho tôiwhen: deployed_revision is not defined or deployed_revision.stdout is not defined or deployed_revision.stdout == ''
sakhunzai

5
Bạn cũng có thể kết hợp nó với điều kiện khác nhau:when: item.sudo is defined and item.sudo == true
czerasz

5
Đừng làm những gì tôi đã làm và đặt dấu ngoặc nhọn xung quanh foo trong when: foo is defined(ví dụ này không làm việc:when: {{ foo }} is defined
David

2
@David Tôi đã gặp phải vấn đề tương tự như bạn. đặt dấu ngoặc nhọn khi ngắt điều kiện. Để điều này hoạt động, bạn cần thêm dấu ngoặc đơn xung quanh điều kiện. ví dụ when: ({{ foo }} in undefined)
Tarun

7
Việc sử dụng dấu ngoặc nhọn cho các điều kiện trong Ansible không được dùng nữa. Ngoài ra, không có câu lệnh Ansible nào có thể bắt đầu bằng mở rộng biến (như {{ foo }}). Đây không phải là do Ansible, mà Yaml sẽ giải thích đây là một đối tượng. Nếu bạn cần bắt đầu với một mở rộng biến, chỉ cần đặt toàn bộ nội dung bằng dấu ngoặc kép (như "{{ foo }}"), để buộc Yaml xem nó như một chuỗi và chuyển nó nguyên trạng cho Ansible.
Victor Schröder

11

Theo Ansible Version 2.5 mới nhất, để kiểm tra xem một biến có được xác định hay không và tùy thuộc vào điều này nếu bạn muốn chạy bất kỳ tác vụ nào, hãy sử dụng undefinedtừ khóa.

tasks:
    - shell: echo "I've got '{{ foo }}' and am not afraid to use it!"
      when: foo is defined

    - fail: msg="Bailing out. this play requires 'bar'"
      when: bar is undefined

Tài liệu Ansible


5

Đã nêu rõ, bạn phải kiểm tra tất cả những điều sau: được xác định, không trống VÀ không phải Không có.

Đối với các biến "bình thường", nó tạo ra sự khác biệt nếu được xác định và đặt hoặc không đặt. Xem foobartrong ví dụ bên dưới. Cả hai đều được xác định nhưng chỉ foođược thiết lập.

Ở phía bên kia, các biến đã đăng ký được đặt thành kết quả của lệnh đang chạy và thay đổi theo từng mô-đun. Chúng hầu hết là cấu trúc json. Bạn có thể phải kiểm tra thành phần phụ mà bạn quan tâm. Hãy xem xyzxyz.msgtrong ví dụ bên dưới:

cat > test.yml <<EOF
- hosts: 127.0.0.1

  vars:
    foo: ""          # foo is defined and foo == '' and foo != None
    bar:             # bar is defined and bar != '' and bar == None

  tasks:

  - debug:
      msg : ""
    register: xyz    # xyz is defined and xyz != '' and xyz != None
                     # xyz.msg is defined and xyz.msg == '' and xyz.msg != None

  - debug:
      msg: "foo is defined and foo == '' and foo != None"
    when: foo is defined and foo == '' and foo != None

  - debug:
      msg: "bar is defined and bar != '' and bar == None"
    when: bar is defined and bar != '' and bar == None

  - debug:
      msg: "xyz is defined and xyz != '' and xyz != None"
    when: xyz is defined and xyz != '' and xyz != None
  - debug:
      msg: "{{ xyz }}"

  - debug:
      msg: "xyz.msg is defined and xyz.msg == '' and xyz.msg != None"
    when: xyz.msg is defined and xyz.msg == '' and xyz.msg != None
  - debug:
      msg: "{{ xyz.msg }}"
EOF
ansible-playbook -v test.yml
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.