Gostaria de criar uma chave GPG para testar Nexus3 e N3DR. Quando sigo instruções como essas , uma chave é criada e pode ser usada na Integração Contínua (CI) também. A questão é como criar essa chave ao executar um script. Os manuais que li até agora, requerem intervenção manual.
030's questions
O objetivo é atualizar os pacotes snap, por exemplo, n3dr e informação , usando o Ansible . A seguinte tarefa foi criada:
- name: Install various snap packages
snap:
name:
- informado
- n3dr
Tentativas de resolver o problema
Foram consultados os seguintes sites:
- https://docs.ansible.com/ansible/latest/modules/snap_module.html
- https://github.com/ansible/ansible/issues/62492
- https://github.com/ansible-collections/community.general/blob/main/plugins/modules/packaging/os/snap.py
Parece não haver opção para atualizar o pacote snap usando o ansible
Um problema no GitHub foi criado.
Gambiarra
remova os pacotes a serem atualizados
user@host:~$ sudo snap remove informado n3dr 2020-07-15T10:21:18+02:00 INFO Waiting for conflicting change in progress... informado removed n3dr removed
execute o ansible novamente
a versão mais recente do n3dr e das informações foram instaladas
Pergunta
Como atualizar os pacotes snap sem removê-los primeiro, usando o ansible?
Objetivo: habilitar Identity Aware Proxy (IAP) em conjunto com Kubernetes (k8s).
Métodos:
- Dois aplicativos foram implantados
- Um balanceador de carga SSL foi colocado na frente
- Quando se navega para domínio/app1, app1 é mostrado
- Este tutorial foi seguido para habilitar o IAP para k8s https://cloud.google.com/iap/docs/enabling-kubernetes-howto
Resultados
- A tela de login do Google aparece quando se navega para domínio/app1
- Quando o login é bem-sucedido, um 'gateway padrão - 404' é mostrado em vez do aplicativo quando o IAP está desabilitado
Discussão
- Um redirecionamento não deve ser configurado em algum lugar? Quando a autenticação e autorização são bem-sucedidas, um URI _gcp_gatekeeper/authenticate foi adicionado e um 404 foi retornado, enquanto um redirecionamento para o aplicativo deve ser feito certo?
- Quando um mecanismo de aplicativo é implantado, o IAP é ativado, o IAP funciona imediatamente. O que torna essa implantação diferente? Talvez o App Engine contenha alguns elementos que são omitidos no k8s.
Problema atual
Quando a autenticação é bem-sucedida, o seguinte erro é mostrado:
There was a problem with your request. Error code 11
Quando se tenta criar um novo certificado usando o certbot, a suposição era de que 80
ou 443
precisa estar disponível, mas esse não parece ser o caso, pois:
-------------------------------------------------------------------------------
The program nginx (process ID 123454) is already listening on TCP port 443. This
will prevent us from binding to that port. Please stop the nginx program
temporarily and then try again.
-------------------------------------------------------------------------------
At least one of the (possibly) required ports is already taken.
ocorre.
Como renovar certificados sem interromper serviços, por exemplo, nginx?
Tente resolver o problema
Versão?
root@hostname:~# letsencrypt --version
letsencrypt 0.4.1
Opções?
root@hostname:~# letsencrypt --help
letsencrypt [SUBCOMMAND] [options] [-d domain] [-d domain] ...
The Let's Encrypt agent can obtain and install HTTPS/TLS/SSL certificates. By
default, it will attempt to use a webserver both for obtaining and installing
the cert. Major SUBCOMMANDS are:
(default) run Obtain & install a cert in your current webserver
certonly Obtain cert, but do not install it (aka "auth")
install Install a previously obtained cert in a server
renew Renew previously obtained certs that are near expiry
revoke Revoke a previously obtained certificate
rollback Rollback server configuration changes made during install
config_changes Show changes made to server config during installation
plugins Display information about installed plugins
Choice of server plugins for obtaining and installing cert:
(the apache plugin is not installed)
--standalone Run a standalone webserver for authentication
(nginx support is experimental, buggy, and not installed by default)
--webroot Place files in a server's webroot folder for authentication
OR use different plugins to obtain (authenticate) the cert and then install it:
--authenticator standalone --installer apache
More detailed help:
-h, --help [topic] print this message, or detailed help on a topic;
the available topics are:
all, automation, paths, security, testing, or any of the subcommands or
plugins (certonly, install, nginx, apache, standalone, webroot, etc)
Será seguro usar a seguinte opção?
(nginx support is experimental, buggy, and not installed by default) --webroot Place files in a server's webroot folder for authentication
Desde o horário de verão, o monitor Sensu indica que o NTP de vários servidores que rodam no Digital Ocean (DO) estão fora de sincronia ( 12.345404ms
- 98.338222ms
):
CheckNTP WARNING: NTP offset by 34.073039ms
Discussão
Talvez a configuração NTP esteja incorreta?
A configuração NTP estava diferente, mas agora a mesma configuração foi aplicada usando a função ntp de Geerlingguy .
O que acontecerá se o servidor NTP for reiniciado?
O monitor indicou que o NTP foi sincronizado, mas daqui a pouco o problema ocorre novamente.
O que acontecerá se o servidor NTP for interrompido, a hora for definida manualmente e o servidor ntp for iniciado novamente?
Idêntico a três.
Talvez o problema esteja relacionado à plataforma DO?
Desconhecido. Nenhuma solução foi encontrada na internet.
O que acontecerá se o local mais próximo for escolhido como um servidor de tempo?
server 0.nl.pool.ntp.org iburst server 1.nl.pool.ntp.org iburst server 2.nl.pool.ntp.org iburst server 3.nl.pool.ntp.org iburst
Quando o servidor NTP foi reiniciado, o horário foi sincronizado e, posteriormente, o horário foi sincronizado novamente.
As gotículas sincronizam e depois ficam fora de sincronia?
Sim, parece ser o caso:
Resultados da corrida sudo nomad agent -dev
em getsockopt: connection refused
:
* Get http://127.0.0.1:8500/v1/agent/checks: dial tcp 127.0.0.1:8500:
getsockopt: connection refused
2017/02/19 20:31:36.971932 [INFO] client: node registration complete
2017/02/19 20:31:36.973456 [DEBUG] client: periodically checking for
node changes at duration 5s
2017/02/19 20:31:36.974470 [DEBUG] client: state updated to ready
2017/02/19 20:31:41.971377 [ERR] client.consul: error reaping services in
consul: Get http://127.0.0.1:8500/v1/agent/services: dial tcp 127.0.0.1:8500:
getsockopt: connection refused
^C==> Caught signal: interrupt
2017/02/19 20:32:17.507631 [DEBUG] http: Shutting down http server
2017/02/19 20:32:17.509138 [INFO] agent: requesting shutdown
2017/02/19 20:32:17.510375 [INFO] client: shutting down
2017/02/19 20:32:17.511603 [INFO] nomad: shutting down server
2017/02/19 20:32:17 [WARN] serf: Shutdown without a Leave
2017/02/19 20:32:17.520042 [ERR] agent: shutting down consul service
failed: 1 error(s) occurred:
* Get http://127.0.0.1:8500/v1/agent/services: dial tcp 127.0.0.1:8500:
getsockopt: connection refused
2017/02/19 20:32:17.520155 [INFO] agent: shutdown complete
Passos para reproduzir
- wget https://raw.githubusercontent.com/hashicorp/nomad/master/demo/vagrant/Vagrantfile
- vagabundo
- vagabundo ssh
- agente nômade -dev
Problema
O seguinte problema aparece no ansible-sensu-client:
{"timestamp":"2017-01-19T09:49:14.803754+0000","level":"fatal","message":
"check name cannot contain spaces or special characters","object":{"handlers":
["mailer","sms"],"command":"check-ports.rb -p 234","interval":30,"standalone":
true,"name":"port 234"}}
No momento em que o usuário precisa depurar o log sensu-client para encontrar o problema, o problema pode ser evitado validando a entrada.
Mirar
Para evitar que os usuários que usam esta função usem nomes que contenham espaços ou caracteres especiais, por exemplo:
sensu_client_checks_metrics_common:
- cmd: check-cpu
- cmd: check-memory-percent
- cmd: check-ntp
- cmd: check-swap-percent
handlers:
- mailer
- cmd: metrics-cpu
handlers:
- relay
- cmd: metrics-memory-percent
handlers:
- relay
- cmd: metrics-disk
handlers:
- relay
- cmd: metrics-disk-usage
handlers:
- relay
deixando a execução do Ansible falhar e indicar que a entrada é inválida
Discussão
No Puppet, pode-se usar Stdlib para validar a entrada, por exemplo, a variável X é uma String e Y é igual a Hash? Por exemplo, neste módulo a versão deve ser uma string e se não for o caso a execução do Puppet falhará:
validate_string($version)
e indique que a versão precisa ser uma string.
Como validar a entrada no Ansible também?
De acordo com esta documentação, o Google Cloud Platform oferece suporte a VPN site a site (S2S), mas também oferece suporte a ponto a site (P2S)?
Objetivo: configurar uma VPN entre o GCP (Google Cloud Platform) e o escritório
Criar conexão VPN
Criar uma conexão VPN
Idéia
Agora estamos considerando configurar o StrongSwan , mas gostaria de saber se isso funcionará em um sistema aleatório dentro do escritório ou se é necessário um IP público?
A ideia que temos agora é criar uma VM no Digital Ocean (DO), configurar um servidor StrongSwan, inserir o IP na interface do usuário da rede GCP e permitir que os desktops se conectem à VM DO? Esta é uma maneira segura e rápida de configurar uma VPN entre o escritório e o GCP?
No momento, colocamos um .gitlab-ci.yml em cada projeto. No momento temos mais de 50 projetos e toda vez que algo muda no .gitlab-ci.yml a equipe tem que mudar a estrutura de todos os projetos. É possível ter um .gitlab-ci.yml comum?
tentativas
- Tentei ter um gitlab-ci.yml, mas não sei como alterar o caminho padrão para este arquivo
- scripts comuns diminuem a quantidade de duplicação de código, mas se a estrutura do gitlab-ci.yml mudar, temos que implementá-la em todos os projetos
Se firewall_allowed_ports
em:
- name: port {{ item }} allowed in firewall
ufw:
rule: allow
port: "{{ item }}"
proto: tcp
with_items:
- 22
- "{{ firewall_allowed_ports }}"
é indefinido, ocorre este erro:
fatal: [host.example.com]: FAILED! => {"failed": true, "msg": "the field 'args'
has an invalid value, which appears to include a variable that is undefined.
Tente resolver o problema
"{{ firewall_allowed_ports | }}"
resulta em:
fatal: [host.example.com]: FAILED! => {"failed": true, "msg": "template error
while templating string: expected token 'name', got 'end of print statement'.
String: {{ firewall_allowed_ports | }}"}
Uma função ansible-sensu-plugin-install foi criada para instalar sensu-plugins usando este código :
- name: be sure sensu-plugins-{{ item.name }} is installed
command: sensu-install -p {{ item.name }}:{{ item.version }}
when: "'sensu-plugins-{{ item.name }} ({{ item.version }})' not in installed_plugins.stdout"
with_items: "{{ sensu_plugin_install }}"
Existem duas outras funções que requerem plugins sensu. A primeira função requer o plug-in mailer :
sensu_plugin_install:
- name: mailer
version: 1.0.0
e o segundo requer vários plugins :
sensu_plugin_install:
- name: cpu-checks
version: 1.0.0
- name: disk-checks
version: 2.0.1
- name: http
version: 1.0.0
- name: memory-checks
version: 1.0.2
- name: ntp
version: 1.0.0
As funções um e dois foram incluídas em um manual.
resultado atual
O mailer
definido na função um ou os plug-ins definidos na função dois serão instalados. Comentar uma das sensu_plugin_install
declarações instalará plug-ins relacionados à função um ou dois, por exemplo, apenas o plug-in do mailer será instalado:
TASK [030.sensu-plugin-install : be sure sensu-plugins-{{ item.name }} is
installed] ***
changed: [host.example.com] => (item={u'version': u'1.0.0', u'name':
u'mailer'}) => {"changed": true,
se o sensu_plugin_install
da segunda função foi comentado.
Resultado esperado
O resultado esperado é que todos os plugins sejam instalados, ou seja, seis neste caso ao invés de um, mailer
ou seja, cinco.
Discussão
Parece que as matrizes não serão mescladas, pois um ou cinco plug-ins serão instalados em vez de seis e um dos dois precisa ser comentado para forçar a instalação de um plug-in.
Uma opção para resolver esse problema é mesclar esses arrays, ou seja, sensu_plugin_install + sensu_plugin_install
. Por exemplo, no Puppet é possível mesclar arrays usando hiera_array
. Como isso poderia ser feito no Ansible?
Usar duas variáveis diferentes para resolver o problema não é uma opção, pois a funcionalidade de uma função é usada e não é preferível adicionar outra variável a essa função se outra função desejar instalar plug-ins sensu.
No momento, várias funções foram definidas no site.yml:
- include: role1.yml
- include: role2.yml
- include: role3.yml
- include: role4.yml
- include: role5.yml
e estes são executados de forma síncrona, emitindo:
ansible-playbook -i testing site.yml -u root --vault-password-file ~/.vault_pass.txt
Pergunta
Como executar as funções definidas no site.yml de uma só vez?
Discussão
Ele funciona para executar todas as funções de forma assíncrona, abrindo vários terminais e executando:
ansible-playbook -i testing playbook1.yml -u root --vault-password-file ~/.vault_pass.txt
ansible-playbook -i testing playbook2.yml -u root --vault-password-file ~/.vault_pass.txt
ansible-playbook -i testing playbook3.yml -u root --vault-password-file ~/.vault_pass.txt
ansible-playbook -i testing playbook4.yml -u root --vault-password-file ~/.vault_pass.txt
ansible-playbook -i testing playbook5.yml -u root --vault-password-file ~/.vault_pass.txt
Com base neste exemplo:
- lineinfile: dest=/opt/jboss-as/bin/standalone.conf regexp='^(.*)Xms(\d+)m(.*)$' line='\1Xms${xms}m\3' backrefs=yes
a partir desta documentação , tentou-se fazer uma regex-replace no Ansible.
Versão Ansible
user@server:/home$ ansible --version
ansible 2.1.1.0
/caminho/para/arquivo:
helloworld
Trechos ansible:
- lineinfile:
dest: /path/to/file
regexp='^(hello)world$'
line='\1030'
tentativa 2
- lineinfile:
dest: /path/to/file
regexp='^(hello)world$'
line="\1030"
Resultado esperado:
hello030
Resultado atual:
\1030
Perguntas
- Por que o resultado é
\1030
em vez dehello030
? - Como resolver isso?
Existe um módulo capaz de instalar arquivos gulp, como é possível para npm :
description: Install "coffee-script" node.js package. - npm: name=coffee-script path=/app/location description: Install "coffee-script" node.js package on version 1.6.1. - npm: name=coffee-script version=1.6.1 path=/app/location description: Install "coffee-script" node.js package globally. - npm: name=coffee-script global=yes description: Remove the globally package "coffee-script". - npm: name=coffee-script global=yes state=absent description: Install "coffee-script" node.js package from custom registry. - npm: name=coffee-script registry=http://registry.mysite.com description: Install packages based on package.json. - npm: path=/app/location description: Update packages based on package.json to their latest version. - npm: path=/app/location state=latest description: Install packages based on package.json using the npm installed with nvm v0.10.1. - npm: path=/app/location executable=/opt/nvm/v0.10.1/bin/npm state=present
No momento, o seguinte trecho:
- command: /usr/local/lib/npm/bin/gulp
args:
chdir: "{{ project_dir }}"
é usado para instalar pacotes gulp, mas é possível fazer da seguinte maneira?
description: Install packages based on package.json.
- gulp: path=/app/location
meta/main.yml
dependencies:
- { role: 030.sensu-install }
resulta em:
[DEPRECATION WARNING]: The comma separated role spec format, use the
yaml/explicit format instead..
This feature will be removed in a future release.
Deprecation warnings can be disabled by setting deprecation_warnings=False in
ansible.cfg.
quando sudo ansible-galaxy install -r requirements/development.yml
é emitido.
Tentativas de resolver o problema
Quando
dependencies:
- role: 030.sensu-install
version: 0.1.0
é definido, a verificação de sintaxe é bem-sucedida, mas o aviso de descontinuação persiste.
Quando
dependencies:
- src: 030.sensu-install
version: 0.1.0
é definido, sudo ansible-galaxy install -r requirements/development.yml
é executado, o aviso de descontinuação é resolvido, mas ansible-playbook /etc/ansible/roles/role_under_test/tests/${playbook} --syntax-check
resulta em:
ERROR! role definitions must contain a role name
Esta documentação explica como copiar arquivos e diretórios usando o copy
módulo no Ansible. Como copiar todos os filhos, exceto um?
Discussão
- As opções não esclarecem como isso pode ser feito.
- Copiar todos os filhos individualmente não é uma opção, pois o pai contém mais de 100 filhos.
Mirar
O objetivo é implantar o software assim que a compilação for aprovada usando Ansible e Gitlab.
Problema
ansible-playbook playbook.yml -u root --private-key=key.pem
implanta o software, mas
sudo -u gitlab-runner ansible-playbook playbook.yml -u root --private-key=key.pem
resulta em:
PLAY ***************************************************************************
TASK [setup] *******************************************************************
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: OSError: [Errno 13] Permission denied: '/root/.ansible'
fatal: [system.example.com]: FAILED! => {"failed": true, "stdout": ""}
NO MORE HOSTS LEFT *************************************************************
PLAY RECAP *********************************************************************
system.example.com : ok=0 changed=0 unreachable=0 failed=1
Discussão
A execução
ansible-playbook --help
mostra que-u
é o remote_user. Como isso está definido,root
o problema não deve ocorrer.fazer login como
gitlab-runner
e, posteriormente, executar comansible-playbook playbook.yml -u root --private-key=key.pem
sucesso
Para permitir que as verificações apareçam no Uchiwa quando um novo cliente sensu for adicionado, o sensu-server
e sensu-api
precisa ser reiniciado. No momento existem 5 clientes e um servidor. Sempre que um novo cliente sensu é adicionado usando o ansible, as verificações não aparecem no Uchiwa. No momento, preciso fazer login no sensu-server e reiniciar os serviços. Como automatizar isso usando ansible?
De acordo com esta documentação , existem manipuladores:
handlers:
- name: restart memcached
service: name=memcached state=restarted
listen: "restart web services"
- name: restart apache
service: name=apache state=restarted
listen: "restart web services"
que poderia ser chamado usando notify:
tasks:
- name: restart everything
command: echo "this task will restart the web services"
notify: "restart web services"
para que o serviço seja reiniciado se ocorrer uma alteração, por exemplo, na configuração, mas como notificar um serviço remoto, por exemplo, notificar o serviço no IP-B do IP-A?
Eu li vários documentos, incluindo este, e verifiquei várias funções ansible no GitHub, mas não está claro para mim quando definir uma variável e quando definir onde colocá-la, ou seja, no diretório defaults
, tasks
ou vars
.
Gostaria de receber orientações para não ter que gastar muito tempo pensando se uma variável é necessária e se for o caso onde colocá-la.
sensu_host: localhost
sensu_home: /etc/sensu
sensu_conf_d: "{{ sensu_home }}/conf.d"
- name: be sure {{ item }} is installed
apt:
name: "{{ item }}"
state: latest
with_items:
- build-essential
- ntp
ou os itens devem ser definidos em uma variável:
- name: be sure {{ item }} is installed
apt:
name: "{{ item }}"
state: latest
with_items:
{{ packages }}
__sensu_repo_url: deb http://sensu.global.ssl.fastly.net/apt sensu main
__sensu_repo_key_url: http://sensu.global.ssl.fastly.net/apt/pubkey.gp
Existe uma determinada lista de verificação, por exemplo
Se a, b, c então a variável precisa ser declarada nos padrões
se d, e, f então o v
se g, h, eu então defino em tarefas
╔═══════════╦═════════════════╗
║ directory ║ characteristics ║
╠═══════════╬═════════════════╣
║ defaults ║ constants, e.g. ║
║ tasks ║ bla, e.g. ║
║ vars ║ variables ║
╚═══════════╩═════════════════╝