Como usar o módulo de modelo Ansible

Como usar o módulo de modelo Ansible
O Ansible modelo O módulo é usado principalmente para copiar arquivos do cliente Ansible (onde o Ansible é instalado) para os hosts Ansible (gerenciados pela Ansible). O benefício de usar o modelo módulo, em vez do cópia de módulo, é o Ansible modelo Módulo pode usar a linguagem de modelos Jinja2. Jinja2 é uma poderosa linguagem de modelos python, através da qual você pode gerar arquivos de configuração, páginas da web, etc. Você também pode usar variáveis, loops e condições de fatos Ansible em seus modelos Jinja2.

Este artigo mostrará como usar o Ansible modelo módulo e alguns princípios básicos da linguagem de modelos Jinja2. Então vamos começar!

Pré -requisitos


Se você deseja experimentar os exemplos neste artigo:

1) Você deve ter o Ansible instalado em seu computador.

2) Você deve ter pelo menos um host Ubuntu/Debian ou um host CentOS/RHEL 8 configurado para Ansible Automation.

Existem muitos artigos sobre Linuxhint dedicados à instalação do Ansible e configurando hosts para Ansible Automation. Você pode verificar isso também, se necessário.

Configurando um diretório de projeto Ansible

Antes de avançarmos, é uma boa ideia criar uma estrutura de diretório de projeto, apenas para manter as coisas um pouco organizadas.

Para criar um diretório de projeto modelo-demão/ E todos os subdiretos necessários (em seu diretório de trabalho atual), execute o seguinte comando:

$ mkdir -pv modelo -demodos/playbooks/modelos

Depois que o diretório do projeto for criado, navegue até o diretório do projeto, como segue:

$ cd

Criar uma anfitriões Arquivo de inventário, como segue:

$ nano hosts

Em seguida, adicione o nome IP do host ou DNS (VM1.NodeKite.com e VM2.NodeKite.com) no arquivo de inventário.

Depois de terminar esta etapa, salve o arquivo pressionando + X, seguido pela Y e .

Crie um arquivo de configuração Ansible no diretório do projeto, como segue:

$ Nano Ansible.cfg

Em seguida, digite as seguintes linhas no Ansible.cfg arquivo.

Depois de terminar esta etapa, salve o arquivo pressionando + X, seguido pela Y e .

Neste ponto, o diretório do projeto deve parecer o seguinte:

$ árvore

Como você pode ver, os anfitriões Ansible também são acessíveis. Então, podemos passar para a próxima seção deste artigo.

$ Ansible All -u Ansible -M Ping

Básico do módulo de modelo Ansible

O modelo O módulo de Ansible aceita as mesmas opções que o cópia de módulo de Ansible.

Ansible comum modelo Opções do módulo:

src - O caminho do arquivo de modelo Jinja2 no seu computador, que será analisado pela linguagem Jinja2 de modelos e copiado para os hosts remotos.
dest - O caminho de destino nos hosts remotos aos quais o arquivo será copiado.
proprietário - O proprietário do arquivo nos hosts remotos.
grupo - O grupo do arquivo nos hosts remotos.
modo - O modo de permissão do arquivo nos hosts remotos.

Vamos ver um exemplo.

Primeiro, crie um novo manual Ansible copy_file_template1.Yaml no Playbooks/ Diretório, como segue:

$ nano playbooks/copy_file_template1.Yaml

Em seguida, digite as seguintes linhas no copy_file_template1.Yaml livro de cantadas.

- Hosts: todos
Usuário: Ansible
tarefas:
- Nome: Índice de cópia.arquivo html para servidor
modelo:
SRC: índice.Jinja2
dest:/home/Ansible/índice.html
Proprietário: Ansible
Grupo: Ansible
Modo: 0644

Este manual vai copiar o índice.Jinja2 arquivo do Playbooks/modelos/ diretório (em relação ao seu diretório de projeto) para os hosts remotos usando o Ansible modelo módulo.

Depois de terminar esta etapa, salve o arquivo pressionando + X, seguido pela Y e .

Crie o índice.Jinja2 arquivo de modelo no Playbooks/modelos Diretório, como segue:

$ nano Playbooks/modelos/índice.Jinja2

