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 / server / Perguntas / 685673
Accepted
Craig Ringer
Craig Ringer
Asked: 2015-04-27 06:17:35 +0800 CST2015-04-27 06:17:35 +0800 CST 2015-04-27 06:17:35 +0800 CST

Anexar a listas ou adicionar chaves a dicionários no Ansible

  • 772

(Relacionado a callbacks ou ganchos e séries reutilizáveis ​​de tarefas, em papéis Ansible ):

Existe alguma maneira melhor de anexar a uma lista ou adicionar uma chave a um dicionário no Ansible do que (ab) usando uma expressão de modelo jina2?

Eu sei que você pode fazer algo como:

- name: this is a hack
  shell: echo "{% originalvar.append('x') %}New value of originalvar is {{originalvar}}"

mas não há realmente nenhum tipo de meta-tarefa ou auxiliar para fazer isso?

Parece frágil, não documentado e depende de muitas suposições sobre como as variáveis ​​funcionam no Ansible.

Meu caso de uso são várias funções (extensões de servidor de banco de dados), cada uma precisa fornecer alguma configuração para uma função base (o servidor de banco de dados). Não é tão simples quanto anexar uma linha ao arquivo de configuração do servidor db; cada alteração se aplica à mesma linha , por exemplo, as extensões bdre pg_stat_statementsambas devem aparecer em uma linha de destino:

shared_preload_libaries = 'bdr, pg_stat_statements'

A maneira Ansible de fazer isso é apenas processar o arquivo de configuração várias vezes (uma vez por extensão) com um regexp que extrai o valor atual, analisa-o e o reescreve? Em caso afirmativo, como você torna isso idempotente em várias execuções?

E se a configuração for mais difícil de analisar e não for tão simples quanto acrescentar outro valor separado por vírgula? Pense em arquivos de configuração XML.

ansible
  • 6 6 respostas
  • 128794 Views

