ভেরিয়েবল যখন জবাব দিয়ে থাকে তার কোন কাজ কীভাবে চালানো যায়?


115

আমি যখন কোনও কার্য সম্পাদন করার উপায় খুঁজছি তখন যখন উত্তরযোগ্য ভেরিয়েবল নিবন্ধগুলি / অপরিজ্ঞাত উদাহরণ না থাকে

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

উত্তর:


213

থেকে ansible ডক্স : একটি প্রয়োজনীয় পরিবর্তনশীল সেট করা হয়নি, তাহলে আপনি এড়িয়ে বা 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 == ''
সখুনজাই

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)
তরুণ

7
জবাবস্থায় শর্তাবলীর জন্য কোঁকড়া ধনুর্বন্ধনী ব্যবহার হ্রাস করা হয়। এছাড়াও, কোনও উত্তরীয় বক্তব্য পরিবর্তনশীল প্রসার (যেমন {{ foo }}) দিয়ে শুরু করতে পারে না । এটি জবাবদিহিতার কারণে নয়, তবে ইয়ামল এটিকে একটি বিষয় হিসাবে ব্যাখ্যা করবে। যদি আপনাকে কোনও পরিবর্তনশীল প্রসারিত দিয়ে শুরু করতে হয় তবে কেবল ডাবল কোট ( "{{ foo }}"পুরোপুরি) দিয়ে পুরো জিনিসটি ঘিরে ফেলুন, যমলকে স্ট্রিং হিসাবে দেখতে বাধ্য করুন এবং এটি জবাবদিহি করার মতো পাস করুন।
ভিক্টর শ্রাইডার

11

সর্বশেষ উত্তরীয় সংস্করণ 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

কঠোরভাবে বলা হয়েছে আপনাকে নিম্নলিখিত সমস্ত পরীক্ষা করতে হবে: সংজ্ঞায়িত, খালি নয় এবং কোনওটি নয় AND

"সাধারণ" ভেরিয়েবলগুলির জন্য এটি নির্ধারণ করা এবং সেট করা না থাকলে সেট করে একটি পার্থক্য করে। নীচে দেখুন fooএবং দেখুন bar। উভয়ই কেবল সংজ্ঞায়িত হয়foo সেট করা আছে।

অন্যদিকে নিবন্ধিত ভেরিয়েবলগুলি চলমান কমান্ডের ফলাফলের জন্য সেট করা হয় এবং মডিউল থেকে মডিউল পরিবর্তিত হয়। এগুলি বেশিরভাগ জেসন স্ট্রাকচার। আপনার সম্ভবত আগ্রহী সাবলেটমেন্টটি অবশ্যই পরীক্ষা করতে হবে below নীচের উদাহরণটি দেখুন 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.