(Relacionado a retornos de chamada ou ganchos e séries reutilizáveis de tarefas, em funções Ansible ):
Existe uma maneira melhor de acrescentar 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, parece não estar 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) que precisam fornecer alguma configuração a 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 bdr
e pg_stat_statements
deve aparecer na 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 uma regexp que extrai o valor atual, analisa e depois reescreve? Em caso afirmativo, como você torna esse idempotente em várias execuções?
E se a configuração for mais difícil do que isso para analisar e não for tão simples quanto acrescentar outro valor separado por vírgula? Pense nos arquivos de configuração XML.
Respostas:
Você pode mesclar duas listas em uma variável com
+
. Digamos que você tenha umgroup_vars
arquivo com este conteúdo:E é usado em um modelo
pgsql.conf.j2
como:Em seguida, você pode anexar extensões aos servidores de banco de dados de teste como este:
Quando a função é executada em qualquer um dos servidores de teste, as extensões adicionais serão adicionadas.
Não tenho certeza de que isso funcione também para dicionários, e também tenha cuidado com os espaços e deixe uma vírgula pendente no final da linha.
fonte
group_vars
, as funções não podem cuidar dos detalhes da configuração das extensões. É anexar vários dos papéis que estou procurando particularmente, para que um papel possa ser anexado a um var exposto por outro papel.with_items
frase.Desde o Ansible v2.x, você pode fazer o seguinte:
tudo isso está documentado em: http://docs.ansible.com/ansible/playbooks_filters.html
fonte
u'(': u\"'\"}"
2.4.x
(fixo)set_fact: my_dict_var: '{{my_dict_var|default({})|combine({item[0]: item[1]})}}'
. O erro indefinido ocorre quando alguma filtragem é usada ou nenhum resultado é registrado.você precisa dividir o loop em 2
e addhost.yml
fonte
Não tenho certeza quando eles adicionaram isso, mas pelo menos para dicionários / hashes (NOT lists / matrizes), você pode definir a variável hash_behaviour , assim:
hash_behaviour = merge
no seuansible.cfg
.Levei algumas horas para acidentalmente tropeçar nessa configuração: S
fonte
Quase todas as respostas aqui exigem alterações nas tarefas, mas eu precisava mesclar dinamicamente dicionários na definição de vars, não durante a execução.
Por exemplo, eu quero definir alguns vars compartilhados
all
group_vars
e depois quero estendê-los em algum outrogroup
ouhost_vars
. Muito útil ao trabalhar para funções.Se você tentar usar os filtros
combine
ouunion
substituindo a variável original nos arquivos var, você terminará em loop infinito durante a modelagem, por isso criei essa 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
group_vars/group1.yml
snippet de código de função
do_some_stuff.yml
É apenas um trecho, mas você deve ter uma ideia de como funciona. note: lookup ('varnames', '') está disponível desde o ansible 2.8
Eu 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 configurá-lo dinamicamente.
fonte
Ansible
é um sistema de automação e, no que diz respeito ao gerenciamento de arquivos de configuração, não é muito diferenteapt
. A razão pela qual mais e mais softwares oferece o recurso de ler trechos de configuração de umconf.d
diretório é permitir que esses sistemas de automação tenham diferentes pacotes / funções que adicionem configuração ao software. Acredito que não é a filosofia deAnsible
fazer o que você tem em mente, mas sim usar oconf.d
truque. Se o software que está sendo configurado não oferecer essa funcionalidade, você poderá estar com problemas.Como você menciona os arquivos de configuração XML, aproveito a oportunidade para reclamar. Há uma razão para a tradição do Unix de usar arquivos de configuração de texto sem formatação. Os arquivos de configuração binária 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 sem formatação, deve examinar seu cérebro.)
Agora, sobre o seu
PostgreSQL
problema específico .PostgreSQL
suporta oconf.d
truque. Primeiro, eu verificaria seshared_preload_libraries
pode ser especificado várias vezes. Não encontrei nenhuma dica na documentação que possa, mas ainda a tentaria. Se não puder ser especificado várias vezes, eu explicaria meu problema para osPostgreSQL
caras, caso eles tenham idéias; isso é umPostgreSQL
problema e não umAnsible
problema. Se não houver solução e eu realmente não puder mesclar as diferentes funções em uma, implementaria um sistema para compilar a configuração no host gerenciado. Neste caso, eu provavelmente criar um script/usr/local/sbin/update_postgresql_config
que compile/etc/postgresql/postgresql.conf.jinja
em/etc/postgresql/9.x/main/postgresql.conf
. O script lê as bibliotecas compartilhadas de pré-carregamento de/etc/postgresql/shared_preload_libraries.txt
, uma biblioteca por linha, e as fornece ao jinja.Não é incomum os sistemas de automação fazerem isso. Um exemplo é o
exim4
pacote Debian .fonte
conf.d
mecanismo de inclusão e, felizmente, usa arquivos de texto sem formatação. No entanto, existem algumas opções de configuração em que várias extensões podem ter opiniões sobre isso - por exemplo, "aumente max_wal_senders em 10 do que era antes".