একটি শর্ত অনুসারে উত্তর পরিবর্তনীয় ডিফল্ট মান


16

কিছু অবস্থার (যেমন অন্য ভেরিয়েবলের মান) অনুযায়ী কোনও ভূমিকা ভেরিয়েবলের ডিফল্ট মান পরিবর্তন করা সম্ভব?

বিস্তারিত

কমান্ডের জন্য আমার দুটি সম্পর্কিত ভেরিয়েবল রয়েছে envএবং composer_opts

যদি উভয়ই ডিফল্ট ( env = "prod"এবং composer_opts = "--no-dev") এ রেখে যায় তবে সবকিছু ঠিক আছে।

যদি আমি পরিবর্তন envকরতে dev, অন্যান্য এক জন্য ডিফল্ট, আমার আদেশ ভঙ্গ তাই আমি সবসময় উভয় সেট করতে হবে। কাস্টম স্ক্রিপ্ট / যদি দিয়ে শর্তসাপেক্ষে ডিফল্ট মান সেট করে এটি এড়ানো সম্ভব হবে?

গুরুত্বপূর্ণ: আমি সর্বদাcomposer_opts মান অনুযায়ী মান নির্ধারণ করতে চাই না env। আমি এটি সেট করতে চাই যদি এটি ইতিমধ্যে সেট না করা হয় (যেমন একটি গতিশীল ডিফল্ট মান)।

সুডোকোড

আমি এর মতো কিছু করতে চাই (নিম্নলিখিত কোডটি বৈধ নয়, কেবলমাত্র আমার প্রয়োজন প্রকাশ করার জন্য সিউডোকোড)

---
# defaults/main.yml

env: prod
composer_opts: 
    when: "{{env}}" = 'prod'
        '--no-dev --optimize-autoloader --no-interaction'
    when: "{{env}}" = 'dev'
        '' 

উত্তর:


12

আমি এই সমাধানটি পরামর্শ দিই:

---
 - set_fact:
     composer_opts: ""
   when: "{{env}}" == 'dev'

composer_optsভ্যারিয়েবল ' ' এর সমান ""হলে এটি স্ট্রিংয়ে ভেরিয়েবল সেট করে ।envdev

আপডেট হওয়া প্রশ্নের ভিত্তিতে প্লেবুকের উদাহরণ এখানে:

$ cat test.yml

---
- hosts: 127.0.0.1
  connection: local
  tasks:
  - set_fact:
      composer_opts: "{% if env == 'prod' %} '--no-dev --optimize-autoloader --no-interaction' {% else %} '' {% endif %}"

  - debug: var=composer_opts

নমুনা আউটপুট:

sudo ansible-playbook test.yml -e env=dev

PLAY [127.0.0.1] ************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [127.0.0.1]

TASK: [set_fact ] ************************************************************* 
ok: [127.0.0.1]

TASK: [debug var="{{composer_opts}}"] ***************************************** 
ok: [127.0.0.1] => {
    "var": {
        " '' ": " '' "
    }
}

PLAY RECAP ******************************************************************** 
127.0.0.1                  : ok=3    changed=0    unreachable=0    failed=0   


sudo ansible-playbook test.yml -e env=prod

PLAY [127.0.0.1] ************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [127.0.0.1]

TASK: [set_fact ] ************************************************************* 
ok: [127.0.0.1]

TASK: [debug var="{{composer_opts}}"] ***************************************** 
ok: [127.0.0.1] => {
    "var": {
        " '--no-dev --optimize-autoloader --no-interaction' ": " '--no-dev --optimize-autoloader --no-interaction' "
    }
}

PLAY RECAP ******************************************************************** 
127.0.0.1                  : ok=3    changed=0    unreachable=0    failed=0   

1
এটি সমাধানের একটি অংশ। এটি "ডেভ" থাকা composer_optsঅবস্থায় সর্বদা খালি স্ট্রিংয়ে সেট হবে env, কোনও আসল মান সেটকে ওভাররাইট করে। আমি মনে করি শর্তসাপেক্ষ ভালো বাড়ানো হবে: when: "{{env}}" == 'dev' and "{{composer_opts}}" is undefined। ভাল লাগছে কি? আপনি কি সেই অনুসারে আপনার প্রশ্নটি উত্সাহিত করতে পারেন?
ফ্রান্সেসকো আবেেনি

