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

Теперь для каждого элемента есть огромное лог-сообщение со всем содержимым элемента:

ok: [127.0.0.1] => (item = {u'uid ': 0, u'woth': False, u'mtime ': 1454939377.264, u'inode': 400377, u'isgid ': False, u' size ': 3243, u'roth': False, u'isuid ': False, u'isreg': True, u'gid ': 0, u'ischr': False, u'wusr ': True, 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, но это полностью опускает вывод, конечно.

Zulakis
источник
Возможно, вы могли бы написать набор [Jinja Filter] (docs.ansible.com/ansible/playbooks_filters.html) no_log: trueи вернуть значение item.pathс помощью модуля отладки
Henrik 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условия), но мне не удалось это сделать, так как мне нужно было бы отобразить список диктов, а затем сопоставить список ключей над определенным dict, что не представляется возможным, поскольку map принимает только имя функции, но не определение функции / связанные функции. Буду благодарен за предложение здесь!

Отличная идея из комментариев (Спасибо, 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
Zulakis
источник
1
Что касается вашего метода 2, было бы целесообразно использовать «with_together», даже если он не является сверхэффективным (к сожалению, комментарии не могут использовать теги кода, поэтому это будет выглядеть странно): - 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
Uditha Desilva
1

Ты не можешь Это либо все, либо ничего (через no_log: True)

udondan
источник