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})

これは信じられないほど読めません。処理中の(そしておそらく変更されている)アイテムのパスだけを知りたいからです。多数のキーを使用すると、このgetはすぐに手に負えなくなります。

item.path各アイテムについてのみが印刷されるように、このプレイを変更するにはどうすればよいですか?

私はすでに試しましたno_log: Trueが、これはもちろん出力を完全に省略します。


たぶん、あなたは[神社フィルター](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条件に2つ目のキーが必要な場合があるため) 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]}} 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

1

できません。それはすべてまたは何もありません(経由no_log: True

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.