Grave a variável em um arquivo no Ansible

101

Estou puxando JSON por meio do módulo URI e quero gravar o conteúdo recebido em um arquivo. Consigo obter o conteúdo e enviá-lo para o depurador, portanto sei que o conteúdo foi recebido, mas não conheço a prática recomendada para gravar arquivos.

Keith Adler
fonte

Respostas:

200

Você pode usar o copymódulo, com o contentparâmetro:

- copy: content="{{ your_json_feed }}" dest=/path/to/destination/file

Os documentos aqui: módulo de cópia

Ramon de la Fuente
fonte
5
content = "{{your_json_feed}}" trata de espaços em branco e novas linhas. As citações são importantes.
m.kocikowski
@RamondelaFuente Se eu quiser adicionar vários conteúdos vars ao arquivo, preciso usar o módulo "copiar" várias vezes ou há alguma outra maneira?
KishoreReddy
1
@KishoreReddy Eu imagino que você possa usar a sintaxe jinja2 para acrescentar variáveis. Algo como "{{variable ~ another_variable}}". Não é bonito, mas se as coisas ficarem mais complicadas você pode usar o template:módulo e preenchê-lo com as variáveis ​​registradas em tempo de execução.
Ramon de la Fuente
Isso funciona melhor quando você deseja gerar um arquivo de soma sha256 no formulário shahash /path/to/file(observe 2 espaços entre) e, em seguida, validar na linha de comando (via sha256sum -c shafile) o que você gerou via Ansible.
Daniel Andrei Mincă
11

A menos que você esteja gravando arquivos muito pequenos, provavelmente deve usar modelos .

Exemplo:

- name: copy upstart script
  template: 
    src: myCompany-service.conf.j2 
    dest: "/etc/init/myCompany-service.conf"
Janus Troelsen
fonte
2
Embora a resposta de Ramon aborde exatamente o que foi perguntado, essa resposta é a melhor abordagem em geral. Por exemplo, se você tem um manual que cria VMs na nuvem e gostaria de gerar um inventário de hosts para outro manual, um modelo é o caminho a percorrer.
Luis Artola
Você pode explicar por que isso é melhor?
Vorticity
@Vorticity melhor do que o quê?
Janus Troelsen
@JanusTroelsen Desculpe, você pode explicar por que isso é melhor do que a resposta aceita ao gravar arquivos grandes?
Vorticidade
1
@Vorticity porque torna-se complicado quando você tem um arquivo embutido em outro arquivo. você precisa de escape e o realce de sintaxe não funcionará. o mecanismo de modelagem permite inserir coisas no meio, se necessário.
Janus Troelsen
9

Com base na resposta de Ramon, encontrei um erro. O problema de espaços no JSON que tentei escrever, resolvi alterando a tarefa no manual para ficar assim:

- copy:
    content: "{{ your_json_feed }}"
    dest: "/path/to/destination/file"

No momento, não tenho certeza de por que isso foi necessário. Meu melhor palpite é que tem algo a ver com a forma como as variáveis ​​são substituídas no Ansible e o arquivo resultante é analisado.

Tobias Kremer
fonte
0

Podemos especificar diretamente o arquivo de destino com a destopção agora. No exemplo abaixo, a saída json é armazenada no/tmp/repo_version_file

- name: Get repository file repo_version model to set ambari_managed_repositories=false
  uri:
    url: 'http://<server IP>:8080/api/v1/stacks/HDP/versions/3.1/repository_versions/1?fields=operating_systems/*'
    method: GET
    force_basic_auth: yes
    user: xxxxx
    password: xxxxx
    headers:
      "X-Requested-By": "ambari"
      "Content-type": "Application/json"
    status_code: 200
    dest: /tmp/repo_version_file
Venkata
fonte