Digite as seguintes linhas no índice.Jinja2 Arquivo de modelo:




Demonstração de modelo Jinja2


Bem -vindo ao Linuxhint!



Este é apenas um arquivo html simples. Eu não usei nenhuma sintaxe de Jinja2 sofisticada aqui.

Depois de terminar esta etapa, salve o arquivo pressionando + X, seguido pela Y e .

Execute o manual copy_file_template1.Yaml do seguinte modo:

$ Ansible-Playbook Playbooks/copy_file_template1.Yaml

O manual deve correr com sucesso.

Como você pode ver, o índice.Jinja2 Modelo foi renderizado usando a linguagem de modelos Jinja2. O conteúdo renderizado deve ser copiado para o índice.html arquivo dos hosts remotos.

Variáveis ​​de impressão no modelo Jinja2

Você pode usar fatos, variáveis ​​e variáveis ​​definidas pelo usuário em seus modelos Jinja2.

No seu modelo Jinja2, você pode imprimir o valor de uma variável usando o nome variável sintaxe. Se a variável for um objeto, você pode imprimir propriedades individuais de objeto usando o objectVariable.nome da propriedade sintaxe.

No exemplo a seguir, imprimiremos o data propriedade do Ansible_date_time objeto em nosso índice.Jinja2 modelo.

$ Ansible All -u Ansible -M Setup | EGREP -DATA DA EM CORA |

Primeiro, abra o índice.Jinja2 Arquivo de modelo com o editor de texto Nano, como segue:

$ nano Playbooks/modelos/índice.Jinja2

Adicione a seguinte linha ao índice.Jinja2 Arquivo de modelo:

Página gerada em Ansible_date_time.data

O final índice.Jinja2 O arquivo deve procurar como mostrado na captura de tela abaixo.

Depois de terminar esta etapa, salve o arquivo pressionando + X, seguido pela Y e .

Execute o manual copy_file_template1.Yaml do seguinte modo:

$ Ansible-Playbook Playbooks/copy_file_template1.Yaml

Como você pode ver, o índice.Jinja2 modelo foi processado pela linguagem Jinja2 de modelagem e substituiu o Ansible_date_time.data variável com a data em AAAA-MM-DD formatar. A saída foi então copiada para o índice.html arquivo no host remoto.

Modelo Condicional IF no Jinja2

A linguagem de modelos Jinja2 suporta condicional se declarações. Você pode verificar certas variáveis ​​antes de imprimir qualquer coisa usando o se declaração.

O Jinja2 se A sintaxe é a seguinte:

% se condição %
Faça algo se a condição for verdadeira
% fim se %

Vamos ver um exemplo do Jinja2 se declaração.

Nesta seção, vou demonstrar o Jinja2 se declaração usando o Ansible_distribution Variável de fatos.

$ Ansible All -u Ansible -M Setup | egrep -cor 'dist'

Primeiro, abra o índice.Jinja2 Jinja2 modelo com o editor de texto Nano, como segue:

$ nano Playbooks/modelos/índice.Jinja2

Em seguida, adicione as seguintes linhas no índice.Jinja2 Arquivo de modelo:

% se Ansible_distribution == "Debian" %

Você está executando o Debian Linux


% fim se %

Aqui, eu verifiquei se Ansible_distribution é Debian. Se for, então imprima a string

Você está executando o Debian Linux

. Caso contrário, não imprimi -lo.

finalmente, o índice.Jinja2 O arquivo de modelo deve procurar como mostrado na captura de tela abaixo.

Depois de editar o arquivo, salve o arquivo pressionando + X, seguido pela Y e .

Agora, execute o manual copy_file_template1.Yaml do seguinte modo:

$ Ansible-Playbook Playbooks/copy_file_template1.Yaml

Como você pode ver, no meu host remoto do Debian, o índice.html O arquivo tem a linha

Você está executando o Debian Linux

. No entanto, no meu host remoto do CentOS, a linha não está presente. Então, o Jinja2 se condição está funcionando.

Condicional: declaração IF-Else no modelo Jinja2

A linguagem de modelos Jinja2 suporta condicional if-else declarações. Você pode imprimir uma coisa se a condição corresponde e imprimir outra coisa se não usar o if-else declaração.

