unarchive - Ansible-Grava várias linhas de saída no arquivo




script ansible (2)

O que estou fazendo errado ?

lineinfile módulo lineinfile não executa a ação "adicionar uma linha a um arquivo", mas garante que uma determinada linha esteja presente no arquivo. Se todos os nós de destino tiverem a mesma versão, ele não adicionará a mesma linha várias vezes.

Por outro lado, o módulo de copy estava substituindo o arquivo.

Se você precisar registrar valores para todos os hosts, poderá criar, por exemplo, um modelo que fará um loop sobre os hosts no grupo kubernetes :

- copy:
    content: "{% for host in groups.kubernetes %}{{ hostvars[host].k8s_version }}\n{% endfor %}"
    dest: /tmp/test
  delegate_to: localhost
  run_once: true

Outra maneira seria extrair os valores com o map de hostvars , mas, como você deseja apenas os valores do grupo de kubernetes do kubernetes , não tenho certeza se seria mais bonito. E ter um for no modelo permite adicionar facilmente nomes de host.

Estou usando o ansible para coletar informações de nós remotos e, em seguida, as utilizarei para atualizar os RPMs relevantes.

O problema que estou enfrentando é o número da versão da coleção de vários aplicativos e gravá-los em um arquivo.

Livro de cantadas:

---
  - name: Check Application Versions
    hosts: kubernetes
    tasks:
       - name: Check K8S version.
         shell: kubectl --version
         register: k8s_version

       - debug: msg="{{ k8s_version.stdout }}"

Arquivo de inventário:

[kubernetes]
172.29.219.102 
172.29.219.105 
172.29.219.104 
172.29.219.103 

Resultado:

TASK [debug] *******************************************************************
ok: [172.29.219.102] => {
    "msg": "Kubernetes v1.4.0"
}
ok: [172.29.219.103] => {
    "msg": "Kubernetes v1.4.0"
}
ok: [172.29.219.105] => {
    "msg": "Kubernetes v1.4.0"
}
ok: [172.29.219.104] => {
    "msg": "Kubernetes v1.4.0"
}

A porção acima é simples e funciona. Agora eu quero gravar a saída no arquivo.

Agora estou tentando escrever essas informações em um arquivo. Quero algo como:

Kubernetes v1.4.0 Kubernetes v1.4.0 Kubernetes v1.4.0 Kubernetes v1.4.0

Então eu adicionei a linha abaixo:

- local_action: copy content={{ k8s_version.stdout_lines }} dest=/tmp/test

Meu /tmp/test parece com:

# cat /tmp/test 
["Kubernetes v1.4.0"]

Existe apenas um valor aqui.

Eu tentei fazer algo diferente então.

- local_action: lineinfile dest=/tmp/foo line="{{ k8s_version.stdout }}" insertafter=EOF

Isso resultou em:

# cat  /tmp/foo 
Kubernetes v1.4.0

Estou tentando descobrir por que vejo apenas um valor, enquanto devo ver as versões de cada nó no meu arquivo de inventário. O que estou fazendo errado?


De acordo com este post

Resultado de registro possível de vários comandos

sua variável desejada está em k8s_version.results Para acessá-la, você precisa trabalhar com um modelo no qual apenas itera:

- local_action: template src=my_nodes.j2 dest=/tmp/test

E os modelos de templates/my_nodes.j2 :

 {% for res in k8s_version.results %}
     {{ res.stdout }}
 {% endfor %}

O manual completo seria então:

---
  - name: Check Application Versions
    hosts: kubernetes
    tasks:
       - name: Check K8S version.
         shell: kubectl --version
         register: k8s_version

       - local_action: template src=my_nodes.j2 dest=/tmp/test