A automação de servidores desempenha agora um papel essencial na administração de sistemas, devido à natureza descartável dos ambientes das aplicações modernas. Ferramentas de Gerenciamento de configuração tais como o Ansible são normalmente usadas para otimizar o processo de automatização da configuração do servidor, estabelecendo procedimentos padrão para novos servidores e reduzindo também o erro humano associado às configurações manuais.
O Ansible oferece uma arquitetura simples que não requer a instalação de software especial nos nodes. Ele também fornece um conjunto robusto de recursos e módulos internos que facilitam a criação de scripts de automação.
Este guia explica como usar o Ansible para automatizar os passos contidos em nosso guia Como instalar o Linux, o Nginx, o MySQL, o PHP (pilha LEMP) no Ubuntu 18.04. A pilha de software LEMP é um grupo de software que pode ser usado para servir páginas web dinâmicas e aplicações web. Este é um acrônimo que descreve um sistema operacional Linux, com um servidor Nginx (pronunciado como “Engine-X”). Os dados de back-end são armazenados no banco de dados MySQL e o processamento dinâmico é tratado pelo PHP.
Para executar a configuração automatizada fornecida pelo playbook que estamos discutindo neste guia, você precisará de:
Antes de continuar, primeiro você precisa garantir que o node de controle do Ansible possa conectar e executar comandos no(s) host(s) Ansible. Para um teste de conexão, verifique o passo 3 de Como instalar e configurar o Ansible no Ubuntu 18.04.
Este Playbook Ansible fornece uma alternativa à execução manual do procedimento descrito em nosso guia sobre Como instalar o Linux, o Nginx, o MySQL, o PHP (pilha LEMP) no Ubuntu 18.04.
A execução deste playbook executará as seguintes ações em seus hosts Ansible:
aptitude
, que é preferido pelo Ansible como uma alternativa ao gerenciador de pacotes apt
.80
por padrão).Quando o playbook terminar de ser executado, você terá um ambiente web PHP em execução no Nginx, com base nas opções que você definiu nas variáveis de configuração.
A primeira coisa que precisamos fazer é obter o playbook do LEMP e suas dependências no repositório do-community/ansible-playbooks. Precisamos clonar esse repositório em uma pasta local dentro do Node de Controle Ansible.
Caso você tenha clonado este repositório antes, enquanto seguia um guia diferente, acesse sua cópia existente do ansible-playbooks
e execute um comando git pull
para garantir que você tenha conteúdo atualizado:
- cd ~/ansible-playbooks
- git pull
Se esta é sua primeira vez usando o repositório do-community/ansible-playbooks
, você deve começar clonando o repositório na sua pasta home com:
- cd ~
- git clone https://github.com/do-community/ansible-playbooks.git
- cd ansible-playbooks
Os arquivos em que estamos interessados estão localizados dentro da pasta lemp_ubuntu1804
, que possui a seguinte estrutura:
lemp_ubuntu1804
├── files
│ ├── info.php.j2
│ └── nginx.conf.j2
├── vars
│ └── default.yml
├── playbook.yml
└── readme.md
Aqui está o que cada um desses arquivos representa:
files/info.php.j2
: Arquivo de modelo para configurar uma página de teste PHP na raiz do servidor web.files/nginx.conf.j2
: Arquivo de modelo para configurar o servidor Nginx.vars/default.yml
: Arquivo de variáveis para personalizar as configurações do playbook.playbook.yml
: O arquivo do playbook, contendo as tarefas a serem executadas nos servidores remotos.readme.md
: Um arquivo de texto contendo informações sobre este playbook.Editaremos o arquivo de variáveis do playbook para personalizar as configurações do MySQL e do Nginx. Acesse o diretório lemp_ubuntu1804
e abra o arquivo vars/default.yml
usando o editor de linha de comando de sua escolha:
- cd lemp_ubuntu1804
- nano vars/default.yml
Este arquivo contém algumas variáveis que requerem sua atenção:
---
mysql_root_password: "mysql_root_password"
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"
A lista a seguir contém uma breve explicação de cada uma dessas variáveis e como você pode alterá-las:
mysql_root_password
: A senha desejada para a conta root do MySQL.http_host
: O nome do host ou o endereço IP para o servidor web.http_conf
: O nome do arquivo de configuração a ser criado dentro de /etc/nginx/sites-available
, normalmente definido como o nome do host ou da aplicação para facilitar a identificação.http_port
: A porta que o Nginx utilizará para servir este site. Esta é a porta 80
por padrão, mas se você deseja servir seu site ou aplicação em uma porta diferente, digite-a aqui.Quando terminar de atualizar as variáveis dentro de vars/default.yml
, salve e feche este arquivo. Se você usou nano
, faça isso pressionando CTRL + X
, Y
, e, em seguida, ENTER
.
Agora você está pronto para executar este playbook em um ou mais servidores. A maioria dos playbooks está configurada para ser executada em todos os servidores do seu inventário, por padrão. Podemos usar a flag -l
para garantir que apenas um subconjunto de servidores ou um único servidor seja afetado pelo playbook. Também podemos usar a flag -u
para especificar qual usuário no servidor remoto que estamos usando para conectar e executar os comandos do playbook nos hosts remotos.
Para executar o playbook apenas no servidor server1
, conectando-se como sammy
, você pode usar o seguinte comando:
- ansible-playbook playbook.yml -l server1 -u sammy
Você obterá uma saída semelhante a esta:
Output
PLAY [all] *****************************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************************
ok: [server1]
TASK [Install Prerequisites] ***********************************************************************************************************
changed: [server1] => (item=aptitude)
...
TASK [UFW - Allow HTTP on port 80] *****************************************************************************************************
changed: [server1]
TASK [Sets Up PHP Info Page] ***********************************************************************************************************
changed: [server1]
RUNNING HANDLER [Reload Nginx] *********************************************************************************************************
changed: [server1]
PLAY RECAP *****************************************************************************************************************************
server1 : ok=12 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Nota: Para obter mais informações sobre como executar os playbooks Ansible, consulte nosso guia de referência Ansible Cheat Sheet Guide.
Quando o playbook terminar de ser executado, abra seu navegador web e acesse o host ou o endereço IP do servidor, conforme configurado nas variáveis do playbook, seguido de /info.php
:
http://host_ou_ip_do_servidor/info.php
Você verá uma página como esta:
Como esta página contém informações confidenciais sobre o seu ambiente PHP, é recomendável que você a remova do servidor executando um comando rm -f /var/www/info.php
após concluir a configuração.
Você pode encontrar a configuração do servidor LEMP apresentada neste tutorial na página lemp_ubuntu1804
dentro do repositório DigitalOcean Community Playbooks. Para copiar ou baixar o conteúdo do script diretamente, clique no botão Raw na parte superior de cada script.
O conteúdo completo do playbook, bem como os arquivos associados, também estão incluídos aqui para sua conveniência.
O arquivo de variáveis default.yml
contém valores que serão usados nas tarefas do playbook, como a senha da conta root do MySQL e o nome do domínio a ser configurado no Nginx.
---
mysql_root_password: "mysql_root_password"
http_host: "your_domain"
http_conf: "your_domain.conf"
http_port: "80"
O arquivo nginx.conf.j2
é um template ou modelo Jinja 2 que configura o servidor web Nginx. As variáveis usadas neste modelo são definidas no arquivo de variáveis vars/default.yml
.
server {
listen {{ http_port }};
root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;
server_name {{ http_host }};
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
O arquivo info.php.j2
é outro modelo Jinja, usado para configurar um script PHP de teste na raiz de documentos do servidor LEMP recém-configurado.
<?php
phpinfo();
O arquivo playbook.yml
é onde todas as tarefas desta configuração são definidas. Ele começa definindo o grupo de servidores que deve ser o alvo dessa configuração (all
), após o qual ele usa become: true
para definir que as tarefas devem ser executadas com escalação de privilégios (sudo
) por padrão. Em seguida, inclui o arquivo de variáveis vars/default.yml
para carregar as opções de configuração.
---
- hosts: all
become: true
vars_files:
- vars/default.yml
tasks:
- name: Install Prerequisites
apt: name={{ item }} update_cache=yes state=latest force_apt_get=yes
loop: [ 'aptitude' ]
- name: Install LEMP Packages
apt: name={{ item }} update_cache=yes state=latest
loop: [ 'nginx', 'mysql-server', 'python3-pymysql', 'php-fpm', 'php-mysql' ]
# Nginx Configuration
- name: Sets Nginx conf file
template:
src: "files/nginx.conf.j2"
dest: "/etc/nginx/sites-available/{{ http_conf }}"
- name: Enables new site
file:
src: "/etc/nginx/sites-available/{{ http_conf }}"
dest: "/etc/nginx/sites-enabled/{{ http_conf }}"
state: link
notify: Reload Nginx
- name: Removes "default" site
file:
path: "/etc/nginx/sites-enabled/default"
state: absent
notify: Reload Nginx
# MySQL Configuration
- name: Sets the root password
mysql_user:
name: root
password: "{{ mysql_root_password }}"
login_unix_socket: /var/run/mysqld/mysqld.sock
- name: Removes all anonymous user accounts
mysql_user:
name: ''
host_all: yes
state: absent
login_user: root
login_password: "{{ mysql_root_password }}"
- name: Removes the MySQL test database
mysql_db:
name: test
state: absent
login_user: root
login_password: "{{ mysql_root_password }}"
# UFW Configuration
- name: "UFW - Allow HTTP on port {{ http_port }}"
ufw:
rule: allow
port: "{{ http_port }}"
proto: tcp
# Sets Up PHP Info Page
- name: Sets Up PHP Info Page
template:
src: "files/info.php.j2"
dest: "/var/www/html/info.php"
# Handlers
handlers:
- name: Reload Nginx
service:
name: nginx
state: reloaded
- name: Restart Nginx
service:
name: nginx
state: restarted
Sinta-se à vontade para modificar este playbook para melhor atender às suas necessidades individuais dentro do seu próprio fluxo de trabalho.
Neste guia, usamos o Ansible para automatizar o processo de instalação e configuração de um ambiente LEMP em um servidor remoto. Como cada pessoa normalmente tem necessidades diferentes ao trabalhar com bancos de dados e usuários do MySQL, recomendamos que você verifique a [documentação oficial do Ansible](https://docs.ansible.com/ansible/latest/modules/mysql_user_module.html#mysql- user-module) para obter mais informações e casos de uso do módulo Ansible mysql_user
.
Se você deseja incluir outras tarefas neste playbook para personalizar ainda mais sua configuração inicial de servidor, consulte nosso guia introdutório de Ansible em Configuration Management 101: Writing Ansible Playbooks.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Sign up for Infrastructure as a Newsletter.
Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.