PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Ansible ama o PostgreSQL


O Ansible é simplesmente ótimo e o PostgreSQL certamente é incrível, vamos ver como eles funcionam incrivelmente juntos!




====================Anúncio em horário nobre! ====================

PGConf Europe 2015 será de 27 a 30 de outubro em Viena deste ano.

Suponho que você esteja possivelmente interessado em gerenciamento de configuração, orquestração de servidores, implantação automatizada (é por isso que você está lendo esta postagem no blog, certo?) e gosta de trabalhar com PostgreSQL (com certeza) na AWS (opcionalmente), então você pode querer participar da minha palestra “Managing PostgreSQL with Ansible” em 28 de outubro, 15-15:50.

Confira a programação incrível e não perca a chance de participar do maior evento PostgreSQL da Europa!

Espero ver você lá, sim, eu gosto de tomar café depois das palestras 🙂

====================Anúncio em horário nobre! ====================

O que é o Ansible e como ele funciona?


O lema da Ansible é “sautomação de TI de código aberto simples, sem agentes e poderosa ” citando os documentos do Ansible.

Como pode ser visto na figura abaixo, a página inicial do Ansible afirma que as principais áreas de uso do Ansible são:provisionamento, gerenciamento de configuração, implantação de aplicativos, entrega contínua, segurança e conformidade, orquestração. O menu de visão geral também mostra em quais plataformas podemos integrar o Ansible, ou seja, AWS, Docker, OpenStack, Red Hat, Windows.



Vamos verificar os principais casos de uso do Ansible para entender como ele funciona e como ele é útil para ambientes de TI.

Provisionamento


O Ansible é seu amigo fiel quando você deseja automatizar tudo em seu sistema. É sem agente e você pode simplesmente gerenciar suas coisas (ou seja, servidores, balanceadores de carga, switches, firewalls) via SSH. Independentemente de seus sistemas serem executados em servidores bare-metal ou em nuvem, o Ansible estará lá para ajudá-lo a provisionar suas instâncias. Suas características idempotentes garantem que você sempre estará no estado que deseja (e espera) estar.

Gerenciamento de configuração


Uma das coisas mais difíceis é não se repetir em tarefas operacionais repetitivas e aqui o Ansible volta à mente como um salvador. Nos bons velhos tempos, quando os tempos eram ruins, os administradores de sistema escreviam muitos scripts e se conectavam a muitos servidores para aplicá-los e, obviamente, não era a melhor coisa em suas vidas. Como todos sabemos, as tarefas manuais são propensas a erros e levam a um ambiente heterogêneo em vez de um homogêneo e mais gerenciável e definitivamente tornam nossa vida mais estressante.

Com o Ansible, você pode escrever playbooks simples (com a ajuda de documentação muito informativa e o suporte de sua enorme comunidade) e, depois de escrever suas tarefas, pode chamar uma ampla variedade de módulos (por exemplo, AWS, Nagios, PostgreSQL, SSH, APT, File módulos). Como resultado, você pode se concentrar em mais atividades criativas do que gerenciar configurações manualmente.

Implantação de aplicativos


Tendo os artefatos prontos, é super fácil implantá-los em vários servidores. Como o Ansible está se comunicando por SSH, não há necessidade de extrair de um repositório em cada servidor ou problemas com métodos antigos, como copiar arquivos por FTP. O Ansible pode sincronizar artefatos e garantir que apenas arquivos novos ou atualizados sejam transferidos e arquivos obsoletos sejam removidos. Isso também acelera as transferências de arquivos e economiza muita largura de banda.

Além de transferir arquivos, o Ansible também ajuda a preparar os servidores para uso em produção. Antes da transferência, ele pode pausar o monitoramento, remover servidores de balanceadores de carga e interromper serviços. Após a implantação, ele pode iniciar serviços, adicionar servidores a balanceadores de carga e retomar o monitoramento.

Tudo isso não precisa acontecer de uma vez para todos os servidores. O Ansible pode trabalhar em um subconjunto de servidores por vez para fornecer implantações sem tempo de inatividade. Por exemplo, em uma única vez, ele pode implantar 5 servidores de uma vez e, em seguida, pode implantar nos próximos 5 servidores quando eles terminarem.

