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.


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 }}"

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 }}"

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.


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.


7
Isso não faz sentido. include_varsfunciona localmente na máquina de controle, não com arquivos no destino.
techraf de
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.