Skip to main content

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.


/etc/salt/master
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çãoDescrição do Uso
pkg.installedGarante que um pacote esteja instalado no sistema do minion.
service.runningGarante que um serviço esteja rodando e configurado para iniciar no boot.
file.managedGerencia arquivos, garantindo conteúdo, permissões e proprietário corretos.
user.presentGarante que um usuário específico exista no sistema do minion.
grains.presentDefine grains personalizados nos minions.
cmd.runExecuta comandos arbitrários no minion.
file.recurseCopia recursivamente todos os arquivos de um diretório do repositório para o minion.
file.directoryGarante que um diretório exista com as permissões corretas.
service.enabledGarante que um serviço seja habilitado para iniciar automaticamente no boot.
file.symlinkCria 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



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'