Após a implementação deste cenário, ele pode ser executado em qualquer lugar. Desenvolvedores ou membros da equipe de controle de qualidade podem fazer implantações em suas próprias máquinas para fins de teste. Além disso, para reverter uma implantação por qualquer motivo, tudo o que o Ansible precisa é a localização dos últimos artefatos de trabalho conhecidos. Ele pode então reimplantá-los facilmente em servidores de produção para colocar o sistema de volta em um estado estável.

Entrega Contínua


Entrega contínua significa adotar uma abordagem rápida e simples para lançamentos. Para atingir esse objetivo, é fundamental usar as melhores ferramentas que permitem lançamentos frequentes sem tempos de inatividade e requerem o mínimo de intervenção humana possível. Como aprendemos sobre os recursos de implantação de aplicativos do Ansible acima, é muito fácil realizar implantações com tempo de inatividade zero. O outro requisito para entrega contínua é menos processos manuais e isso significa automação. O Ansible pode automatizar qualquer tarefa, desde o provisionamento de servidores até a configuração de serviços para se tornarem prontos para a produção. Depois de criar e testar cenários no Ansible, torna-se trivial colocá-los na frente de um sistema de integração contínua e deixar o Ansible fazer seu trabalho.

Segurança e conformidade


A segurança é sempre considerada a coisa mais importante, mas manter os sistemas seguros é uma das coisas mais difíceis de alcançar. Você precisa ter certeza sobre a segurança de seus dados, bem como a segurança dos dados de seus clientes. Para ter certeza da segurança de seus sistemas,  definir segurança não é suficiente, você precisa ser capaz de aplicar essa segurança e monitorar constantemente seus sistemas para garantir que eles permaneçam em conformidade com essa segurança.

O Ansible é fácil de usar, seja para configurar regras de firewall, bloquear usuários e grupos ou aplicar políticas de segurança personalizadas. É seguro por natureza, pois você pode aplicar repetidamente a mesma configuração e só fará as alterações necessárias para colocar o sistema novamente em conformidade.

Orquestração


O Ansible garante que todas as tarefas estejam na ordem correta e estabelece uma harmonia entre todos os recursos que gerencia. A orquestração de implantações complexas de várias camadas é mais fácil com os recursos de gerenciamento e implantação de configuração do Ansible. Por exemplo, considerando a implantação de uma pilha de software, preocupações como garantir que todos os servidores de banco de dados estejam prontos antes de ativar os servidores de aplicativos ou configurar a rede antes de adicionar servidores ao balanceador de carga não são mais problemas complicados.

O Ansible também ajuda na orquestração de outras ferramentas de orquestração, como CloudFormation da Amazon, Heat do OpenStack, Swarm do Docker, etc. Dessa forma, ao invés de aprender diferentes plataformas, linguagens e regras; os usuários podem se concentrar apenas na sintaxe YAML do Ansible e nos módulos poderosos.

O que é um módulo Ansible?


Módulos ou bibliotecas de módulos fornecem meios Ansible para controlar ou gerenciar recursos em servidores locais ou remotos. Eles executam uma variedade de funções. Por exemplo, um módulo pode ser responsável por reiniciar uma máquina ou pode simplesmente exibir uma mensagem na tela.

O Ansible permite que os usuários escrevam seus próprios módulos e também fornece módulos de núcleo ou extras prontos para uso.

E os manuais do Ansible?


O Ansible nos permite organizar nosso trabalho de várias maneiras. Em sua forma mais direta, podemos trabalhar com módulos Ansible usando o método “ansible ” ferramenta de linha de comando e o arquivo de inventário.

Inventário


Um dos conceitos mais importantes é o inventário . Precisamos de um arquivo de inventário para permitir que o Ansible saiba quais servidores ele precisa se conectar usando SSH, quais informações de conexão ele requer e, opcionalmente, quais variáveis ​​estão associadas a esses servidores.

O arquivo de inventário está em um formato semelhante ao INI. No arquivo de inventário, podemos especificar mais de um host e agrupá-los em mais de um grupo de hosts.

Nosso arquivo de inventário de exemplo hosts.ini é semelhante ao seguinte:
[dbservers]
db.example.com

Aqui temos um único host chamado “db.example.com” em um grupo de hosts chamado “dbservers”. No arquivo de inventário, também podemos incluir portas SSH personalizadas, nomes de usuário SSH, chaves SSH, informações de proxy, variáveis ​​etc.

