Se aprofundando no Salt
Os arquivos SLS no SaltStack são usados para definir o estado de um sistema e automatizar tarefas de configuração. Abaixo veremos alguns dos módulos e funções mais utilizados para essas tarefas.
Minion Groups
O Nodegroups do SaltStack é uma maneira de agrupar minions de forma lógica, permitindo que você execute comandos em um subconjunto de servidores sem precisar listar cada um dos Minions individualmente. Eles são especialmente úteis quando você tem um grande número de minions e quer organizá-los por função, ambiente, localização, ou qualquer outro critério de agrupamento que faça sentido na sua infraestrutura.
nodegroups:
webservers: 'G@roles:webserver'
databases: 'G@roles:database and G@os:Ubuntu'
production: 'G@environment:production'
group3: 'G@os:Debian and N@group1'
testing: 'L@minion1,minion2,minion3'
allgroups: 'N@webservers or N@databases or N@production or N@group3 or N@testing
O L
dentro de testing está correspondendo a uma lista de minions, enquanto o G
está correspondendo a grains específicos.
Um grupo dentro de nodegroups pode referenciar outros nodegroups como visto em group3
, ou seja, um grupo herda os Minions de outro grupo. Certifique-se de que você não tenha referências circulares. Referências circulares serão detectadas e causarão expansão parcial com uma mensagem de erro registrada.
Para executar comandos ad-hoc para um grupo, utilize a sintaxe abaixo:
$ sudo salt -N testing state.apply
States mais comuns
Vamos explorar os states que você provavelmente vai usar com mais frequência no SaltStack. Estes são fundamentais para a automação e a configuração de sistemas, e são amplamente aplicados em diferentes cenários de administração de servidores.
Módulo.Função | Descrição do Uso |
---|---|
pkg.installed | Garante que um pacote esteja instalado no sistema do minion. |
service.running | Garante que um serviço esteja rodando e configurado para iniciar no boot. |
file.managed | Gerencia arquivos, garantindo conteúdo, permissões e proprietário corretos. |
user.present | Garante que um usuário específico exista no sistema do minion. |
grains.present | Define grains personalizados nos minions. |
cmd.run | Executa comandos arbitrários no minion. |
file.recurse | Copia recursivamente todos os arquivos de um diretório do repositório para o minion. |
file.directory | Garante que um diretório exista com as permissões corretas. |
service.enabled | Garante que um serviço seja habilitado para iniciar automaticamente no boot. |
file.symlink | Cria um link simbólico de um arquivo ou diretório no minion. |
Os tópicos abaixo servem apenas para que veja alguns exemplos de como usar o módulos acima.
Instalar um pacote
install_nginx:
pkg.installed:
- name: nginx
Garantir que o serviço NGINX esteja rodando
start_nginx:
service.running:
- name: nginx
- enable: True # Habilita o serviço para iniciar no boot
Mover um arquivo do Salt Master para o Minion
nginx_config:
file.managed:
- name: /etc/nginx/nginx.conf
- source: salt://nginx/files/nginx.conf
- mode: 644
- user: root
- group: root
Criar um usuário no sistema
# Nome do usuário nesse caso sera o ID (deploy), mas pode usar o '- name: deploy'.
deploy:
user.present:
- home: /home/deploy
- uid: 1002
- shell: /bin/bash
- createhome: True
- password: $6$8z6fIWnnHpCOVUDc$4cdJ8pKGDzv05F0SnEpQ6otY/S4ry1SmcjoB/8naO6VykZ7TQcjKjshlUuXcSDq.1fULvU5Be/D.ByZLFfdSn1
- groups:
- adm
- cdrom
- sudo
- plugdev
- lpadmin
Definir grains personalizados
set_environment_grain:
grains.present:
- force: true
- value:
environment: production
role: webserver
Executar um comando no minion
run_custom_command:
cmd.run:
- name: echo "Deploying application..."
Copiar arquivos recursivamente para um diretório
deploy_website_files:
file.recurse:
- name: /var/www/html
- source: salt://website/files/
- user: www-data
- group: www-data
- mode: 755
Garantir que um diretório exista com as permissões corretas
Se não existir ele cria.
create_logs_directory:
file.directory:
- name: /var/log/myapp
- user: appuser
- group: appgroup
- mode: 755
Remover um diretório/arquivo existente
/home/deploy:
file.absent
Habilitar o serviço MySQL no boot
enable_mysql_service:
service.enabled:
- name: mysql
Desativa um serviço
apt-daily.timer:
service.dead:
- enable: False
Criar um link simbólico
create_symlink:
file.symlink:
- name: /var/www/html
- target: /srv/webserver/production
Atualizar o cache dos repositórios de pacotes no sistema
Similar ao apt-get update
.
refresh_db:
module.run:
- name: pkg.refresh_db
Você utilizaria esse state quando quiser garantir que o cache de pacotes esteja atualizado antes de instalar ou atualizar pacotes em um minion. Isso é especialmente útil em sistemas onde o repositório de pacotes pode mudar com frequência.
Configure locales no sistema
pt_locale:
locale.present:
- name: pt_BR.UTF-8
default_locale:
locale.system:
- name: en_US.UTF-8
Configure impressora em Minions que estão no grupo 'brother_printer'
## para encontrar o ppd (ex. HP LaserJet MFP E52645):
## lpinfo --make-and-model HP -m | grep -i 5264
##
## TODO configurar a impressora 200.160.0.89 no servidor nfsc
## mesmo modelo da atual: HP LaserJet MFP E52645
{% if grains.id in salt['pillar.get']('master:nodegroups:brother_printer', []) %}
/tmp/mfcl6902dwcupswrapper-3.5.1-1.i386.deb:
file.managed:
- source: salt://brother/files/mfcl6902dwcupswrapper-3.5.1-1.i386.deb
/tmp/mfcl6902dwlpr-3.5.1-1.i386.deb:
file.managed:
- source: salt://brother/files/mfcl6902dwlpr-3.5.1-1.i386.deb
install_mfcl6902dwlpr:
cmd.run:
- name: "dpkg -i --force-all /tmp/mfcl6902dwlpr-3.5.1-1.i386.deb"
install_mfcl6902dwcupswrapper:
cmd.run:
- name: "dpkg -i --force-all /tmp/mfcl6902dwcupswrapper-3.5.1-1.i386.deb"
del_brother_usb:
cmd.run:
- name: 'lpadmin -x MFCL6902DW'
add_brother_printer:
cmd.run:
- name: "lpadmin -p Brother -E -v ipp://192.168.1.12/printers/brother_printer -m brother-MFCL6902DW-cups-en.ppd && lpadmin -d Brother"
{% endif %}
Substituir texto em um arquivo
alterar_texto:
file.replace:
- name: /etc/myapp/config.conf
- pattern: 'old_value' # O padrão de texto (regex) que você deseja substituir.
- repl: 'new_value' # O novo texto que substituirá o valor antigo.
- backup: True # (Opcional) Cria um backup do arquivo antes de modificar
Manipular linhas específicas em um arquivo
remover_linha:
file.line:
- name: /etc/myapp/config.conf
- mode: delete # Deleta
- match: '^my_setting_new = true'
Imagine que você quer garantir que a linha setting = enabled
esteja presente em um arquivo de configuração, e substituir qualquer valor anterior dessa configuração.
substituir_setting:
file.replace:
- name: /etc/myapp/config.conf
- pattern: '^setting = .*'
- repl: 'setting = enabled'
Adicionar várias linhas no começo de um arquivo
# Multi-line:
/etc/motd:
file.prepend:
- text: |
Thou hadst better eat salt with the Philosophers of Greece,
than sugar with the Courtiers of Italy.
- Benjamin Franklin
# Multiple lines:
/etc/motd:
file.prepend:
- text:
- Trust no one unless you have eaten much salt with him.
- "Salt is born of the purest of parents: the sun and the sea."
Adicionar uma linha num arquivo
sudoers:
file.append:
- name: /etc/sudoers.d/fulano
- text: 'fulano ALL = (root) NOPASSWD: /usr/sbin/postfix reload'