সুরকার_পটস সংজ্ঞায়িত করা হবে কারণ এর ডিফল্ট মান রয়েছে। আপনার কাজটি সমাধান করার জন্য আপনার আর একটি অভিব্যক্তি দরকার। উদাহরণস্বরূপ পরিবর্তনশীল কাস্টম_কম্পোজার_পটস।
নাভর

আপনি কী করতে চান দয়া করে সিউডোকোড দিয়ে বিশদ দিন। আমি সেই অনুযায়ী আমার উত্তর আপডেট করব।
নাভের

আমি অতিরিক্ত ব্যাখ্যা এবং সিউডোকোড নমুনা দিয়ে আমার প্রশ্ন আপডেট করেছি। ধন্যবাদ.
ফ্রান্সেস্কো আবেেনি

আমি আমার উত্তর আপডেট করেছি। এটি পরীক্ষা করে দেখুন। আমি বিশ্বাস করি আপনার প্রয়োজনীয়তা আমি বুঝতে পেরেছি।
নাভর

4

@ নাওয়ারের উত্তরটি কার্যকর হলেও , আমি জিনজা ২ স্বরলিপিটি ( "{% if env == 'prod' %} ...) স্বরলিপিটির পক্ষে অত্যন্ত সংবেদনশীল এবং এর চেয়ে বরং ভঙ্গুর বলে মনে করেছি। উদাহরণস্বরূপ, আরও ভাল পঠনযোগ্যতার জন্য প্রশ্নটিতে লাইনটি মোড়ানোর সময় যেমন এই অনির্ধারিত কোডে :

composer_opts: >
               "{% if env == 'prod' %}
                   '--no-dev --optimize-autoloader --no-interaction'
                {% else %}
                   ''
                {% endif %}"

আমি অপ্রত্যাশিত ফলাফলের সাথে শেষ করেছি যেমন অতিরিক্ত শ্বেত স্পেস বা \nইন composer_opts

আমি যে পদ্ধতিটি ব্যবহার করি তা হ'ল ঘন, তবে আরও স্থিতিশীল:

- name: set composer_opts for dev env
  set_fact:
     composer_opts: ''
     when: "{{env}}" == 'dev'

- name: set composer_opts for prod env
  set_fact:
     composer_opts: '--no-dev --optimize-autoloader --no-interaction'
     when: "{{env}}" == 'prod'

আমি এই ব্লগ পোস্টটি দরকারী হতে পেলাম যা মূলত একই পদ্ধতির অনুসরণ করে।


@sec যদি আপনি |পরিবর্তে ব্যবহার করেন >তবে হোয়াইটস্পেসের সমস্যা নাও থাকতে পারে। (অথবা আপনি এটির আরও কিছু পেয়ে যাবেন)
মাইকেল

@sec '> -' ব্যবহার করুন এবং উত্তরযোগ্য বৈশিষ্টটি দেখুন। মাল্টিলাইন স্ট্রিং সঠিকভাবে ম্যানিপুলেট করার জন্য এটিতে অনেকগুলি বিকল্প রয়েছে। yaml-multline.info দ্রষ্টব্য, বিশেষত, ব্লক চম্পিং সূচক।
ডিলানইং

দ্রষ্টব্য যে এই সমাধানটিরও অগ্রাধিকার সংক্রান্ত সমস্যা ছিল। একটি সত্য ডিফল্ট নয়।
ডিলানইং

2

এক লাইনের শর্তের ভিত্তিতে জবাবদিহি সেট_ফ্যাক্ট:

- name: "set composer_opts based on environment"
  set_fact:
     composer_opts:  "{{ '--no-dev --optimize-autoloader --no-interaction' if (env == 'prod') else '' }}"

অন্যান্য সমাধান হিসাবে একই নজির বিষয়গুলি (একটি সত্যটি ডিফল্ট নয়) তবে আপনি যদি নিজের ডিফল্ট.আইএমএল ফাইলে এই স্বতন্ত্র অধিকারটি রাখেন তবে এই সমাধানটি কার্যকর হবে। শর্তের উপর নির্ভর করে আপনার বেশ কয়েকটি ডিফল্ট থাকলে এটি আসল
কুরুচিপূর্ণ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.