Como temos um arquivo de inventário pronto, para ver os tempos de atividade de nossos servidores de banco de dados, podemos invocar o “comando do Ansible ” e execute o “uptime ” nesses servidores:
ansible dbservers -i hosts.ini -m command -a "uptime"

Aqui instruímos o Ansible a ler os hosts do arquivo hosts.ini, conectá-los usando SSH, executar o “uptime ” em cada um deles e, em seguida, imprima sua saída na tela. Este tipo de execução de módulo é chamado de comando ad-hoc .

A saída do comando será como:
[email protected] ~/blog/ansible-loves-postgresql # ansible dbservers -i hosts.ini -m command -a "uptime"
db.example.com | success | rc=0 >>
21:16:24 up 93 days,  9:17,  4 users,  load average: 0.08, 0.03, 0.05

No entanto, se nossa solução contiver mais de uma única etapa, fica difícil gerenciá-los apenas usando comandos ad-hoc.

Aí vem os manuais do Ansible. Permite organizar nossa solução em um arquivo playbook integrando todas as etapas por meio de tarefas, variáveis, papéis, templates, handlers e um inventário.

Vamos dar uma breve olhada em alguns desses termos para entender como eles podem nos ajudar.

Tarefas


Outro conceito importante são as tarefas. Cada tarefa do Ansible contém um nome, um módulo a ser chamado, parâmetros do módulo e, opcionalmente, pré/pós-condições. Eles nos permitem chamar módulos Ansible e passar informações para tarefas consecutivas.

Variáveis


Há também variáveis. Eles são muito úteis para reutilizar informações que fornecemos ou coletamos. Podemos defini-los no inventário, em arquivos YAML externos ou em manuais.

Manual


Os playbooks do Ansible são escritos usando a sintaxe YAML. Pode conter mais de uma jogada. Cada jogo contém o nome dos grupos de hosts aos quais se conectar e as tarefas que precisa executar. Ele também pode conter variáveis/funções/manipuladores, se definido.

Agora podemos olhar para um manual muito simples para ver como ele pode ser estruturado:
---

- hosts: dbservers
  gather_facts: no

  vars:
    who: World

  tasks:
  - name: say hello
    debug: msg="Hello {{ who }}"

  - name: retrieve the uptime
    command: uptime

Neste manual muito simples, dissemos ao Ansible que ele deveria operar em servidores definidos no grupo de hosts “dbservers”. Criamos uma variável chamada “who” e então definimos nossas tarefas. Observe que na primeira tarefa em que imprimimos uma mensagem de depuração, usamos a variável “who” e fizemos com que o Ansible imprimisse “Hello World” na tela. Na segunda tarefa, dissemos ao Ansible para se conectar a cada host e executar o comando “uptime” lá.

Módulos PostgreSQL do Ansible


O Ansible fornece vários módulos para PostgreSQL. Alguns deles estão localizados em módulos principais, enquanto outros podem ser encontrados em módulos extras.

Todos os módulos do PostgreSQL requerem que o pacote Python psycopg2 seja instalado na mesma máquina com o servidor PostgreSQL. Psycopg2 é um adaptador de banco de dados PostgreSQL na linguagem de programação Python.

Nos sistemas Debian/Ubuntu, o pacote psycopg2 pode ser instalado usando o seguinte comando:
apt-get install python-psycopg2

Agora vamos examinar esses módulos em detalhes. Para fins de exemplo, estaremos trabalhando em um servidor PostgreSQL no host db.example.com na porta 5432 com postgres usuário e uma senha vazia.

postgresql_db


Este módulo principal cria ou remove um determinado banco de dados PostgreSQL. Na terminologia Ansible, garante que um determinado banco de dados PostgreSQL esteja presente ou ausente.

A opção mais importante é o parâmetro obrigatório “nome ”. Ele representa o nome do banco de dados em um servidor PostgreSQL. Outro parâmetro significativo é “estado ”. Requer um dos dois valores:presente ou ausente . Isso nos permite criar ou remover um banco de dados identificado pelo valor fornecido no nome parâmetro.

Alguns fluxos de trabalho também podem exigir a especificação de parâmetros de conexão, como login_host , porta , login_user e login_password .

Vamos criar um banco de dados chamado “module_test ” em nosso servidor PostgreSQL adicionando as linhas abaixo ao nosso arquivo de playbook:
- postgresql_db: name=module_test
                 state=present
                 login_host=db.example.com
                 port=5432
                 login_user=postgres

