Ansible, listeleri içeren bir sözlüğü tekrarlar


15

Aşağıdaki değişken üzerinden yüklendi 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

shellUygun izinleri ayarlamak için bu bilgileri komuta beslemek istiyorum .

Buradan bazı teknikleri denedim: http://docs.ansible.com/playbooks_loops.html ancak çalışma çözümü bulamadı.

Bu yapıyı tekrarlamak mümkün müdür? Değilse, çalışması için nasıl yeniden yapılandırabilirim? Bunu KURU kuralını ihlal etmeden yapmak mümkün mü (örn. Her kayda kullanıcı adı ekleyin)?

Yanıtlar:


21

Öncelikle , yerine filemodülü kullanmayı düşünebilirsiniz shell. Daha az başarısızlığa eğilimli ve görünüşte idempotent. Ancak, dizinleri, dosyaları ve dosya kürelerini karıştırma ile ilgili bazı sorunlar verebilir. YMMV.

Sorunun kalbine gelince, değişkenlerinizi şöyle kurarım:

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

Oyun daha sonra şöyle görünecektir:

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

İyi fikir! Teşekkürler! Tıkır tıkır çalışıyor. BTW shellModül kullanıyorum çünkü özyinelemeli ACL yapmam gerekiyor ve aclmodül tarafından desteklenmiyor .
Slava Fomin II

Katı mantık. Öyle görünüyor ki shellACL'ler ve özyineleme ile en iyi bahis.
Christopher Karel

BTW eksik hash anahtarını yok saymak mümkün recursive mü? Erişmeye çalıştığımda ve kayıp olduğunda Ansible, oyun kitabının yürütülmesini durdurur ve bir istisna atar. recursive: falseHer kayda eklememeyi tercih ederim .
Slava Fomin II

1
Varsayılan sözdizimi çalışması gerekir düşünüyorum: {{ some_variable | default() }}. Yani, bu durumda: {{ item.1.recursive | default(false) }}
Christopher Karel

"Dizinler" tuşu sözlük yerine sadece bir liste ise görev nasıl değişir?
Chris F

7

Bu, kendinizi deneyebileceğiniz iyi bir çıktı örneğidir. Şu adla yeni bir oyun kitabı oluşturun 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

Ardından, çalışma kitabını şu şekilde çalıştırın: ansible-playbook -i '172.16.222.131,' iteration_loop.yml

ve çıktı size öğelere nasıl erişildiğini vermelidir:

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

Varsayalım dict={a:[1,2,3],b:[1,2]}:

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

şimdi flattened == [1,2,3,1,2]


0

Değişkenlerinizi aşağıdaki biçime göre yeniden biçimlendireceğim:

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

ve sonra oyun kitabım aşağıdaki gibi:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.