Ansible with_items ไม่ได้พิมพ์รายการทั้งหมดใช่ไหม


16

ฉันจะรักษาความปลอดภัยคีย์ SSL โดยอัตโนมัติดังนี้:

- name: Find ssl keys
  find: paths="/etc/ssl/" patterns="*.key" recurse=yes
  register: secure_ssl_keys_result

- name: Secure ssl keys
  file: path={{ item.path }} user=root group=root mode=600
  with_items: secure_ssl_keys_result.files

ตอนนี้สำหรับทุกรายการมีข้อความบันทึกขนาดใหญ่ที่มีเนื้อหาทั้งหมดของรายการ:

ตกลง: [127.0.0.1] => (รายการ = {u'uid ': 0, u'woth': False, u'mtime ': 1454939377.264, u'inode': 400377, u'isgid ': เท็จ, u' ขนาด ': 3243, u'roth': เท็จ, u'isuid ': เท็จ, u'isreg': True, u'gid ': 0, u'ischr': เท็จ, u'wusr ': จริง, u'xoth ': False, u'rusr': True, u'nlink ': 1, u'issock': False, u'rgrp ': False, u'path': u '/ etc / ssl / foo.key', u 'xusr': False, u'atime ': 1454939377.264, u'isdir': False, u'ctime ': 1454939657.116, u'isblk': False, u'xgrp ': False, u'dev': 65025, u ' wgrp ': False, u'isfifo': ​​False, u'mode ': u'0600', u'islnk ': False})

สิ่งนี้ไม่สามารถอ่านได้อย่างไม่น่าเชื่อเนื่องจากฉันต้องการทราบเส้นทางของรายการที่กำลังประมวลผลอยู่ (และอาจมีการเปลี่ยนแปลง) ด้วยปุ่มตัวเลขจำนวนมากการใช้งานนี้จึงหมดไปอย่างรวดเร็วจริงๆ

ฉันจะเปลี่ยนการเล่นนี้ในแบบที่item.pathจะพิมพ์ออกมาสำหรับแต่ละรายการได้อย่างไร

ฉันได้ลองไปแล้วno_log: Trueแต่สิ่งนี้ไม่ส่งผลอย่างสมบูรณ์


บางทีคุณอาจจะเขียน [Jinja กรอง] (docs.ansible.com/ansible/playbooks_filters.html) ชุดno_log: trueและส่งกลับค่าของitem.pathกับโมดูลการแก้ปัญหา
เฮนริก Pingel

คำตอบ:



5

วิธีที่ 1

ใช้

secure_ssl_keys_result.files|map(attribute='path')|list

มันจะกลับรายการเส้นทาง:

['/etc/ssl../', '/etc/ssl/.../']

งานทั้งหมดของคุณจะกลายเป็น:

- name: Secure ssl keys
  file: path={{ item }} user=root group=root mode=600
  with_items: secure_ssl_keys_result.files|map(attribute='path')|list

ระวังว่าคุณสามารถเลือกได้เพียงแอททริบิวต์เดียวมันเป็นไปไม่ได้ที่จะใช้ attribute=['path', 'mode']หรือคล้ายกันได้

วิธีที่ 2

ฉันคิดว่าการใช้สารสกัดเพื่อให้สามารถดึงหลายคีย์ (เพราะบางครั้งจำเป็นต้องมีคีย์ที่สองสำหรับwhenเงื่อนไข) แต่ไม่สามารถจัดการได้เนื่องจากฉันต้องแมปรายการ dicts แล้วแม็พ รายการของคีย์บน dict ที่เฉพาะเจาะจงซึ่งดูเหมือนจะเป็นไปไม่ได้เนื่องจากแผนที่ยอมรับเฉพาะชื่อฟังก์ชัน แต่ไม่ใช่ฟังก์ชันนิยาม / ฟังก์ชั่นที่ถูกล่ามโซ่ ฉันจะขอบคุณสำหรับคำแนะนำที่นี่!

ความคิดที่ดีจากความคิดเห็น (ขอบคุณUditha Desilva !):

- name: Secure ssl keys file: path={{ item.0 }} mode=600 owner={{ item.1 }}
  with_together: 
  - secure_ssl_keys_result.files|map(attribute='path')|list 
  - secure_ssl_keys_result.files|map(attribute='uid')|list 

วิธีที่ 3

หรืออาจใช้ตัวกรองแบบกำหนดเองเช่นนี้ (นั่นคือสิ่งที่ฉันทำก่อนที่ฉันจะค้นพบmap):

from ansible import errors
import re

def cleandict(items, keepkeys):
    try:
        newitems = []
        if not isinstance(items, list):
          items = [items]
        if not isinstance(keepkeys, list):
          keepkeys = [keepkeys]
        for dictionary in items:
          newdictionary = {}
          for keepkey in keepkeys:
            newdictionary[keepkey] = dictionary.get(keepkey)
          newitems.append(newdictionary)  
        return newitems
    except Exception, e:
        raise errors.AnsibleFilterError('split plugin error: %s' % str(e) )
        #raise errors.AnsibleFilterError('split plugin error: %s, string=%s' % str(e),str(items) )

class FilterModule(object):
    ''' A filter to split a string into a list. '''
    def filters(self):
        return {
            'cleandict' : cleandict
        }

ansible.cfg:

filter_plugins = ~/.ansible/plugins/filter_plugins/:/usr/share/ansible_plugins/filter_plugins

1
เกี่ยวกับวิธีที่ 2 ของคุณดูเหมือนว่าจะใช้ "with_together" แม้ว่ามันจะไม่ได้มีประสิทธิภาพสูง (น่าเสียดายที่ความคิดเห็นไม่สามารถใช้แท็กรหัสดังนั้นมันจะดูแปลก ๆ ): - ชื่อ: ไฟล์ ssl keys ที่ปลอดภัย: path = {{item [0]}} mode = 600 owner = {{item [1]}} with_together: - secure_ssl_keys_result.files | map (attribute = 'path') | list - secure_ssl_keys_result.files | map (attribute = 'uid' ) | รายการ
Uditha Desilva

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.