Ansible with_items không in toàn bộ mục?


16

Tôi đang tự động bảo mật các khóa SSL như thế này:

- 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

Bây giờ, đối với mỗi mục, có một thông điệp tường trình lớn với toàn bộ nội dung của mục:

ok: [127.0.0.1] => (item = {u'uid ': 0, u'woth': Sai, u'mtime ': 1454939377.264, u'inode': 400377, u'isgid ': Sai, u' kích thước ': 3243, u'roth': Sai, u'isuid ': Sai, u'isreg': Đúng, u'gid ': 0, u'ischr': Sai, u'wusr ': Đúng, u'xoth ': Sai, u'rusr': Đúng, u'nlink ': 1, u'issock': Sai, u'rgrp ': Sai, u'path': u '/ etc / ssl / foo.key', u 'xusr': Sai, u'atime ': 1454939377.264, u'itorir': Sai, u'ctime ': 1454939657.116, u'isblk': Sai, u'xgrp ': Sai, u'dev': 65025, u ' wgrp ': Sai, u'isfifo': ​​Sai, u'mode ': u'0600', u'islnk ': Sai})

Điều này là vô cùng khó đọc, vì tôi chỉ muốn biết đường dẫn của mục đang được xử lý (và có thể thay đổi). Với số lượng lớn chìa khóa, việc này sẽ nhanh chóng vượt qua.

Làm cách nào tôi có thể thay đổi cách chơi này theo cách chỉ item.pathđược in ra cho mỗi mục?

Tôi đã thử no_log: True, nhưng điều này hoàn toàn bỏ qua đầu ra tất nhiên.


Có lẽ bạn có thể viết [Bộ lọc Jinja] (docs.ansible.com/ansible/playbooks_filters.html) được đặt no_log: truevà trả về giá trị của item.pathvới mô-đun gỡ lỗi
Henrik Pingel

Câu trả lời:



5

Phương pháp 1

Sử dụng

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

Nó sẽ trả về một danh sách các đường dẫn:

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

Toàn bộ nhiệm vụ của bạn sẽ trở thành:

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

Coi chừng bạn chỉ có thể chọn một thuộc tính duy nhất, không thể sử dụng attribute=['path', 'mode']hoặc tương tự.

Cách 2

Tôi đã nghĩ đến việc sử dụng giải nén để có thể tìm nạp nhiều khóa (vì đôi khi cần phải có khóa thứ hai cho một whenđiều kiện), nhưng tôi đã không quản lý để làm điều đó, vì tôi sẽ cần ánh xạ danh sách các lệnh, sau đó ánh xạ danh sách các khóa trên dict cụ thể, dường như không thể, vì bản đồ chỉ chấp nhận một tên hàm chứ không phải là một hàm định nghĩa / hàm chuỗi. Tôi sẽ biết ơn cho một đề nghị ở đây!

Một ý tưởng tuyệt vời từ các ý kiến ​​(Cảm ơn, 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 

Phương pháp 3

Ngoài ra, một bộ lọc tùy chỉnh như thế này có thể được sử dụng (đó là những gì tôi đã làm trước khi tôi phát hiện ra 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
Về phương pháp 2 của bạn, có vẻ khả thi khi sử dụng "with_together", ngay cả khi nó không hiệu quả (không may là các bình luận không thể sử dụng thẻ mã nên điều này sẽ trông kỳ lạ): - name: Tệp khóa ssl an toàn: path = {{item [0]}} mode = 600 own = {{item [1]}} with_together: - safe_ssl_keys_result.files | map (property = 'path') | list - safe_ssl_keys_result.files | map (property = 'uid' ) | danh sách
Uditha Desilva

1

Bạn không thể. Đó là tất cả hoặc không có gì (thông qua no_log: True)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.