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.
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?
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.
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>.
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.
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.
Tags debug ansible ansible-playbook