O Jinja2 if-else A sintaxe é a seguinte:

% se condição %
Faça algo se a condição for verdadeira
% outro %
Fazer algo se a condição for falsa
% fim se %

Vamos ver um exemplo do Jinja2 if-else declaração.

Primeiro, abra o índice.Jinja2 Jinja2 modelo com o editor de texto Nano, como segue:

$ nano Playbooks/modelos/índice.Jinja2

Em seguida, adicione as seguintes linhas no índice.Jinja2 Arquivo de modelo:

% se Ansible_distribution == "Debian" %

Você está executando o Debian Linux


% outro %

Você não está executando o debian linux


% fim se %

Aqui, eu verifiquei se Ansible_distribution é Debian. Se for, então imprima a string

Você está executando o Debian Linux

. Caso contrário, imprima

Você não está executando o debian linux

.

finalmente, o índice.Jinja2 O arquivo de modelo deve procurar como mostrado na captura de tela abaixo.

Depois de editar o arquivo, salve o arquivo pressionando + X, seguido pela Y e .

Execute o manual copy_file_template1.Yaml do seguinte modo:

$ Ansible-Playbook Playbooks/copy_file_template1.Yaml

Como você pode ver, no meu host remoto do Debian, o índice.html O arquivo tem a linha

Você está executando o Debian Linux

. Mas no meu host remoto do CentOS, o índice.html O arquivo tem a linha

Você não está executando o debian linux

. Então, o Jinja2 if-else condição está funcionando.

Condicional: declaração IF-Elif no modelo Jinja2

A linguagem de modelos Jinja2 suporta condicional if-elif declarações.

O Jinja2 if-elif A sintaxe é a seguinte:

% se condicionado1 %
Faça algo se a condição1 for verdadeira
% elif condicion2 %
Faça algo se a condição2 for verdadeira
% elif condição3 %
Faça algo se a condição3 for verdadeira
..
% elif conditionN %
Faça algo se a condição não for verdadeira
% outro %
Faça algo se nenhuma das condições for verdadeira
% fim se %

Aqui o % outro % a seção é opcional, mas está lá se você precisar.

Vamos ver um exemplo do Jinja2 if-elif declaração.

Primeiro, abra o índice.Jinja2 Jinja2 modelo com o editor de texto Nano, como segue:

$ nano Playbooks/modelos/índice.Jinja2

Em seguida, adicione as seguintes linhas no índice.Jinja2 Arquivo de modelo:

% se Ansible_distribution == "Debian" %

Você está executando o Debian Linux


% elif Ansible_distribution == "CentOS" %

Você está executando o CentOS Linux


% outro %

Seu sistema operacional não é suportado


% fim se %

Aqui, eu verifiquei se Ansible_distribution é Debian. Se for, então imprima a string

Você está executando o Debian Linux

.

Eu também verifiquei se Ansible_distribution é CENTOS. Se for, então imprima a string

Você está executando o CentOS Linux

.

Caso contrário, imprima

Seu sistema operacional não é suportado

.

finalmente, o índice.Jinja2 O arquivo de modelo deve procurar como mostrado na captura de tela abaixo.

Depois de editar o arquivo, salve o arquivo pressionando + X, seguido pela Y e .

Execute o manual copy_file_template1.Yaml do seguinte modo:

$ Ansible-Playbook Playbooks/copy_file_template1.Yaml

Como você pode ver, no meu host remoto do Debian, o índice.html O arquivo tem a linha

Você está executando o Debian Linux

.

No meu host remoto do CentOS, o índice.html O arquivo tem a linha

Você está executando o CentOS Linux

.

Se eu tivesse outro host remoto executando um sistema operacional que não o Debian ou CentOS, ele teria a linha

Seu sistema operacional não é suportado

no índice.html arquivo.

Então, o Jinja2 if-elif condição está funcionando.

Loops in Jinja2 modelo

Você também pode imprimir matrizes e objetos usando loops em Jinja2.
O Jinja2 para A sintaxe do loop é a seguinte:

% para variatlebleName em ArrayName %
Faça algo com VaribleName
% endfor %

Aqui, em cada iteração da matriz ArrayName, Um dos elementos da matriz (a partir do início da matriz) é atribuído ao nome variável variável. Você pode fazer algo com essa variável dentro do loop.

