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':False,u' size':3243,u'roth':False,u'isuid':False,u'isreg':True,u'gid':0,u'ischr':False,u'wusr':True,u'xoth ':错,u'rusr':错,u'nlink':1,u'issock':错,u'rgrp':错,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':错误,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带有调试模块
Henrik Pingel,2016年

Answers:



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']或类似属性。

方法二

我认为使用提取能够获取多个键(因为有​​时必须有一个when条件的第二个键),但是并没有做到这一点,因为我需要先映射字典列表,然后再映射特定字典上的键列表,这似乎是不可能的,因为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

1
关于方法2,即使它不是超级高效的,使用“ with_together”似乎也是可行的(不幸的是注释不能使用代码标签,因此看起来很奇怪):-名称:Secure ssl keys file:path = {{item [0]}}模式= 600 owner = {{item [1]}} with_together:-secure_ssl_keys_result.files | map(attribute ='path')|列表-secure_ssl_keys_result.files | map(attribute ='uid' )| list
Uditha Desilva

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.