Ansible: Definir variável para conteúdo do arquivo

93

Estou usando o módulo ec2 com ansible-playbookDesejo definir uma variável para o conteúdo de um arquivo. É assim que estou fazendo isso atualmente.

  1. Var com o nome do arquivo
  2. tarefa de shell para cato arquivo
  3. use o resultado de catpara passar para o módulo ec2.

Conteúdo de exemplo do meu manual.

vars:
  amazon_linux_ami: "ami-fb8e9292"
  user_data_file: "base-ami-userdata.sh"
tasks:
- name: user_data_contents
  shell: cat {{ user_data_file }}
  register: user_data_action
- name: launch ec2-instance
  local_action:
...
  user_data: "{{ user_data_action.stdout }}"

Presumo que haja uma maneira muito mais fácil de fazer isso, mas não consegui encontrar enquanto pesquisava nos documentos do Ansible.

TesterJeff
fonte
Este funcionou para mim. Não descobri como incorporar variáveis ​​em um comando lookup (pipe).
ericson.cepeda

Respostas:

90

Você pode usar pesquisas no Ansible para obter o conteúdo de um arquivo, por exemplo

user_data: "{{ lookup('file', user_data_file) }}"

Advertência: esta pesquisa funcionará com arquivos locais, não com arquivos remotos.

Aqui está um exemplo completo dos documentos :

- hosts: all
  vars:
     contents: "{{ lookup('file', '/etc/foo.txt') }}"
  tasks:
     - debug: msg="the value of foo.txt is {{ contents }}"
jabclab
fonte
90
Observe que a pesquisa é executada localmente, enquanto o catcomando no exemplo de @TesterJeff está sendo executado na máquina remota.
Alex Dupuy
8
Para consultas remotas, verifique os módulos slurp e fetch
Marco Ferrari
14

Você pode usar o módulo slurp: (Obrigado a @mlissner por sugerir isso)

vars:
  amazon_linux_ami: "ami-fb8e9292"
  user_data_file: "base-ami-userdata.sh"
tasks:
- name: Load data
  slurp:
    src: "{{ user_data_file }}"
  register: slurped_user_data
- name: Decode data and store as fact # You can skip this if you want to use the right hand side directly...
  set_fact:
    user_data: "{{ slurped_user_data.content | b64decode }}"
Gert van den Berg
fonte
8

Você pode usar o módulo fetch para copiar arquivos de hosts remotos para o local e o módulo lookup para ler o conteúdo dos arquivos buscados.

Taha Jahangir
fonte
6
Sou totalmente novo no ansible, mas por que não usar slurp para isso? Parece funcionar no controle remoto para obter o conteúdo de um arquivo.
mlissner de
0

lookup só funciona em localhost. Se você deseja recuperar variáveis de um variáveis arquivo que você fez remotamente usar include_vars: {{ varfile }}. O conteúdo de {{ varfile }}deve ser um dicionário da forma {"key":"value"}, você descobrirá que o ansible causa problemas se incluir um espaço após os dois pontos.

DR1979
fonte
7
Isso não faz sentido. include_varsfunciona localmente na máquina de controle, não com arquivos no destino.
techraf de