Aqui, nos conectamos ao nosso servidor de banco de dados de teste em db.example.com com o usuário; postgres . No entanto, não precisa ser o postgres user como o nome de usuário pode ser qualquer coisa.

Remover o banco de dados é tão fácil quanto criá-lo:
- postgresql_db: name=module_test
                 state=absent
                 login_host=db.example.com
                 port=5432
                 login_user=postgres

Observe o valor “ausente” no parâmetro “estado”.

postgresql_ext


O PostgreSQL é conhecido por ter extensões muito úteis e poderosas. Por exemplo, uma extensão recente é tsm_system_rows que ajuda a buscar o número exato de linhas na amostragem de tabelas. (Para mais informações, você pode verificar meu post anterior sobre métodos de amostragem de tabelas.)

Este módulo extras adiciona ou remove extensões PostgreSQL de um banco de dados. Requer dois parâmetros obrigatórios:db e nome . O banco parâmetro refere-se ao nome do banco de dados e ao nome parâmetro refere-se ao nome da extensão. Também temos o estado parâmetro que precisa presente ou ausente valores e os mesmos parâmetros de conexão do módulo postgresql_db.

Vamos começar criando a extensão sobre a qual falamos:
- postgresql_ext: db=module_test
                  name=tsm_system_rows
                  state=present
                  login_host=db.example.com
                  port=5432
                  login_user=postgres

postgresql_user


Este módulo central permite adicionar ou remover usuários e funções de um banco de dados PostgreSQL.

É um módulo muito poderoso porque, ao mesmo tempo que garante a presença de um usuário no banco de dados, também permite a modificação de privilégios ou funções ao mesmo tempo.

Vamos começar analisando os parâmetros. O único parâmetro obrigatório aqui é “nome ”, que se refere a um nome de usuário ou função. Além disso, como na maioria dos módulos Ansible, o “estado ” é importante. Ele pode ter um de presente ou ausente valores e seu valor padrão é presente .

Além dos parâmetros de conexão como nos módulos anteriores, alguns outros parâmetros opcionais importantes são:
  • db :Nome do banco de dados onde as permissões serão concedidas
  • senha :Senha do usuário
  • privado :Privilégios em “priv1/priv2” ou privilégios de tabela em formato “table:priv1,priv2,…”
  • role_attr_flags :atributos da função. Os valores possíveis são:
    • [NO]SUPERUSER
    • [NO]CREATEROLE
    • [NO]CREATEUSER
    • [NO]CREATEDB
    • [NO]HERDAR
    • [NO]LOGIN
    • [NO]REPLICAÇÃO

Para criar um novo usuário chamado ada com senha lovelace e um privilégio de conexão ao banco de dados module_test , podemos adicionar o seguinte ao nosso manual:
- postgresql_user: db=module_test
                   name=ada
                   password=lovelace
                   state=present
                   priv=CONNECT
                   login_host=db.example.com
                   port=5432
                   login_user=postgres

Agora que temos o usuário pronto, podemos atribuir a ele alguns papéis. Para permitir que “ada” faça login e crie bancos de dados:
- postgresql_user: name=ada
                   role_attr_flags=LOGIN,CREATEDB
                   login_host=db.example.com
                   port=5432
                   login_user=postgres

Também podemos conceder privilégios globais ou baseados em tabela, como “INSERT ”, “ATUALIZAÇÃO ”, “SELECIONAR ” e “EXCLUIR ” usando o priv parâmetro. Um ponto importante a ser considerado é que um usuário não pode ser removido até que todos os privilégios concedidos sejam revogados primeiro.

postgresql_privs


Este módulo principal concede ou revoga privilégios em objetos de banco de dados PostgreSQL. Os objetos suportados são:table , sequência , função , banco de dados , esquema , idioma , espaço de tabela e grupo .

Os parâmetros obrigatórios são “banco de dados”; nome do banco de dados para conceder/revogar privilégios e “funções”; uma lista separada por vírgulas de nomes de funções.

Os parâmetros opcionais mais importantes são:
  • tipo :Tipo do objeto para definir os privilégios. Pode ser um dos seguintes:tabela, sequência, função, banco de dados, esquema, idioma, espaço de tabela, grupo . O valor padrão é tabela .
  • objs :Objetos de banco de dados para definir privilégios. Pode ter vários valores. Nesse caso, os objetos são separados por vírgula.
  • privados :lista separada por vírgulas de privilégios para conceder ou revogar. Os valores possíveis incluem:ALL , SELECIONAR , ATUALIZAÇÃO , INSERIR .

