>

vars/디렉토리에 다음 사전이 있습니다.

vars_dict.yml

---
ruleset:
  rule1:
    rule_name: testrule1
    description: Test Rule number 1
    source_zone: trust
    destination_zone: untrust
    source_ip: 1.2.3.4
    source_user: any
    destination_ip: 4.5.6.7
    action: allow
    disabled: FALSE
    location: top
    log_end: TRUE
    tag_name: superimportant
    vsys: vsys1
    state: present
    commit: TRUE
  rule2:
    rule_name: testrule2
    description: Test Rule number 2
    source_zone: trust
    destination_zone: untrust
    source_ip: 1.2.3.5
    source_user: any
    destination_ip: 4.5.6.8
    action: allow
    disabled: FALSE
    location: bottom
    log_end: TRUE
    tag_name: superimportant
    vsys: vsys1
    state: present
    commit: TRUE
...

또한 vars /에 이러한 지원 변수 파일이 있습니다 :

credentials.yml

fw_username: test
fw_password: test

와 fw.yml

fw_ip_address: 192.168.1.1

이 플레이 북을 사용하여 방화벽으로 명령을 보내기 위해 각 데이터 세트를 반복하고 싶습니다.

---
- hosts: localhost
  connection: local
  roles:
    - role: PaloAltoNetworks.paloaltonetworks
  tasks:
    - name: include variables
      include_vars:
        dir: vars
    - name: Add superimportant rules to the firewall
      panos_security_rule:
        ip_address: '{{ fw_ip_address }}'
        username: '{{ fw_username }}'
        password: '{{ fw_password }}'
        rule_name: '{{ ruleset.rule_name }}'
        description: '{{ ruleset.description }}'
        source_zone: ['{{ ruleset.source_zone }}']
        destination_zone: ['{{ ruleset.destination_zone }}']
        source_ip: ['{{ ruleset.source_ip }}']
        source_user: ['{{ ruleset.source_user }}']
        destination_ip: ['{{ ruleset.destination_ip }}']
        action: '{{ ruleset.action }}'
        disabled: '{{ ruleset.disabled }}'
        location: '{{ ruleset.location }}'
        log_end: '{{ ruleset.log_end }}'
        tag_name: '{{ ruleset.tag_name }}'
        vsys: '{{ ruleset.vsys }}'
        state: '{{ ruleset.state }}'
        commit: '{{ ruleset.commit }}'
        with_dict:
          - "{{ ruleset }}"
...

어쩌면 기대했던 결과는 각 데이터 블록에 대해 다음과 같이 출력을 반복하여 생성하는 것입니다.

 panos_security_rule:
    ip_address: '192.168.1.1'
    username: 'test'
    password: 'test'
    rule_name: 'Ansible test 1'
    description: 'An Ansible test rule'
    source_zone: ['trust']
    destination_zone: ['untrust']
    source_ip: ['1.2.3.4']
    source_user: ['any']
    destination_ip: ['any']
    action: 'allow'
    disabled: 'False'
    location: 'top'
    log_end: 'true'
    tag_name: 'superimportant'
    vsys: 'vsys1'
    state: 'present'
    commit: 'True'

내가받는 오류는

TASK [include variables] *****************************************************************************************************
fatal: [localhost]: FAILED! => {"msg": "Syntax Error while loading YAML.\n  mapping values are not allowed here\n\nThe error appears to have been in '/root/ansible/vars/vars.yml': line 3, column 16, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n  rule_name: testrule1\n    description: Test Rule number 1\n               ^ here\n"}
        to retry, use: --limit @/root/ansible/panos_dynamic.retry

문서와 게시물을 읽었으며 사전 파일을 다시 포맷하고 with_items, with_dict를 사용하여 "{{}}"로 묶고 괄호없이 시도했는데 완전히 막힌 것 같습니다.

여기에 간단한 것이 빠졌습니까?


  • 답변 # 1

    질문이 몇 가지 수정되어 질문을 해결할 수 있습니다.

    먼저, dict 대신 목록을 사용하여 역할을 정의하십시오. 둘 다 작동하지만 목록은 약간 더 깔끔한 코드입니다.

    두 번째 with_dict  표기법은 작업 매개 변수가 아닌 작업과 동일한 수준으로 들여 쓰기해야합니다.

    마침내, 귀하의 질문은 ruleset 를 사용합니다  루프 변수로. 기본적으로 이것은 item 입니다.  반복되는 list/dict 변수와 다른 것이 필요합니다.

    예 :   vars_dict.yml

    ---
    ruleset:
      - rule_name: testrule1
        description: Test Rule number 1
        source_zone: trust
        destination_zone: untrust
        source_ip: 1.2.3.4
        source_user: any
        destination_ip: 4.5.6.7
        action: allow
        disabled: FALSE
        location: top
        log_end: TRUE
        tag_name: superimportant
        vsys: vsys1
        state: present
        commit: TRUE
      - rule_name: testrule2
        description: Test Rule number 2
        source_zone: trust
        destination_zone: untrust
        source_ip: 1.2.3.5
        source_user: any
        destination_ip: 4.5.6.8
        action: allow
        disabled: FALSE
        location: bottom
        log_end: TRUE
        tag_name: superimportant
        vsys: vsys1
        state: present
        commit: TRUE
    
    

    플레이 북 :     ---     -호스트 : localhost       연결 : 로컬

     roles:
        - role: PaloAltoNetworks.paloaltonetworks
      tasks:
        - name: include variables
          include_vars:
            dir: vars
        - name: Add superimportant rules to the firewall
          panos_security_rule:
            ip_address: '{{ fw_ip_address }}'
            username: '{{ fw_username }}'
            password: '{{ fw_password }}'
            rule_name: '{{ item.rule_name }}'
            description: '{{ item.description }}'
            source_zone: ['{{ item.source_zone }}']
            destination_zone: ['{{ item.destination_zone }}']
            source_ip: ['{{ item.source_ip }}']
            source_user: ['{{ item.source_user }}']
            destination_ip: ['{{ item.destination_ip }}']
            action: '{{ item.action }}'
            disabled: '{{ item.disabled }}'
            location: '{{ item.location }}'
            log_end: '{{ item.log_end }}'
            tag_name: '{{ item.tag_name }}'
            vsys: '{{ item.vsys }}'
            state: '{{ item.state }}'
            commit: '{{ item.commit }}'
          with_items:
            - "{{ ruleset }}" 
    
    

관련 자료

  • 이전 c - 우분투에서 libvlc을 어디에 포함시킬 수 있습니까?
  • 다음 python - BeautifulSoup은 CSS 선택기를 사용하여 모든 요소를 ​​반환하지 않습니다