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ê quiser experimentar os exemplos deste 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 automação Ansible.
Existem muitos artigos sobre LinuxHint dedicados à instalação do Ansible e configuração de hosts para automação do Ansible. Você também pode verificar isso, se necessário.
Configurando um Diretório de Projetos Ansible
Antes de prosseguirmos, é uma boa ideia criar uma estrutura de diretório do projeto, apenas para manter as coisas um pouco organizadas.
Para criar um diretório de projeto template-demo / e todos os subdiretórios necessários (em seu diretório de trabalho atual), execute o seguinte comando:
$ mkdir -pv template-demo / playbooks / templates
Depois que o diretório do projeto for criado, navegue até o diretório do projeto, da seguinte maneira:
$ cd template-demo /
Criar uma hospedeiros arquivo de inventário, como segue:
hosts $ nano
Em seguida, adicione seu IP de host ou nome DNS (vm1.nodekite.com e vm2.nodekite.com) no arquivo de inventário.
Depois de concluir esta etapa, salve o arquivo pressionando
Crie um arquivo de configuração Ansible no diretório do projeto, da seguinte maneira:
$ nano ansible.cfg
Em seguida, digite as seguintes linhas no ansible.cfg Arquivo.
Depois de terminar esta etapa, salve o arquivo pressionando
Neste ponto, o diretório do projeto deve ser o seguinte:
$ tree
Como você pode ver, os hosts 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
Noções básicas do módulo de modelo Ansible
O modelo módulo de Ansible aceita as mesmas opções que o cópia de módulo de Ansible.
Ansible Comum modelo opções de módulo:
src - O caminho do arquivo de modelo Jinja2 em seu computador, que será analisado pela linguagem de modelos Jinja2 e copiado para os hosts remotos.
dest - O caminho de destino nos hosts remotos para os 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 de arquivo nos hosts remotos.
Vamos ver um exemplo.
Primeiro, crie um novo manual do Ansible copy_file_template1.yaml no manuais / diretório, da seguinte forma:
$ nano playbooks / copy_file_template1.yaml
Em seguida, digite as seguintes linhas no copy_file_template1.yaml livro de cantadas.
- hosts: todosusuário: ansible
tarefas:
- nome: Copiar índice.arquivo html para servidor
modelo:
src: index.jinja2
dest: / home / ansible / index.html
proprietário: ansible
grupo: ansible
modo: 0644
Este manual irá copiar o índice.jinja2 arquivo do manuais / modelos / diretório (relativo ao diretório do seu projeto) para os hosts remotos usando o Ansible modelo módulo.
Depois de concluir esta etapa, salve o arquivo pressionando
Crie o índice.jinja2 arquivo de modelo no manuais / modelos diretório, da seguinte forma:
$ nano playbooks / templates / index.jinja2
Digite as seguintes linhas no índice.jinja2 arquivo de modelo:
Bem-vindo ao Linuxhint!
Este é apenas um arquivo HTML simples. Eu não usei nenhuma sintaxe Jinja2 extravagante aqui.
Depois de concluir esta etapa, salve o arquivo pressionando
Execute o manual copy_file_template1.yaml do seguinte modo:
$ ansible-playbook playbooks / copy_file_template1.yaml
O manual deve ser executado com sucesso.
Como você pode ver, o índice.jinja2 modelo foi renderizado usando a linguagem de modelos Jinja2. O conteúdo processado deve ser copiado para o índice.html arquivo dos hosts remotos.
Impressão de variáveis no modelo Jinja2
Você pode usar fatos, variáveis e variáveis definidas pelo usuário Ansible em seus modelos Jinja2.
Em 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 do 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 --color 'data | hora'
Primeiro, abra o índice.jinja2 arquivo de modelo com o editor de texto nano, da seguinte maneira:
$ nano playbooks / templates / index.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 se parecer com o mostrado na captura de tela abaixo.
Depois de concluir esta etapa, salve o arquivo pressionando
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 de modelos Jinja2 e substituiu o ansible_date_time.data variável com a data em AAAA-MM-DD formato. A saída foi então copiada para o índice.html arquivo no host remoto.
Instrução if condicional no modelo Jinja2
A linguagem de modelos Jinja2 suporta condicional E se afirmações. Você pode verificar certas variáveis antes de imprimir qualquer coisa usando o E se demonstração.
O Jinja2 E 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 E se demonstração.
Nesta seção, demonstrarei o Jinja2 E se declaração usando o ansible_distribution fatos variáveis.
$ ansible all -u ansible -m setup | egrep --color 'dist'
Primeiro, abra o índice.jinja2 Modelo Jinja2 com o editor de texto nano, da seguinte maneira:
$ nano playbooks / templates / index.jinja2
Em seguida, adicione as seguintes linhas no índice.jinja2 arquivo de modelo:
% if 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
finalmente, o índice.jinja2 o arquivo de modelo deve se parecer com o mostrado na captura de tela abaixo.
Depois de editar o arquivo, salve-o pressionando
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 Debian, o índice.html arquivo tem a linha Você está executando o Debian Linux
Condicional: instrução if-else no modelo Jinja2
A linguagem de modelos Jinja2 suporta condicional if-else afirmações. Você pode imprimir uma coisa se a condição corresponder e outra se não usar o if-else demonstração.
O Jinja2 if-else a sintaxe é a seguinte:
% se condição%Faça algo se a condição for verdadeira
% senão %
Faça algo se a condição for falsa
% fim se %
Vamos ver um exemplo do Jinja2 if-else demonstração.
Primeiro, abra o índice.jinja2 Modelo Jinja2 com o editor de texto nano, da seguinte maneira:
$ nano playbooks / templates / index.jinja2
Em seguida, adicione as seguintes linhas no índice.jinja2 arquivo de modelo:
% if ansible_distribution == "Debian"%Você está executando o Debian Linux
% senão %
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 Você não está executando o Debian Linux
finalmente, o índice.jinja2 o arquivo de modelo deve se parecer com o mostrado na captura de tela abaixo.
Depois de editar o arquivo, salve-o pressionando
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 Debian, o índice.html arquivo tem a linha Você está executando o Debian Linux Você não está executando o Debian Linux
Condicional: declaração if-elif no modelo Jinja2
A linguagem de modelos Jinja2 suporta condicional if-elif afirmações.
O Jinja2 if-elif a sintaxe é a seguinte:
% se condição1%Faça algo se a condição1 for verdadeira
% condição elif2%
Faça algo se a condição 2 for verdadeira
% condição elif3%
Faça algo se a condição 3 for verdadeira
…
% condição elifN%
Faça algo se a condição N for verdadeira
% senão %
Faça algo se nenhuma das condições for verdadeira
% fim se %
Aqui o % senão % seção é opcional, mas está lá se você precisar.
Vamos ver um exemplo do Jinja2 if-elif demonstração.
Primeiro, abra o índice.jinja2 Modelo Jinja2 com o editor de texto nano, da seguinte maneira:
$ nano playbooks / templates / index.jinja2
Em seguida, adicione as seguintes linhas no índice.jinja2 arquivo de modelo:
% if ansible_distribution == "Debian"%Você está executando o Debian Linux
% elif ansible_distribution == "CentOS"%
Você está executando CentOS Linux
% senão %
Seu sistema operacional não é compatível
% 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 CentOS Linux
Caso contrário, imprima Seu sistema operacional não é compatível
finalmente, o índice.jinja2 o arquivo de modelo deve se parecer com o mostrado na captura de tela abaixo.
Depois de editar o arquivo, salve-o pressionando
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 Debian, o índice.html arquivo tem a linha Você está executando o Debian Linux
No meu host remoto CentOS, o índice.html arquivo tem a linha Você está executando CentOS Linux
Se eu tivesse outro host remoto executando um sistema operacional diferente do Debian ou CentOS, ele teria a linha Seu sistema operacional não é compatível
Então, o Jinja2 if-elif condição está funcionando.
Loops no modelo Jinja2
Você também pode imprimir matrizes e objetos usando loops no Jinja2.
O Jinja2 para a sintaxe do loop é a seguinte:
Faça algo com variableName
% endfor%
Aqui, em cada iteração da matriz arrayName, um dos elementos da matriz (começando do início da matriz) é atribuído ao nome variável variável. Você pode fazer algo com esta variável dentro do loop.
Vamos ver como você pode imprimir elementos de array em seu modelo Jinja2 no exemplo a seguir.
Primeiro, abra o copy_file_template1.yaml Manual do Ansible com o editor de texto nano, da seguinte maneira:
$ nano playbooks / copy_file_template1.yaml
Em seguida, adicione as seguintes linhas no copy_file_template1.yaml arquivo de manual:
vars:menus:
- Casa
- Produtos
- Sobre nós
- Contate-Nos
Aqui, eu adicionei um cardápios matriz no copy_file_template1.yaml livro de cantadas. Em seguida, vou imprimir os elementos da matriz usando um loop em meu índice.jinja2 Arquivo de modelo Jinja2.
finalmente, o copy_file_template1.yaml o arquivo do manual deve ser semelhante ao mostrado na imagem abaixo.
Depois de editar o arquivo, salve-o pressionando
Agora, abra o índice.jinja2 Modelo Jinja2 com o editor de texto nano, da seguinte maneira:
$ nano playbooks / templates / index.jinja2
Adicione as seguintes linhas no índice.jinja2 arquivo de modelo:
Aqui, estou gerando uma barra de navegação HTML simples usando um Jinja2 para ciclo. O loop itera através do cardápios array (que eu defini no copy_file_template1.yaml playbook) elementos e gera um cardápio item em cada iteração.
finalmente, o índice.jinja2 o arquivo de modelo deve se parecer com o mostrado na captura de tela abaixo.
Depois de editar o arquivo, salve-o pressionando
Execute o manual copy_file_template1.yaml do seguinte modo:
$ ansible-playbook playbooks / copy_file_template1.yaml
Como você pode ver, o Jinja2 para 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 Manual do Ansible com o editor de texto nano, da seguinte maneira:
$ nano playbooks / copy_file_template1.yaml
Em seguida, adicione as seguintes linhas no copy_file_template1.yaml arquivo de manual:
vars:menus:
- nome: casa
link: / home
- nome: produtos
link: / produtos
- nome: Sobre nós
link: / sobre nós
- nome: Contate-nos
link: / contact-us
Aqui, eu adicionei um cardápios array de objetos no copy_file_template1.yaml livro de cantadas. Cada um desses objetos tem duas propriedades, um nome propriedade e um link propriedade.
finalmente, o copy_file_template1.yaml o arquivo do manual deve ser semelhante ao mostrado na imagem abaixo.
Depois de editar o arquivo, salve-o pressionando
Abra o índice.jinja2 Modelo Jinja2 com o editor de texto nano, da seguinte maneira:
$ nano playbooks / templates / index.jinja2
Em seguida, adicione as seguintes linhas no índice.jinja2 arquivo de modelo:
Tudo o que você vê aqui é igual ao do 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 se parecer com o mostrado na captura de tela abaixo.
Depois de editar o arquivo, salve-o pressionando
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 loop gerou uma barra de navegação HTML (no índice.html arquivo) a partir de uma série de objetos.
Qual é o próximo?
Neste artigo, mostrei como usar o Ansible modelo módulo e descreveu alguns dos fundamentos da linguagem de modelos Jinja2. Visite o site oficial do Jinja2 para saber mais sobre a linguagem de modelos do Jinja2.