Ansible: É possível “cat file” e exportar sua saída para a tela enquanto joga um playbook e não como debug?

20

Eu escrevi um manual que instala e configura o Google Authenticator por usuário.

Eu quero a última etapa do manual para cat do arquivo de configuração google_authenticator.

Usando o módulo "debug", posso obter os dados a serem exibidos na tela, mas apenas como mensagem de depuração:

TASK: [debug var=details.stdout_lines] ****************************************
ok: [localhost] => {
    "details.stdout_lines": [
        "ZKMFTE2ADYA2OYCH",
        "\"RATE_LIMIT 3 30",
        "\" DISALLOW_REUSE",
        "\" TOTP_AUTH",
        "12920994",
        "88224784",
        "69464205",
        "38144121",
        "45634120"
    ]
}

Eu li on-line que posso fazer algo assim:

  - name: Print to screen google authenticator details
    command: /bin/cat {{ google_authenticator_secret_file_location }}
    register: details
    tags: google_2fa_user

  - debug: msg="{{ details.stdout_lines }}"

Mas recebo um erro quando o executo:

TASK: [Print to screen google authenticator details] **************************
changed: [localhost]

TASK: [debug msg="{{details.stdout_lines}}"] **********************************
fatal: [localhost] => Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/ansible/runner/__init__.py", line 532, in _executor
    exec_rc = self._executor_internal(host, new_stdin)
  File "/usr/lib/python2.7/dist-packages/ansible/runner/__init__.py", line 629, in _executor_internal
    return self._executor_internal_inner(host, self.module_name, self.module_args, inject, port, complex_args=complex_args)
  File "/usr/lib/python2.7/dist-packages/ansible/runner/__init__.py", line 815, in _executor_internal_inner
    result = handler.run(conn, tmp, module_name, module_args, inject, complex_args)
  File "/usr/lib/python2.7/dist-packages/ansible/runner/action_plugins/debug.py", line 41, in run
    kv = utils.parse_kv(module_args)
  File "/usr/lib/python2.7/dist-packages/ansible/utils/__init__.py", line 526, in parse_kv
    vargs = [x.decode('utf-8') for x in shlex.split(args, posix=True)]
  File "/usr/lib/python2.7/shlex.py", line 279, in split
    return list(lex)
  File "/usr/lib/python2.7/shlex.py", line 269, in next
    token = self.get_token()
  File "/usr/lib/python2.7/shlex.py", line 96, in get_token
    raw = self.read_token()
  File "/usr/lib/python2.7/shlex.py", line 172, in read_token
    raise ValueError, "No closing quotation"
ValueError: No closing quotation


FATAL: all hosts have already failed -- aborting

PLAY RECAP ********************************************************************

O erro diz: "Sem cotação de fechamento", embora seja citado. Também tentei:

 - debug: msg= "{{ details.stdout_lines }}"

Alguma ideia do que poderia ser o problema?

    
por Itai Ganot 01.06.2016 / 13:26

4 respostas

1

Eu olhei profundamente pela internet e verifiquei com alguns profissionais da Ansible.

Tanto quanto eu entendo, não há essa opção no Ansible 1.8 para redirecionar a saída do comando para a tela como saída normal em vez de depurar a saída.

    
por 02.06.2016 / 10:46
3

O filtro Jinja deve resolver o problema de citação. Use assim:

  - debug: msg="{{ details.stdout_lines | quote }}"

Para a outra pergunta, não conheço um módulo para imprimir instruções diferentes do módulo debug . Você pode querer verificar se Salvar variável registrada no arquivo é uma opção. Se você quiser armazenar variáveis Ansible no host do controlador, é possível fazer algo assim:

- local_action: copy content={{ details.stdout_lines }} dest=/path/to/destination/file

EDIT Eu preciso me corrigir um pouco. Dê uma olhada em esta pergunta de falha de servidor . Você pode ajustar a saída Ansible usando a função callback.display . Recomendo a leitura da postagem no blog um>.

    
por 02.06.2016 / 21:21
1

Eu apostaria que o problema é que as aspas no arquivo que você está digitando são incompatíveis e mexem com as aspas na msg. Talvez tente:

- debug: msg="{{ details.stdout_lines | regex_escape() }"

ou

- debug: msg="{{ details.stdout_lines | regex_replace('"', '\"') }"

Isso deve escapar das aspas na msg para que as aspas em torno da msg sejam iguais.

Isso não foi testado (não estou em condições de testá-lo agora), mas você pode tentar rapidamente e ver.

    
por 01.06.2016 / 16:23
0

Eu fiz alguns testes no bloco de texto que você tinha acima - coloquei no lugar e limpei as citações do json adicionadas usando details.stdout_lines.

Se o texto 'ruim' no seu arquivo de autenticação é sempre um líder \" , então isso (testado) simplesmente funciona, produzindo a mesma saída, mas com dois pontos no lugar de esta uma string.

- debug: msg="{{ details.stdout.replace('\"',':').split('\n') }}"

Agora, esse é um caso de uso extremamente limitado, mas se a saída do google auth estiver estritamente definida aqui (e é perfeitamente possível que seja o caso), isso deve fazer o que você deseja.

No entanto, ainda seria mais fácil e preferível usar var=details.stdout_lines para obter o conteúdo aqui.

    
por 03.06.2016 / 07:24