Vamos ver como isso funciona concedendo todos os privilégios na área “pública ” esquema para “ada ”:
- postgresql_privs: db=module_test
                    privs=ALL
                    type=schema
                    objs=public
                    role=ada
                    login_host=db.example.com
                    port=5432
                    login_user=postgres

postgresql_lang


Uma das características muito poderosas do PostgreSQL é o suporte para virtualmente qualquer linguagem a ser usada como linguagem procedural. Este módulo extras adiciona, remove ou altera linguagens procedurais com um banco de dados PostgreSQL.

O único parâmetro obrigatório é “lang ”; nome da linguagem procedural a ser adicionada ou removida. Outras opções importantes são “db ”; nome do banco de dados onde o idioma foi adicionado ou removido e “confiança ”; opção para tornar o idioma confiável ou não confiável para o banco de dados selecionado.

Vamos habilitar a linguagem PL/Python para nosso banco de dados:
- postgresql_lang: db=module_test
                   lang=plpython2u
                   state=present
                   login_host=db.example.com
                   port=5432
                   login_user=postgres

Juntando tudo


Agora que sabemos como um manual do Ansible é estruturado e quais módulos do PostgreSQL estão disponíveis para uso, podemos combinar nosso conhecimento em um manual do Ansible.

A forma final do nosso playbook main.yml é como a seguinte:
---

- hosts: dbservers
  sudo: yes
  sudo_user: postgres
  gather_facts: yes

  vars:
    dbname: module_test
    dbuser: postgres

  tasks:
  - name: ensure the database is present
    postgresql_db: >
      state=present
      db={{ dbname }}
      login_user={{ dbuser }}

  - name: ensure the tsm_system_rows extension is present
    postgresql_ext: >
      name=tsm_system_rows
      state=present
      db={{ dbname }}
      login_user={{ dbuser }}

  - name: ensure the user has access to database
    postgresql_user: >
      name=ada
      password=lovelace
      state=present
      priv=CONNECT
      db={{ dbname }}
      login_user={{ dbuser }}

  - name: ensure the user has necessary privileges
    postgresql_user: >
      name=ada
      role_attr_flags=LOGIN,CREATEDB
      login_user={{ dbuser }}

  - name: ensure the user has schema privileges
    postgresql_privs: >
      privs=ALL
      type=schema
      objs=public
      role=ada
      db={{ dbname }}
      login_user={{ dbuser }}

  - name: ensure the postgresql-plpython-9.4 package is installed
    apt: name=postgresql-plpython-9.4 state=latest
    sudo_user: root

  - name: ensure the PL/Python language is available
    postgresql_lang: >
      lang=plpython2u
      state=present
      db={{ dbname }}
      login_user={{ dbuser }}

Agora podemos executar nosso playbook usando o comando “ansible-playbook”:
[email protected] ~/blog/ansible-loves-postgresql # ansible-playbook -i hosts.ini main.yml

PLAY [dbservers] **************************************************************

GATHERING FACTS ***************************************************************
ok: [db.example.com]

TASK: [ensure the database is present] ****************************************
changed: [db.example.com]

TASK: [ensure the tsm_system_rows extension is present] ***********************
changed: [db.example.com]

TASK: [ensure the user has access to database] ********************************
changed: [db.example.com]

TASK: [ensure the user has necessary privileges] ******************************
changed: [db.example.com]

TASK: [ensure the user has schema privileges] *********************************
changed: [db.example.com]

TASK: [ensure the postgresql-plpython-9.4 package is installed] ***************
changed: [db.example.com]

TASK: [ensure the PL/Python language is available] ****************************
changed: [db.example.com]

PLAY RECAP ********************************************************************
db.example.com             : ok=8    changed=7    unreachable=0    failed=0

Você pode encontrar o inventário e o arquivo do manual no meu repositório GitHub criado para esta postagem do blog. Há também outro manual chamado “remove.yml” que desfaz tudo o que fizemos no manual principal.

Para obter mais informações sobre o Ansible:
  • Confira os documentos bem escritos.
  • Assista ao vídeo de início rápido do Ansible, que é um tutorial muito útil.
  • Siga a programação de webinars, há alguns webinars interessantes na lista.