Como definir variáveis ​​de ambiente Linux com Ansible

96

Olá, estou tentando descobrir como definir a variável de ambiente com o Ansible.

algo que um simples comando de shell como este:

EXPORT LC_ALL=C

tentei como um comando shell e ocorreu um erro ao tentar usar o módulo de ambiente e nada aconteceu.

o que estou perdendo

Gleeb
fonte
1
Você precisa configurá-lo em uma conta específica ($ HOME / .profile, padrão (/ etc / profile) ou apenas disponibilizá-lo antes de instalar ou executar um aplicativo?
BMW
Eu preciso configurá-lo para usar o console mongodb. Depois de aumentar a máquina, não consigo entrar no console sem exportar essa variável
Gleeb
ok, você está falando sobre o módulo mongodb em ansible, então por que não colocá-lo diretamente ao preparar esse módulo (instalar, definir o arquivo de configuração ou iniciar seu serviço)?
BMW
1
Como definir uma variável de ambiente tem algo a ver com o módulo mongodb. E eu não usei nada. Tudo que eu quero é instalar o mongo, definir o env var e iniciar o serviço
Gleeb 01 de
então você não tinha aquele módulo mongodb pronto? então você precisa dedicar um tempo primeiro, então seu problema não é problema.
BMW

Respostas:

157

Existem várias maneiras de fazer isso e a partir de sua pergunta não fica claro o que você precisa.

1. Se precisar que a variável de ambiente seja definida SOMENTE POR TAREFA, faça o seguinte:

- hosts: dev
  tasks:
    - name: Echo my_env_var
      shell: "echo $MY_ENV_VARIABLE"
      environment:
        MY_ENV_VARIABLE: whatever_value

    - name: Echo my_env_var again
      shell: "echo $MY_ENV_VARIABLE"

Observe que MY_ENV_VARIABLEestá disponível SOMENTE para a primeira tarefa, environmentnão a define permanentemente em seu sistema.

TASK: [Echo my_env_var] ******************************************************* 
changed: [192.168.111.222] => {"changed": true, "cmd": "echo $MY_ENV_VARIABLE", ... "stdout": "whatever_value"}

TASK: [Echo my_env_var again] ************************************************* 
changed: [192.168.111.222] => {"changed": true, "cmd": "echo $MY_ENV_VARIABLE", ... "stdout": ""}

Esperançosamente, em breve o uso environmenttambém será possível no nível de jogo , não apenas no nível de tarefa como acima. Atualmente, há uma solicitação de pull aberta para esse recurso no GitHub da Ansible: https://github.com/ansible/ansible/pull/8651

ATUALIZAÇÃO: agora foi incorporado a partir de 2 de janeiro de 2015.

2. Se você deseja uma variável de ambiente permanente + sistema amplo / apenas para determinado usuário

Você deve examinar como fazer isso em sua distribuição / shell do Linux, existem vários lugares para isso. Por exemplo, no Ubuntu você define isso em arquivos como por exemplo:

  • ~/.profile
  • /etc/environment
  • /etc/profile.d diretório
  • ...

Você encontrará documentos do Ubuntu sobre isso aqui: https://help.ubuntu.com/community/EnvironmentVariables

Afinal, para definir a variável de ambiente em ex. Ubuntu você pode simplesmente usar o lineinfilemódulo do Ansible e adicionar a linha desejada a determinado arquivo. Consulte a documentação do seu sistema operacional para saber onde adicioná-lo para torná-lo permanente.

Michal Gasek
fonte
6
A segunda opção é o que eu precisava. Eu mesmo cheguei à solução, mas é essa.
Gleeb
2
Atualização rápida: a solicitação de pull # 8651 para Ansible foi mesclada, então agora é possível fazer isso também no nível de jogo.
Michal Gasek
8
Portanto, não há como definir variáveis ​​de ambiente persistentes por meio do Ansible?
coletor de lixo de
1
@DumpHole Usei o papel "franklinkim.environment" do Ansible Galaxy para isso.
Ates Goral de
1
E se você quiser definir uma variável de ambiente apenas para o shell bash atual? por exemplo, uma senha descriptografada pode ser usada dessa forma.
openCivilisation
28

Não tenho reputação suficiente para comentar e, portanto, estou adicionando uma nova resposta.
A resposta de Gasek é bastante correta. Só uma coisa: se você estiver atualizando o .bash_profilearquivo ou o /etc/profile, essas alterações só serão refletidas depois de fazer um novo login. Caso queira definir a variável env e depois usá-la em tarefas subsequentes no mesmo manual, considere adicionar essas variáveis ​​de ambiente ao .bashrcarquivo.
Acho que a razão por trás disso é o login e os shells de não login.
O Ansible, ao executar diferentes tarefas, lê os parâmetros de um .bashrcarquivo em vez do .bash_profileou do/etc/profile .

Por exemplo, se eu atualizei minha variável de caminho para incluir o binário personalizado no .bash_profilearquivo do respectivo usuário e, em seguida, fiz uma fonte do arquivo. As próximas tarefas subsequentes não reconhecerão meu comando. No entanto, se você atualizar o .bashrcarquivo, o comando funcionará.

 - name: Adding the path in the bashrc files
   lineinfile: dest=/root/.bashrc line='export PATH=$PATH:path-to-mysql/bin' insertafter='EOF' regexp='export PATH=\$PATH:path-to-mysql/bin' state=present
 
-  - name: Source the bashrc file
   shell: source /root/.bashrc

 - name: Start the mysql client
   shell: mysql -e "show databases";

Isso funcionaria , mas se eu tivesse feito isso usando arquivos de perfil mysql -e "show databases", teria ocorrido um erro.

- name: Adding the path in the Profile files
   lineinfile: dest=/root/.bash_profile line='export PATH=$PATH:{{install_path}}/{{mysql_folder_name}}/bin' insertafter='EOF' regexp='export PATH=\$PATH:{{install_path}}/{{mysql_folder_name}}/bin' state=present

 - name: Source the bash_profile file
   shell: source /root/.bash_profile

 - name: Start the mysql client
   shell: mysql -e "show databases";

Este não irá funcionar , se nós temos todas estas tarefas na mesma cartilha.

gaurav parashar
fonte
2
Se o shell padrão for sh, o código-fonte pode não funcionar. Em vez de source filefazer. file
Cloverr
12

Esta é uma tarefa local rápida para definir chaves / valores permanentemente /etc/environment(que abrange todo o sistema, todos os usuários):

- name: populate /etc/environment
  lineinfile:
    dest: "/etc/environment"
    state: present
    regexp: "^{{ item.key }}="
    line: "{{ item.key }}={{ item.value}}"
  with_items: "{{ os_environment }}"

e os vars por isso:

os_environment:
  - key: DJANGO_SETTINGS_MODULE 
    value : websec.prod_settings  
  - key: DJANGO_SUPER_USER 
    value : admin

e, sim, se você entrar e sair do sistema, envmostra as novas variáveis ​​de ambiente.

JL Peyret
fonte
destfoi substituído com path, mas de acordo com os documentos ainda deve funcionar. Caso contrário, mude para path.
guessimtoolate
9

Para definir variáveis ​​de ambiente de forma persistente, você pode usar uma das funções existentes no Ansible Galaxy. Eu recomendo usar o ambiente.reinterativo .

Usando ansible-galaxy:

$ ansible-galaxy install weareinteractive.environment

Usando requirements.yml:

- src: franklinkim.environment

Então, em seu manual:

- hosts: all
  sudo: yes
  roles:
    - role: franklinkim.environment
      environment_config:
        NODE_ENV: staging
        DATABASE_NAME: staging
Ates Goral
fonte
@openCivilisation atualizado!
Ates Goral
observação: weareinteractive.environment grava em / etc / environment
simohe
5

Essa é a melhor opção. Como disse Michal Gasek (primeira resposta), uma vez que a solicitação de pull foi mesclada ( https://github.com/ansible/ansible/pull/8651 ), podemos definir variáveis ​​de ambiente permanentes facilmente por nível de jogo.

- hosts: all
  roles:
     - php
     - nginx
  environment:
    MY_ENV_VARIABLE: whatever_value
lauralacarra
fonte
2
O ambiente é executado antes da função? Porque minha pesquisa ainda está vazia.
EvgenyKolyakov
Mesmo minha pesquisa está vazia, independentemente da ordem
AhmFM
A única ressalva sobre isso é que os ambientes no nível do manual serão resolvidos antes que o manual seja executado. Isso será útil se você souber todos os valores de antemão, mas se quiser adicionar um valor dinamicamente, sugiro seguir a resposta de JL Peyret
Bubzsan 06/12/19