Handbook de JUJU
O que é o JUJU?
Juju é uma "Engine de orquestração" usada para gerenciar aplicações encapsuladas em "charm". Este é handbook apresenta os principais comandos e workflows necessários para se operar o JUJU.
Nomenclatura
Para termos certeza que estamos falando da mesma coisa, vamos definir os nomes
- charm: "imagem" de uma aplicação, ou seja, uma aplicação envelopada com uma interface simplificada. Por exemplo, ovn-chassis
- aplicação: o serviço que é rodado dentro de um charm. Por exemplo, ovn-chassis, neutron-api
- unidade: instância de um charm que recebeu deploy. Por exemplo, ovn-chassis/0, ovn-chassis/1, neutron-api/2
Comandos
Esta seção mostra os principais comandos de JUJU, seus parâmetros e como escrever seus arquivos de configurações, caso hajam.
juju add-cloud
Adicionar um novo substrato Adiciona uma nova cloud ao JUJU, ou seja, um novo substratos para que o juju possa lançar seus charms
juju add-cloud <nome da cloud> <arquivo de descrição da cloud .yaml>
Para isso, é necessário um arquivo .yaml descrevendo esta cloud
clouds:
<nome_cloud>
type: <tipo>
auth-types: [<types>, ...]
endpoint: <cloud>
atributos do arquivo
nome_cloud→nome arbitrário que podemos dar à cloud para melhor identificação
type→indica o tipo de cloud que se está adicionando
- lxd, maas
auth-types→Indica os tipos de autenticação que essa cloud aceita
- interactive, oauth, certificate
endpoint→Indica a url do serviço
- url, ip
juju add-credential
Adicionar credenciais de uma cloud Adiciona as credenciais da cloud para que o JUJU possa acessar
juju add-credential <nome da cloud> -f <arquivo com as credenciais .yaml>
Para se adicionar as credenciais, é necessário criar um .yaml descrevendo-as
credentials:
<nome-cloud>:
<user>:
auth-type: <tipo>
<value>
atributos
user→indica o user a qual o JUJU irá tentar logar
auth-type→tipo de autenticação. Deve bater com o descrito no .yaml do add-cloud
- interactive, oauth, certificate
value→indica a “senha”. Seu valor depende do tipo de autenticação usada
- interactive→senha em plain text
- 0auth→maas-oauth: api_key
juju bootstrap
Inicializar o juju
Para que o juju possa realizar suas atividades, ele precisa de um controller em um substrato, para que possa lançar os serviços. O bootstrap “instala” o JUJU neste substrato para que ele possa gerenciá-lo
juju bootstrap <nome da cloud>
juju switch
Mudar o model atual Muda o model atual. Por default, todos tem o “controller”
juju switch <nome do model>
juju controller
Informações e configurações dos controller
Mostra os controllers presentes no juju atual
juju controller
juju download
Baixar um charm no diretório atual
juju download <charm>
juju deploy
Realizar o deploy de um charm.
juju deploy <nome_charm ou ./arquivo.charm>
Se o charm não estiver disponível localmente, faz o download na hora
tags
: -n <int>
indica quantas instâncias (units) daquela aplicação serão lançadas
- --to
<int>
indica uma machine específica para lançar a aplicação
Note que não é possível usar as duas tags ao mesmo tempo, e nem a tag
--to
para duas máquinas desse modo, é preciso usar o comandodeploy
e depois o comandoadd-unit
.
juju add-unit
Adicionar uma nova instância de uma aplicação já rodando
juju add-unit <aplicação>
Aqui também podemos usar a tag
--to
para definir para qual máquina o juju vai fazer o deploy, ou a tag-n
para especificar quantas unidades, mas não ambas simultaneamente
juju remove-aplication
Remover uma aplicação rodando
juju remove-application <aplicação>
juju debug-log
Debug em tempo real do juju Abre uma seção em tempo real com os logs dos eventos que estão acontecendo no JUJU
juju debug-log
juju config
Gerenciamento das configurações de um charm
Mostrar configurações
juju config <nome da aplicação>
Para salvar as configurações para editá-las, pode-se salvar as configurações em um arquivo
juju config <nome da aplicação> >> configs.yaml
Essa saída tem um formato yaml, como o abaixo, do ovn-chassis
application: ovn-chassis
application-config:
trust:
default: false
description: Does this application have access to trusted credentials
source: default
type: bool
value: false
charm: ovn-chassis
settings:
bridge-interface-mappings:
description: |
A space-delimited list of key-value pairs that map a network interface MAC address or name to a local ovs bridge to which it should be connected.
Note: MAC addresses of physical interfaces that belong to a bond will be resolved to the bond name and the bond will be added to the ovs bridge.
Bridges referenced here must be mentioned in the `ovn-bridge-mappings` configuration option.
If a match is found the bridge will be created if it does not already exist, the matched interface will be added to it and the mapping found in `ovn-bridge-mappings` will be added to the local OVSDB under the `external_ids:ovn-bridge-mappings` key in the Open_vSwitch table.
An example value mapping two network interface mac address to two ovs bridges would be:
br-internet:00:00:5e:00:00:42 br-provider:enp3s0f0
Note: OVN gives you distributed East/West and highly available North/South routing by default. You do not need to add provider networks for use with external Layer3 connectivity to all chassis.
Doing so will create a scaling problem at the physical network layer that needs to be resolved with globally shared Layer2 (does not scale) or tunneling at the top-of-rack switch layer (adds complexity) and is generally not a recommended configuration.
Add provider networks for use with external Layer3 connectivity to individual chassis located near the datacenter border gateways by adding the MAC address of the physical interfaces of those units.
source: user
type: string
value: br-ex:eno1 br-pub:eno2
debug:
default: false
description: Enable debug logging
source: default
type: boolean
value: false
Cada uma dessas configurações podem ser vistas no site do charmhub do charm. No exemplo do ovn-chassis, temos no site
https://charmhub.io/ovn-chassis/configuration
Definir configurações
Para definir as configurações diretamente, usa-se o seguinte comando:
juju config <aplicação> <configuration>=<value> <configuration>=<value> ....
Setar configurações a partir de um arquivo
Para configurações mais extensas, é útil usar um arquivo de configuração, que pode ser exportado do charm (como foi mostrado no exemplo acima)
juju config <aplicação> --file config.yaml
É importante verificar se o charm tem alguma action (próximo comando) para reiniciar as aplciações, já que por vezes isso é necessário para aplicar as configurações feitas. Além disso, perceba que rodamos o comando em cima de uma aplicação, não de uma unidade (instância rodando). Desta maneira, quando uma configuração é feita ela é aplicada para todas unidades daquela aplicação
juju actions
Listar ações
Em juju, cada charm apresenta uma lista de ações que podem ser executadas para gerenciar a aplicação do charm.
Este comando lista as ações disponíveis de um charm
juju actions <charm>
Além disso, assim como as configs, as actions são listadas na página do cham no charmhub.
Em nosso exemplo do ovn-chassis, temos elas listadas em https://charmhub.io/ovn-chassis/actions
juju run
Executar uma action em uma instância de uma aplicação
Sabida a action que se quer rodar, podemos executá-las com o comando
juju run <unidade> [<unidade>, ...] <ação> <flags>
Repare que aqui estamos falando de unidade, não de charm. Isso é porque os comandos vão ser executados em um Por exemplo, se temos 3 instâncias do charm do ovn-chassis rodando, sendo elas ovn-chassis/0, ovn-chassis/1, ovn-chassis/2, e queremos reiniciar as três
juju run ovn-chassis/0, ovn-chassis/1, ovn-chassis/2 restart-services