AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 757461
Accepted
Zulakis
Zulakis
Asked: 2016-02-17 01:39:11 +0800 CST2016-02-17 01:39:11 +0800 CST 2016-02-17 01:39:11 +0800 CST

Ansible with_items não imprime o item inteiro?

  • 772

Estou protegendo automaticamente chaves SSL como esta:

- 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

Agora, para cada item, há uma enorme mensagem de log com todo o conteúdo do item:

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': Falso, u'isuid': Falso, u'isreg': Verdadeiro, u'gid': 0, u'ischr': Falso, u'wusr': Verdadeiro, 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})

Isso é incrivelmente ilegível, pois só quero saber o caminho do item que está sendo processado (e talvez alterado). Com um grande número de chaves, isso sai do controle muito rápido.

Como posso alterar este jogo de forma que apenas o item.pathesteja sendo impresso para cada item?

Eu já tentei no_log: True, mas isso omite completamente a saída, é claro.

ansible
  • 3 3 respostas
  • 14175 Views

3 respostas

  • Voted
  1. Best Answer
    sourcejedi
    2017-03-17T05:26:02+08:002017-03-17T05:26:02+08:00

    O Ansible 2.2 tem loop_control.labelpara isso.

    - name: Secure ssl keys
      file: path={{ item.path }} user=root group=root mode=600
      with_items: secure_ssl_keys_result.files
      loop_control:
        label: "{{ item.path }}"
    
    • Encontrado em: https://stackoverflow.com/a/42832731/799204
    • Documentação: http://docs.ansible.com/ansible/playbooks_loops.html#loop-control
    • 28
  2. Zulakis
    2016-03-01T04:46:49+08:002016-03-01T04:46:49+08:00

    Método 1

    Usar

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

    Ele retornará uma lista de caminhos:

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

    Toda a sua tarefa se tornaria:

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

    Cuidado que você só pode selecionar um único atributo, não é possível usar attribute=['path', 'mode']ou similar.

    Método 2

    Pensei em usar o extract para poder buscar várias chaves (porque às vezes é necessário ter uma segunda chave para uma whencondição), mas não consegui, pois precisaria mapear a lista de dicts, depois mapear a lista de chaves sobre o dict específico, o que não parece possível, pois map aceita apenas um nome de função, mas não uma definição de função/funções encadeadas. Eu ficaria grato por uma sugestão aqui!

    Uma ótima ideia dos comentários (Obrigado, 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 
    

    Método 3

    Como alternativa, um filtro personalizado como este pode ser usado (foi o que fiz antes de descobrir sobre 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
    
    • 6
  3. udondan
    2016-02-17T01:58:16+08:002016-02-17T01:58:16+08:00

    Você não pode. É tudo ou nada (via no_log: True)

    • 1

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve