목록이있는 사전을 반복 할 수 있음


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. 고장이 적고 표면적으로 dem 등성이 없습니다. 그러나 디렉토리, 파일 및 파일 글로브를 혼합하는 데 문제가 발생할 수 있습니다. 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모듈에서 지원하지 않기 때문에 모듈을 사용 하고 있습니다.
Slava Fomin II

확실한 논리. 같은 외모는 shellACL 및 재귀와 당신의 최선의 방법이다.
Christopher Karel

BTW recursive내 예제 와 같이 누락 된 해시 키를 무시할 수 있습니까? 액세스하려고하는데 누락되면 Ansible은 플레이 북의 실행을 중지하고 예외를 발생시킵니다. recursive: false모든 레코드 에 추가하지 않는 것이 좋습니다 .
Slava Fomin II

1
기본 구문이 작동해야한다고 생각합니다 {{ some_variable | default() }}. 따라서이 경우 : {{ item.1.recursive | default(false) }}
Christopher Karel

"디렉토리"키가 사전 대신 목록 일 경우 작업이 어떻게 변경됩니까?
Chris F

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.