6 respostas

  • Voted
  1. Max Kovgan
    2016-12-10T01:28:23+08:002016-12-10T01:28:23+08:00

    Desde o Ansible v2.x, você pode fazer o seguinte:

    # use case I: appending to LIST variable:
    - name: my appender
      set_fact:
        my_list_var: '{{my_list_myvar + new_items_list}}'
    
    # use case II: appending to LIST variable one by one:
    - name: my appender
      set_fact:
        my_list_var: '{{my_list_var + [item]}}'
      with_items: '{{my_new_items|list}}'
    
    # use case III: appending more keys DICT variable in a "batch":
    - name: my appender
      set_fact:
        my_dict_var: '{{my_dict_var|combine(my_new_keys_in_a_dict)}}'
    
    # use case IV: appending keys DICT variable one by one from tuples
    - name: setup list of tuples (for 2.4.x and up
      set_fact:
        lot: >
          [('key1', 'value1',), ('key2', 'value2',), ..., ('keyN', 'valueN',)],
    - name: my appender
      set_fact:
        my_dict_var: '{{my_dict_var|combine({item[0]: item[1]})}}'
      with_items: '{{lot}}'
    
    # use case V: appending keys DICT variable one by one from list of dicts (thanks to @ssc)
    - name: add new key / value pairs to dict
      set_fact:
        my_dict_var: "{{ my_dict_var | combine({item.key: item.value}) }}"
      with_items:
      - { key: 'key01', value: 'value 01' }
      - { key: 'key02', value: 'value 03' }
      - { key: 'key03', value: 'value 04' }
    

    todos os itens acima estão documentados em: https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#combining-hashes-dictionaries

    • 48
  2. Best Answer
    GnP
    2015-06-27T08:51:06+08:002015-06-27T08:51:06+08:00

    Você pode mesclar duas listas em uma variável com +. Digamos que você tenha um group_varsarquivo com este conteúdo:

    ---
    # group_vars/all
    pgsql_extensions:
      - ext1
      - ext2
      - ext3
    

    E é usado em um modelo pgsql.conf.j2como:

    # {{ ansible_managed }}
    pgsql_extensions={% for item in pgsql_extensions %}{{ item }}, {% endfor %}
    

    Você pode anexar extensões aos servidores de banco de dados de teste como este:

    ---
    # group_vars/testing_db
    append_exts:
      - ext4
      - ext5
    pgsql_extensions: "{{ pgsql_extensions + append_exts }}"
    

    Quando a função for executada em qualquer um dos servidores de teste, as extensões adicionais serão adicionadas.

    Não tenho certeza se isso também funciona para dicionários, e também tome cuidado com os espaços e deixe uma vírgula pendente no final da linha.

    • 19
  3. Arthur Tsang
    2016-03-16T09:05:31+08:002016-03-16T09:05:31+08:00

    você precisa dividir o loop em 2

    ---
    - hosts: localhost
      tarefas:
        - include_vars: pilhas
        - set_facts: funções={{stacks.Roles | dividir(' ')}}
        - incluir: addhost.yml
          with_items: "{{roles}}"
    

    e addhost.yml

    - set_facts: groupname={{item}}
    - set_facts: ips={{stacks[item]|split(' ')}}
    - local_action: add_host hostname={{item}} groupname={{groupname}}
      with_items: {{ips}}
    
    • 3
  4. VeselaHouba
    2019-10-22T03:24:00+08:002019-10-22T03:24:00+08:00

    Quase todas as respostas aqui requerem mudanças nas tarefas, mas eu precisava mesclar dinamicamente os dicionários na definição de vars, não durante a execução.

    Por exemplo, eu quero definir alguns vars compartilhados all group_varse, em seguida, quero estendê-los em algum outro groupou host_vars. Muito útil ao trabalhar para funções.

    Se você tentar usar os filtros combineou unionsubstituindo a variável original em arquivos var, você terminará em loop infinito durante a modelagem, então criei esta solução alternativa (não é solução).

    Você pode definir várias variáveis ​​com base em algum padrão de nome e carregá-las automaticamente na função.

    group_vars/all.yml

    dictionary_of_bla:
      - name: blabla
        value1 : blabla
        value2 : blabla
    

    group_vars/group1.yml

    dictionary_of_bla_group1:
      - name: blabla2
        value1 : blabla2
        value2 : blabla2
    

    trecho de código de função

    tasks:
      - name: Run for all dictionary_of_bla.* variations
        include_tasks: do_some_stuff.yml
        with_items: "{{ lookup('varnames','dictionary_of_bla.*').split(',') }}"
        loop_control:
          loop_var: _dictionary_of_bla
    

    do_some_stuff.yml

    - name: do magic
      magic:
        trick_name: item.name
        trick_value1: item.value1
        trick_value2: item.value2
      with_items: "{{ vars[_dictionary_of_bla] }}"
    

    É apenas um trecho, mas você deve ter uma ideia de como funciona. nota: lookup('varnames','') está disponível desde ansible 2.8

    Acho que também seria possível mesclar todas as variáveis dictionary_of_bla.*​​em um dicionário durante o tempo de execução usando a mesma pesquisa.

    A vantagem dessa abordagem é que você não precisa definir listas exatas de nomes de variáveis, mas apenas o padrão e o usuário podem defini-la dinamicamente.

    • 3
  5. nuts
    2018-08-09T02:51:14+08:002018-08-09T02:51:14+08:00

    Não tenho certeza de quando eles adicionaram isso, mas pelo menos para dicionários/hashes (NÃO listas/arrays), você pode definir a variável hash_behaviour , assim: hash_behaviour = mergeem seu arquivo ansible.cfg.

    Levei algumas horas para tropeçar acidentalmente nessa configuração: S

    • 2
  6. Antonis Christofides
    2015-04-28T23:01:49+08:002015-04-28T23:01:49+08:00

    Ansibleé um sistema de automação e, em relação ao gerenciamento de arquivos de configuração, não é muito diferente do apt. A razão pela qual cada vez mais software oferece o recurso para ler trechos de configuração de um conf.ddiretório é permitir que esses sistemas de automação tenham diferentes pacotes/funções para adicionar configuração ao software. Acredito que não seja a filosofia de Ansiblefazer o que você tem em mente, mas sim usar o conf.dtruque. Se o software que está sendo configurado não oferece essa funcionalidade, você pode estar com problemas.

    Já que você mencionou arquivos de configuração XML, aproveito a oportunidade para reclamar. Há uma razão para a tradição Unix de usar arquivos de configuração de texto simples. Os arquivos de configuração binários não se prestam bem à automação do sistema, portanto, qualquer tipo de formato binário causará problemas e provavelmente exigirá que você crie um programa para lidar com a configuração. (Se alguém pensa que XML é um formato de texto simples, deveria ter seus cérebros examinados.)

    Agora, no seu PostgreSQLproblema específico. PostgreSQLsuporta o conf.dtruque. Primeiro, eu verificaria se shared_preload_librariespode ser especificado várias vezes. Não encontrei nenhuma dica na documentação de que possa, mas ainda assim tentaria. Se não puder ser especificado várias vezes, eu explicaria meu problema para os PostgreSQLcaras caso eles tivessem ideias; isso é um PostgreSQLproblema e não um Ansibleproblema. Se não houver solução e eu realmente não conseguir mesclar as diferentes funções em uma, implementaria um sistema para compilar a configuração no host gerenciado. Nesse caso, provavelmente criaria um script /usr/local/sbin/update_postgresql_configque compilaria /etc/postgresql/postgresql.conf.jinjaem /etc/postgresql/9.x/main/postgresql.conf. O script leria as bibliotecas de pré-carregamento compartilhadas de /etc/postgresql/shared_preload_libraries.txt, uma biblioteca por linha e as forneceria para jinja.

    Não é incomum que os sistemas de automação façam isso. exim4Um exemplo é o pacote Debian .

    • -5

relate perguntas

Sidebar

Stats

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

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

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