উত্তরযোগ্যতে পুতুলের "যদি না" এর সমতুল্য কী?


9

পটভূমি: পুতুলে কোনও কমান্ড কার্যকর করা সম্ভব হয় যদি না এটি ইতিমধ্যে সম্পাদিত হয়:

exec { '/bin/echo root >> /usr/lib/cron/cron.allow':
  path   => '/usr/bin:/usr/sbin:/bin',
  unless => 'grep root /usr/lib/cron/cron.allow 2>/dev/null',
}

লক্ষ্য: একটি কমান্ড কার্যকর করতে যদি না এটি ইতিমধ্যে উত্তরটিতে চালিত হয়

পদ্ধতি

কর্ম / main.yml

- name: add vhost sensu
  command: rabbitmqctl add_vhost /sensu

ফলাফল

TASK [ansible-rabbitmq : add vhost sensu] **************************************
fatal: [111.222.333.444]: FAILED! => {"changed": true, "cmd": ["rabbitmqctl",
"add_vhost", "/sensu"], "delta": "0:00:00.210140", "end": 
"2016-07-29 12:55:19.384455", "failed": true, "rc": 2, "start":
"2016-07-29 12:55:19.174315", "stderr": "Error: vhost_already_exists: /sensu", 
"stdout": "Creating vhost \"/sensu\" ...", "stdout_lines": 
["Creating vhost \"/sensu\" ..."], "warnings": []}

আলোচনা

গুগলিং এই নথিটি সম্পর্কেunless ansible দেখিয়েছে । সেই ডকুমেন্টেশনের ভিত্তিতে একটি বিবৃতি যুক্ত করা হয়েছিল:whenwhen

- name: add vhost sensu
  command: rabbitmqctl add_vhost /sensu
  when: rabbitmqctl list_vhosts | grep sensu

কোড চালনার ফলে:

fatal: [192.168.0.9]: FAILED! => {"failed": true, "msg": "The conditional
 check 'rabbitmqctl list_vhosts | grep sensu' failed. The error was: template
 error while templating string: expected token 'end of statement block', got
 'list_vhosts'. String: {% if rabbitmqctl list_vhosts | grep sensu %} True {%
 else %} False {% endif %}\n\nThe error appears to have been in '/etc/ansible
/roles/ansible-rabbitmq/tasks/main.yml': line 10, column 3, but may\nbe
 elsewhere in the file depending on the exact syntax problem.\n\nThe
 offending line appears to be:\n\n\n- name: add vhost sensu\n  ^ here\n"}
  1. প্রথমত, কল্পনা করুন যে whenএটি সফল হয়েছিল তখন কমান্ডটি চলবে না এবং তারপরে এটি onlyifপুতুলের মতো আরও বেশি দেখাচ্ছে ।
  2. দ্বিতীয়ত, কখন সফল হবে যদি একটি অনুকরণের চিহ্নটি ব্যবহার করা উচিত যদি না তবে একটি অনুকরণ করা যায়?
  3. এর ব্যবহারregister । কী যদি সেই ফাইলটি হারিয়ে যায় বা উদাহরণস্বরূপ কোনও মানুষকে ভোস্টটি সরানো হয়েছে? পুতুল unlessসর্বদা কমান্ডগুলি কার্যকর করে যাতে কমান্ডটি কার্যকর করা প্রয়োজন কিনা তা পরিষ্কার হয়ে যায়।

উত্তর:


9

আমি মনে করি আপনি যা করছেন তা হ'ল:

- name: get vhosts
  command: rabbitmqctl list_vhosts
  register: vhosts
  changed_when: false

- name: add vhost sensu
  command: rabbitmqctl add_vhost /sensu
  when: "'/sensu' not in vhosts.stdout"

উত্তর: # 3 registerকোনও ফাইল তৈরি করে না। আপনি যদি এর rabbitmqctl list_vhostsমাধ্যমে আউটপুট ক্যাপচার করেন registerতবে বিষয়বস্তুগুলি সিস্টেমের বর্তমান অবস্থা হিসাবে বৈধ হবে।


3

সমস্যা লাইন when: rabbitmqctl list_vhosts | grep sensu। এখানে ব্যাশ ব্যবহার করা সম্ভব নয়।

আপনাকে rabbitmqctl list_vhosts | grep sensuএটিকে একটি আলাদা টাস্কে স্থাপন করতে হবে এবং ফলাফলটি কখন শর্তাদির মধ্যে এটি ব্যবহারের জন্য নিবন্ধভুক্ত করতে হবে। আপনি মত আচরণ notপেতে ফিল্টার ব্যবহার করতে পারেন unless

এর মতো কিছু কাজ করা উচিত:

- name: Get rabbitmq vhosts.
  command: rabbitmqctl list_vhosts | grep sensu
  register: rabbitmq_vhosts

- name: add vhost sensu
  command: rabbitmqctl add_vhost /sensu
  when: not 'sensu' in rabbitmq_vhosts.stdout

Get rabbitmq vhosts.এই উদাহরণে সবসময় মৃত্যুদন্ড কার্যকর করা হবে না। add vhost sensuশুধুমাত্র যদি স্ট্রিং sensu নিবন্ধিত নয় rabbitmq_vhosts

আরও তথ্যের জন্য শর্তসাপেক্ষ এবং জিনজা ফিল্টারগুলির ডকুমেন্টেশনের সাথে পরামর্শ করুন।


সমস্যাটি অব্যাহত রয়েছে:fatal: [IP]: FAILED! => {"changed": true, "cmd": ["rabbitmqctl", "add_vhost", "/sensu"], "delta": "0:00:00.198681", "end": "2016-07-29 13:43:00.870193", "failed": true, "rc": 2, "start": "2016-07-29 13:43:00.671512", "stderr": "Error: vhost_already_exists: /sensu", "stdout": "Creating vhost \"/sensu\" ...", "stdout_lines": ["Creating vhost \"/sensu\" ..."], "warnings": []}
030

এইচএম, সম্ভবত আমার দোষ আমার ধারণা এটি .stdoutআমার উত্তর সম্পাদিত অনুপস্থিত ।
হেনরিক পিঙ্গেল

0

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

- shell: rabbitmqctl list_vhosts | grep sensu
  register: sensu_vhosts

- name: add vhost sensu
  command: rabbitmqctl add_vhost /sensu
  when: sensu_vhosts.stdout_lines < 1

stdout_linesশেল টাস্কটি ফিরে আসা সমস্ত লাইনের একটি অ্যারে। সুতরাং আপনি এন্ট্রি সংখ্যা গণনা করতে পারেন এবং 0 টি আইটেম ফিরিয়ে দেওয়া হলে কেবল আপনার টাস্ক চালাতে পারেন


2
যদি / সেন্সু ভোস্টের অস্তিত্ব না থাকে তবে এর ফলাফল:fatal: [IP]: FAILED! => {"changed": true, "cmd": "rabbitmqctl list_vhosts | grep sensu", "delta": "0:00:00.198769", "end": "2016-07-29 13:45:59.069981", "failed": true, "rc": 1, "start": "2016-07-29 13:45:58.871212", "stderr": "", "stdout": "", "stdout_lines": [], "warnings": []}
030
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.