উত্তরগুলির তালিকা সহ একটি অভিধান পুনরাবৃত্তি করুন


15

আমি নিম্নলিখিত ভেরিয়েবল এর মাধ্যমে লোড করেছি include_vars:

access:
    username-foo:
      - path: /
        permissions: rwX
        recursive: true

    username-bar:
      - path: /
        permissions: rX

      - path: /css
        permissions: rwX
        recursive: true

      - path: /data
        permissions: rX

      - path: /data/reviews.yml
        permissions: rw

      - path: /js
        permissions: rX

      - path: /js/*.js
        permissions: rw

আমি shellউপযুক্ত অনুমতি সেট করার জন্য কমান্ডে এই তথ্যটি ফিড করতে চাই ।

আমি এখান থেকে কিছু কৌশল চেষ্টা করেছি: http://docs.ansible.com/playbooks_loops.html তবে কাজের সমাধান নিয়ে আসতে ব্যর্থ হয়েছি।

এই কাঠামো পুনরাবৃত্তি সম্ভব? যদি তা না হয় তবে এটি কার্যকর করার জন্য আমি কীভাবে এটি পুনর্গঠন করব? ডিআরওয়াই বিধি লঙ্ঘন না করে এটি করা কি সম্ভব (উদাঃ প্রতিটি রেকর্ডে ব্যবহারকারীর নাম অন্তর্ভুক্ত)?

উত্তর:


21

প্রথমে আপনি fileমডিউলটি ব্যবহারের পরিবর্তে বিবেচনা করতে চাইতে পারেন shell। এটি কম ব্যর্থতার ঝুঁকিপূর্ণ এবং সম্ভবত আদর্শবান ot তবে এটি আপনাকে মিশ্রিত ডিরেক্টরি, ফাইল এবং ফাইল গ্লোব নিয়ে কিছু সমস্যা দিতে পারে। YMMV।

প্রশ্নের হৃদয় হিসাবে, আমি আপনার ভেরিয়েবলগুলি সেট আপ করব:

users:
  - username: bar
    directories:
      - path: /data
        permissions: rX
      - path: /js
        permissions: rX
  - username: foo
    directories:
      - path: /
        permissions: rwX

নাটকটি এর পরে দেখতে হবে:

- name: Change mod/own
  shell: chown {{ item.0.username }} {{ item.1.path }};chmod u+{{ item.1.permissions }} {{ item.1.path }
  with_subelements:
    - users
    - directories

ভালো বুদ্ধি! ধন্যবাদ! একটি যাদুমন্ত্র মত কাজ করে. বিটিডাব্লু আমি shellমডিউলটি ব্যবহার করছি কারণ আমার পুনরাবৃত্ত এসিএল করা দরকার এবং এটি aclমডিউল দ্বারা সমর্থিত নয় ।
স্লাভা ফমিন II

সলিড যুক্তি। দেখে মনে হচ্ছে shellএসিএল এবং পুনরাবৃত্তি নিয়ে আপনার সেরা বাজি।
ক্রিস্টোফার কারেল

বিটিডাব্লু কি recursiveআমার উদাহরণের মতো অনুপস্থিত হ্যাশ কী উপেক্ষা করা সম্ভব ? যখন আমি এটি অ্যাক্সেস করার চেষ্টা করি এবং এটি অনুপস্থিত তখন উত্তরযোগ্য প্লেবুকের সম্পাদন বন্ধ করে দেবে এবং একটি ব্যতিক্রম ছুঁড়ে দেবে। আমি recursive: falseপ্রতিটি রেকর্ডে যুক্ত না করা পছন্দ করি ।
স্লাভা ফমিন দ্বিতীয়

1
আমি মনে করি ডিফল্ট সিনট্যাক্স কাজ করা উচিত: {{ some_variable | default() }}। সুতরাং, এই ক্ষেত্রে: {{ item.1.recursive | default(false) }}
ক্রিস্টোফার কারেল

যদি "ডিরেক্টরিগুলি" কী কোনও অভিধানের পরিবর্তে কেবল একটি তালিকা হয় তবে কীভাবে কাজটি পরিবর্তন হবে?
ক্রিস এফ

7

এটি একটি ভাল আউটপুট উদাহরণ যা আপনি নিজেরাই চেষ্টা করতে পারেন। নামে একটি নতুন প্লেবুক তৈরি করুন iteration_loop.yml:

---

- name: Change mod/own
  hosts: all
  tasks:
  - name: show me the iterations
    debug: msg={{ item.0.username }} {{ item.1.path }} then {{ item.1.permissions }} {{ item.1.path }}
    with_subelements:
      - users
      - directories
  vars:
    users:
      - username: bar
        directories:
          - path: /data
            permissions: rX
          - path: /js
            permissions: rX
      - username: foo
        directories:
          - path: /
            permissions: rwX

তারপরে প্লেবুকটি চালান: ansible-playbook -i '172.16.222.131,' iteration_loop.yml

এবং আউটপুট আপনাকে আইটেমগুলি অ্যাক্সেস করা উচিত তা দেবে:

PLAY [Change mod/own] ********************************************************* 

GATHERING FACTS *************************************************************** 
ok: [172.16.222.131]

TASK: [show me the iterations] ************************************************ 
ok: [172.16.222.131] => (item=({'username': 'bar'}, {'path': '/data', 'permissions': 'rX'})) => {
    "item": [
        {
            "username": "bar"
        }, 
        {
            "path": "/data", 
            "permissions": "rX"
        }
    ], 
    "msg": "bar"
}
ok: [172.16.222.131] => (item=({'username': 'bar'}, {'path': '/js', 'permissions': 'rX'})) => {
    "item": [
        {
            "username": "bar"
        }, 
        {
            "path": "/js", 
            "permissions": "rX"
        }
    ], 
    "msg": "bar"
}
ok: [172.16.222.131] => (item=({'username': 'foo'}, {'path': '/', 'permissions': 'rwX'})) => {
    "item": [
        {
            "username": "foo"
        }, 
        {
            "path": "/", 
            "permissions": "rwX"
        }
    ], 
    "msg": "foo"
}

PLAY RECAP ******************************************************************** 
172.16.222.131             : ok=2    changed=0    unreachable=0    failed=0   


0

আমি আপনার vars নীচের বিন্যাসে পুনর্নির্মাণ করব:

access:
- username: foo
  directories:
    - path: /
      permissions: rwX
      recursive: true

- username: bar
  directories:
    - path: /
      permissions: rX
      recursive: false

    - path: /css
      permissions: rwX
      recursive: true

    - path: /data
      permissions: rX
      recursive: false

    - path: /data/reviews.yml
      permissions: rw
      recursive: false

    - path: /js
      permissions: rX
      recursive: false

    - path: /js/*.js
      permissions: rw
      recursive: false

এবং তারপরে নিচের মতো আমার প্লেবুক:

tasks:
- name: Iterate the vars inside var4 when recursive
  debug: msg="username is {{ item.0.username }} and path is {{ item.1.path }} permission is {{ item.1.permissions }} and recursive"
  when: item.1.recursive
  ignore_errors: true
  with_subelements:
    - "{{ access }}"
    - directories
- name: Iterate the vars inside var4 when no recursive
  debug: msg="username is {{ item.0.username }} and path is {{ item.1.path }} permission is {{ item.1.permissions }}"
  when: not item.1.recursive
  ignore_errors: true
  with_subelements:
    - "{{ access }}"
    - directories
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.