AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77106000
Accepted
AbreQueVoy
AbreQueVoy
Asked: 2023-09-14 22:39:44 +0800 CST2023-09-14 22:39:44 +0800 CST 2023-09-14 22:39:44 +0800 CST

Como extrair vários hostvars de todos os hosts de um grupo?

  • 772

É uma continuação de um problema resolvido nesta questão .

É necessário adicionar outra variável dos hosts, o INSTANCE_CLASS. Variáveis ​​de hosts são salvas como arquivos sem extensão no host_varsdiretório, carregando nomes de host como nomes de arquivos, por exemplo host12:

---
ansible_host: 10.11.12.15
INSTANCE_CLASS: vm_host
...

A extração de hostvar de vários hosts foi descrita na pergunta vinculada; no entanto, quando tentei criar uma lista de dicionários em vez de uma lista de strings, os resultados não foram os esperados.

Tentativa nº 1:

  hosts: general
  gather_facts: false
  vars:
    ip_list: "{{ ansible_play_hosts_all | map('extract', hostvars, 'ansible_hostname') }}"
  tasks:
    - name: Get all IPs
      set_fact:
        ne_hosts:
          - ip: "{{ hostvars[item]['ansible_host'] }}"
            instance_class: "{{ hostvars[item]['INSTANCE_CLASS'] }}"
      loop: "{{ ip_list }}"
      delegate_to: localhost
      delegate_facts: true
      run_once: true
-
  hosts: localhost
  gather_facts: false
  tasks:
    - name: Display gathered IPs
      debug:
        var: ne_hosts

Este substitui as variáveis ​​anteriores, deixando apenas a última no array:

TASK [Display gathered IPs] ***************************************************************************************************************************************
ok: [localhost] => {
    "ne_hosts": [
        {
            "instance_class": "mdd_controller",
            "ip": "10.11.12.19"
        }
    ]
}

Tentativa nº 2:

  hosts: general
  gather_facts: false
  vars:
    ip_list: "{{ ansible_play_hosts_all | map('extract', hostvars, 'ansible_host') }}" ### changed var
  tasks:
    - name: Get all IPs
      set_fact:
        ne_hosts: "ip: {{ ip_list }}, instance_class: {{ INSTANCE_CLASS }}" ### changed line
      delegate_to: localhost
      delegate_facts: true
      run_once: true
-
  hosts: localhost
  gather_facts: false
  tasks:
    - name: Display gathered IPs
      debug:
        var: ne_hosts

Este fornece a lista completa de IPs, mas apenas a última classe de instância é exibida:

TASK [Display gathered IPs] ***************************************************************************************************************************************
ok: [localhost] => {
    "ne_hosts": "ip: ['10.11.12.15', '10.11.12.19'], instance_class: mdd_controller"
}

O que fazer para receber algo como:

"ne_hosts": "[
    {ip: '10.11.12.15', instance_class: vm_host},
    {ip: '10.11.12.19', instance_class: mdd_controller}
]"

?

ansible
  • 2 2 respostas
  • 26 Views

2 respostas

  • Voted
  1. Best Answer
    Vladimir Botka
    2023-09-15T00:53:06+08:002023-09-15T00:53:06+08:00

    A declaração abaixo dá o que você deseja

    ne_hosts: "{{ ansible_play_hosts_all|
                  map('extract', hostvars)|
                  json_query('[].{ip: ansible_host,
                                  instance_class: INSTANCE_CLASS}') }}"
    

    Por exemplo, dado o inventário

    shell> cat hosts
    [general]
    host11
    host12
    host13
    

    e o host_vars

    shell> cat host_vars/host11
    ansible_host: 10.1.0.11
    INSTANCE_CLASS: vm_host_11
    
    shell> cat host_vars/host12
    ansible_host: 10.1.0.12
    INSTANCE_CLASS: vm_host_12
    
    shell> cat host_vars/host13
    ansible_host: 10.1.0.13
    INSTANCE_CLASS: vm_host_13
    

    O manual

    shell> cat pb.yml
    - hosts: general
    
      vars:
    
        ne_hosts: "{{ ansible_play_hosts_all|
                      map('extract', hostvars)|
                      json_query('[].{ip: ansible_host,
                                      instance_class: INSTANCE_CLASS}') }}"
      tasks:
    
        - debug:
            msg: "ansible_host: {{ ansible_host }} INSTANCE_CLASS: {{ INSTANCE_CLASS }}"
        - debug:
            var: ne_hosts|to_yaml
          run_once: true
    

    dá (resumido)

      ne_hosts:
        - {instance_class: vm_host_11, ip: 10.1.0.11}
        - {instance_class: vm_host_12, ip: 10.1.0.12}
        - {instance_class: vm_host_13, ip: 10.1.0.13}
    

    Nota: A declaração acima funciona porque os apresentadores da peça estão limitados ao grupo geral . Portanto a lista ansible_play_hosts_all mantém os mesmos itens de groups.general . Para responder à sua pergunta:

    P: "Como extrair vários hostvars de todos os hosts de um grupo?"

    R: Uma resposta melhor poderia ser

    ne_hosts: "{{ groups.general|
                  map('extract', hostvars)|
                  json_query('[].{ip: ansible_host,
                                  instance_class: INSTANCE_CLASS}') }}"
    
    • 2
  2. jsxqf
    2023-09-14T23:27:27+08:002023-09-14T23:27:27+08:00

    Basicamente, você está perguntando como anexar um array no ansible.

    Experimente isto:

    - hosts: general
      gather_facts: false
      vars:
        ip_list: "{{ ansible_play_hosts_all | map('extract', hostvars, 'ansible_hostname') }}"
        ne_hosts: [] # initial empty array
      tasks:
        - name: Get all IPs
          set_fact:
            ne_hosts: "{{ ne_hosts  + [{'ip': hostvars[item]['ansible_host'] , 'instance_class': hostvars[item]['INSTANCE_CLASS'] }] }}" # append object
          loop: "{{ ip_list }}"
          delegate_to: localhost
          delegate_facts: true
          run_once: true
    
    - hosts: localhost
      gather_facts: false
      tasks:
        - name: Display gathered IPs
          debug:
            var: ne_hosts
    
    • 1

relate perguntas

  • Execute a tarefa ansible apenas uma vez no localhost

  • Como registrar variável no loop Ansible?

  • É possível usar o registro para atribuir a origem do arquivo dinamicamente no Ansible? [fechado]

  • Comparando duas listas depois de passar pelo mapa Ansible ('regex_replace')

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve