จะรันงานอย่างไรเมื่อไม่ได้กำหนดตัวแปรใน ansible?


116

ฉันกำลังมองหาวิธีดำเนินงานเมื่อตัวแปร ansible ไม่ได้ลงทะเบียน / ไม่ได้กำหนดเช่น

-- 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

คำตอบ:


215

จาก เอกสารที่ตอบได้ : หากไม่ได้ตั้งค่าตัวแปรที่ต้องการคุณสามารถข้ามหรือล้มเหลวได้โดยใช้การทดสอบที่กำหนดไว้ของ Jinja2 ตัวอย่างเช่น:

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

ดังนั้นในกรณีของคุณwhen: deployed_revision is not definedควรใช้งานได้


4
ขอบคุณสิ่งนี้ได้ผลสำหรับฉันwhen: deployed_revision is not defined or deployed_revision.stdout is not defined or deployed_revision.stdout == ''
sakhunzai

5
คุณยังสามารถรวมเข้ากับเงื่อนไขต่างๆได้:when: item.sudo is defined and item.sudo == true
czerasz

5
อย่าทำในสิ่งที่ฉันทำและใส่วงเล็บปีกกาไว้รอบ ๆ ฟูwhen: foo is defined(เช่นใช้ไม่ได้:when: {{ foo }} is defined
เดวิด

2
@ เดวิดฉันประสบปัญหาเดียวกับคุณ ใส่วงเล็บปีกกาเมื่อทำลายเงื่อนไข เพื่อให้ได้ผลคุณต้องเพิ่มวงเล็บรอบเงื่อนไข เช่น when: ({{ foo }} in undefined)
Tarun

7
การใช้วงเล็บปีกกาสำหรับเงื่อนไขใน Ansible เลิกใช้แล้ว นอกจากนี้ไม่มีคำสั่ง Ansible ที่สามารถเริ่มต้นด้วยการขยายตัวแปร (เช่น{{ foo }}) นี่ไม่ใช่เพราะ Ansible แต่ Yaml จะตีความสิ่งนี้เป็นวัตถุ หากคุณต้องการเริ่มต้นด้วยการขยายตัวแปรเพียงแค่ล้อมรอบสิ่งทั้งหมดด้วยเครื่องหมายคำพูดคู่ (like "{{ foo }}") เพื่อบังคับให้ Yaml เห็นเป็นสตริงและส่งต่อไปยัง Ansible
Victor Schröder

12

ตาม Ansible เวอร์ชัน 2.5 ล่าสุดเพื่อตรวจสอบว่ามีการกำหนดตัวแปรหรือไม่และขึ้นอยู่กับสิ่งนี้หากคุณต้องการรันงานใด ๆ ให้ใช้undefinedคีย์เวิร์ด

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

เอกสารที่ตอบได้


5

ระบุไว้อย่างเคร่งครัดคุณต้องตรวจสอบสิ่งต่อไปนี้ทั้งหมดกำหนดไว้ไม่ว่างเปล่าและไม่ใช่ไม่มี

สำหรับตัวแปร "ปกติ" จะสร้างความแตกต่างหากกำหนดและตั้งค่าหรือไม่ได้ตั้งค่า ดูfooและbarในตัวอย่างด้านล่าง ทั้งสองถูกกำหนดไว้ แต่fooถูกตั้งค่าไว้เท่านั้น

ในอีกด้านหนึ่งตัวแปรที่ลงทะเบียนถูกตั้งค่าเป็นผลลัพธ์ของคำสั่งที่กำลังทำงานอยู่และแตกต่างกันไปในแต่ละโมดูล ส่วนใหญ่เป็นโครงสร้าง json คุณอาจต้องตรวจสอบองค์ประกอบย่อยที่คุณสนใจดูxyzและxyz.msgในตัวอย่างด้านล่าง:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.