सूचियों के साथ एक शब्दकोष को पुनरावृत्त करना


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 लेकिन काम करने वाले समाधान के साथ आने में विफल रहा।

क्या इस संरचना को पुनरावृत्त करना संभव है? यदि नहीं, तो मैं इसे काम करने के लिए इसे फिर से कैसे तैयार करूं? क्या DRY नियम (जैसे हर रिकॉर्ड में यूज़रनेम शामिल है) को तोड़े बिना ऐसा करना संभव है?

जवाबों:


21

सबसे पहले, आप fileमॉड्यूल का उपयोग करने के बजाय विचार करना चाह सकते हैं shell। यह कम विफलता प्रवण है, और अस्थिर रूप से बेकार है। हालाँकि, यह आपको निर्देशिकाओं, फ़ाइलों और फ़ाइल ग्लब्स को मिलाने के कुछ मुद्दे दे सकता है। 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

महान विचार! धन्यवाद! एक जादू की तरह काम करता है। BTW मैं उपयोग कर रहा हूँshell मॉड्यूल क्योंकि मुझे पुनरावर्ती ACL करने की आवश्यकता है और यह aclमॉड्यूल द्वारा समर्थित नहीं है ।
स्लाव फोमिन II

ठोस तर्क। जैसा दिखता हैshell है ACLs और पुनरावृत्ति के साथ आपका सबसे अच्छा दांव है।
क्रिस्टोफर कारेल

BTW क्या recursiveमेरे उदाहरण की तरह गायब हैश कीज़ को अनदेखा करना संभव है ? जब मैं इसे एक्सेस करने की कोशिश करता हूं और यह गायब होता है, तो एंसिबल प्लेबुक के निष्पादन को रोक देगा और एक अपवाद फेंक देगा। मैं recursive: falseहर रिकॉर्ड में शामिल नहीं होना पसंद करता हूं ।
स्लाव फोमिन II

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   

1

यह मानते हुए कि dict={a:[1,2,3],b:[1,2]}और इतने पर:

- name: Flattened list
  set_fact:
    flattened: "{{ dict.values() | sum(start=[]) }}"

अभी flattened == [1,2,3,1,2]


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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.