Vamos ver como você pode imprimir elementos da matriz em seu modelo Jinja2 no exemplo a seguir.

Primeiro, abra o copy_file_template1.Yaml Ansible Playbook com o editor de texto Nano, como segue:

$ nano playbooks/copy_file_template1.Yaml

Em seguida, adicione as seguintes linhas no copy_file_template1.Yaml Arquivo de Playbook:

VARs:
menus:
- Lar
- Produtos
- Sobre nós
- Contate-nos

Aqui, eu adicionei um menus Array no copy_file_template1.Yaml livro de cantadas. Em seguida, vou imprimir os elementos da matriz usando um loop no meu índice.Jinja2 Arquivo de modelo Jinja2.

finalmente, o copy_file_template1.Yaml O arquivo de playbook deve procurar como mostrado na captura de tela abaixo.

Depois de editar o arquivo, salve o arquivo pressionando + X, seguido pela Y e .

Agora, abra o índice.Jinja2 Jinja2 modelo com o editor de texto Nano, como segue:

$ nano Playbooks/modelos/índice.Jinja2

Adicione as seguintes linhas no índice.Jinja2 Arquivo de modelo:

Aqui, estou gerando uma simples barra de navegação HTML usando um Jinja2 para laço. O loop itera através do menus Array (que eu defini no copy_file_template1.Playbook Yaml) elementos e gera um cardápio item em cada iteração.

finalmente, o índice.Jinja2 O arquivo de modelo deve procurar como mostrado na captura de tela abaixo.

Depois de editar o arquivo, salve o arquivo pressionando + X, seguido pela Y e .

Execute o manual copy_file_template1.Yaml do seguinte modo:

$ Ansible-Playbook Playbooks/copy_file_template1.Yaml

Como você pode ver, o Jinja2 para O loop gerou uma barra de navegação HTML (no índice.html arquivo).

Você também pode acessar uma variedade de objetos em seu modelo Jinja2.

Vamos ver outro exemplo.

Primeiro, abra o copy_file_template1.Yaml Ansible Playbook com o editor de texto Nano, como segue:

$ nano playbooks/copy_file_template1.Yaml

Em seguida, adicione as seguintes linhas no copy_file_template1.Yaml Arquivo de Playbook:

VARs:
menus:
- Nome: Home
link: /home
- Nome: Produtos
link: /produtos
- Nome: Sobre nós
link: /about-us
- Nome: Entre em contato conosco
link: /contact-us

Aqui, eu adicionei um menus matriz de objetos no copy_file_template1.Yaml livro de cantadas. Cada um desses objetos tem duas propriedades, um nome propriedade e a link propriedade.

finalmente, o copy_file_template1.Yaml O arquivo de playbook deve procurar como mostrado na captura de tela abaixo.

Depois de editar o arquivo, salve o arquivo pressionando + X, seguido pela Y e .

Abra o índice.Jinja2 Jinja2 modelo com o editor de texto Nano, como segue:

$ nano Playbooks/modelos/índice.Jinja2

Em seguida, adicione as seguintes linhas no índice.Jinja2 Arquivo de modelo:

Tudo o que você vê aqui é o mesmo que no exemplo anterior. A única diferença é que estou imprimindo as propriedades do objeto nome (usando cardápio.nome) e link (usando cardápio.link) no meu índice.Jinja2 Modelo Jinja2.

finalmente, o índice.Jinja2 O arquivo de modelo deve procurar como mostrado na captura de tela abaixo.

Depois de editar o arquivo, salve o arquivo pressionando + X, seguido pela Y e .

Agora, execute o manual copy_file_template1.Yaml do seguinte modo:

$ Ansible-Playbook Playbooks/copy_file_template1.Yaml

Como você pode ver, o Jinja2 para O loop gerou uma barra de navegação HTML (no índice.html arquivo) de uma variedade de objetos.

Qual é o próximo?

Neste artigo, mostrei como usar o Ansible modelo módulo e descreveu alguns dos princípios básicos da linguagem de modelos Jinja2. Visite o site oficial do Jinja2 para saber mais sobre a linguagem de modelos Jinja2.