Resolvido: É possível "arquivo de gato" e exportar sua saída para a tela enquanto reproduz um playbook e não como depuração?

22

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

Quero que o último passo do manual cat o arquivo de configuração google_authenticator.

Usando o módulo "debug", eu consigo exibir os dados 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 online 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 esteja entre aspas. Também tentei:

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

Alguma ideia do que poderia ser o problema?

Itai Ganot
fonte

Respostas:

3

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

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

Para a outra pergunta, não conheço um módulo para imprimir instruções diferentes do debugmódulo. Você pode verificar se a opção Salvar variável registrada no arquivo é uma opção. Se você deseja 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 Preciso me corrigir um pouco. Dê uma olhada nesta questão de falha no servidor . Você pode ajustar a saída Ansible usando a callback.displayfunção Eu recomendo a leitura da postagem do blog vinculado .

Henrik Pingel Restabelecer Monica
fonte
1

Aposto que o problema é que as aspas no arquivo que você está criando são incompatíveis e mexem com as aspas na mensagem. Talvez tente:

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

ou

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

Isso deve escapar das aspas na mensagem, para que as aspas ao redor da mensagem se correspondam.

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

lsd
fonte
Tentei os dois ... não funcionou.
Itai Ganot
Hmm, acabei de executá-lo sem minhas sugestões acima e obtive a mesma saída que você tinha no início. No entanto, não parece que você possa obtê-lo em um formato diferente de depuração, sem escrever seu próprio módulo de log para ansible ou direcionar para um script shell ou perl ou algo assim. Este link teve uma boa resposta stackoverflow.com/questions/28564811/…
lsd 2/16
1

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

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

Itai Ganot
fonte
2
Quanto ao Ansible 2.2, ainda não há opção para imprimir na tela além de usar a depuração.
Itai Ganot
0

Fiz alguns testes no bloco de texto que você tinha acima - coloquei-o no lugar e limpei as aspas de json adicionadas usando details.stdout_lines.

Se o texto 'ruim' no seu arquivo de autenticação for sempre um líder \", isso funcionará (testado), produzindo praticamente a mesma saída, mas com dois pontos no lugar dessa sequência.

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

Agora, este é um caso de uso extremamente limitado, mas se a saída de autenticação do google for estritamente definida aqui (e for possível, é o caso), isso deve ser o que você deseja.

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

Ryder
fonte