Ansible로 Linux 환경 변수를 설정하는 방법


97

안녕하세요, Ansible로 환경 변수를 설정하는 방법을 찾으려고합니다.

다음과 같은 간단한 쉘 명령이 있습니다.

EXPORT LC_ALL=C

쉘 명령으로 시도했지만 환경 모듈을 사용하여 오류가 발생했지만 아무 일도 일어나지 않았습니다.

내가 뭘 놓치고 있니


1
특정 계정 ($ HOME / .profile, 기본값 (/ etc / profile))에서 설정해야합니까, 아니면 응용 프로그램을 설치하거나 실행하기 전에 사용할 수 있도록해야합니까?
BMW

mongodb 콘솔을 사용할 수 있도록 설정해야합니다. 컴퓨터를 올린 후에는이 변수를 내 보내지 않고 콘솔에 들어갈 수 없습니다
Gleeb

좋아, 당신은 ansible에서 mongodb 모듈에 대해 이야기하고 있는데, 모듈을 준비 할 때 (설치, 구성 파일 설정 또는 서비스 시작) 직접 배치하지 않는 이유는 무엇입니까?
BMW

1
환경 변수 설정은 mongodb 모듈과 어떤 관련이 있습니다. 그리고 나는 그것을 전혀 사용하지 않았습니다. 내가 원하는 것은 mongo를 설치하고 환경 변수를 설정하고 aervice를 시작하는 것입니다
Gleeb

그래서 그 mongodb 모듈을 준비하지 않았습니까? 그런 다음 먼저 그것에 시간을 할애해야합니다. 그러면 문제가 문제가 아닙니다.
BMW

답변:


159

이를 수행하는 방법에는 여러 가지가 있으며 귀하의 질문에서 필요한 것이 무엇인지 명확하지 않습니다.

1. 작업 별 환경 변수를 정의해야하는 경우 다음을 수행합니다.

- 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"

참고 MY_ENV_VARIABLE첫 번째 작업에 사용할 수는 environment시스템에 영구적으로 설정하지 않습니다.

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": ""}

위와 같은 작업 수준뿐만 아니라 플레이 수준environment 에서도 곧 사용할 수 있기를 바랍니다 . 현재 Ansible의 GitHub : https://github.com/ansible/ansible/pull/8651 에이 기능에 대한 풀 요청이 열려 있습니다.

업데이트 : 2015 년 1 월 2 일 현재 병합되었습니다.

2. 영구 환경 변수 + 시스템 전체를 원할 경우 / 특정 사용자 만

Linux 배포판 / 셸에서 수행하는 방법을 살펴보아야합니다. 여기에는 여러 위치가 있습니다. 예를 들어 Ubuntu에서는 예를 들어 다음과 같은 파일에서 정의합니다.

  • ~/.profile
  • /etc/environment
  • /etc/profile.d 예배 규칙서
  • ...

여기에서 Ubuntu 문서를 찾을 수 있습니다 : https://help.ubuntu.com/community/EnvironmentVariables

결국 ex에서 환경 변수를 설정하십시오. Ubuntu에서는 lineinfileAnsible의 모듈을 사용 하고 특정 파일에 원하는 줄을 추가 할 수 있습니다. 영구적으로 만들기 위해 추가 할 위치를 알아 보려면 OS 문서를 참조하십시오.


6
두 번째 옵션은 내가 필요한 것입니다. 나는 스스로 해결책에 도달했지만 그게 하나입니다.
Gleeb

2
빠른 업데이트 : Ansible에 대한 Pull 요청 # 8651이 병합되었으므로 이제 플레이 레벨에서도이 작업을 수행 할 수 있습니다.
Michal Gasek

8
그렇다면 Ansible을 통해 영구 환경 변수를 설정할 방법이 없습니까?
garbagecollector

1
@DumpHole 저는이를 위해 Ansible Galaxy의 "franklinkim.environment"역할을 사용했습니다.
Ates Goral 16.04.22

1
현재 bash 셸에 대해서만 환경 변수를 설정하려면 어떻게해야합니까? 예를 들어, 암호 해독 된 암호가 이러한 방식으로 사용될 수 있습니다.
openCivilisation

30

나는 논평 할만한 충분한 평판을 얻지 못했기 때문에 새로운 답변을 추가하고 있습니다.
Gasek 대답은 아주 정확합니다. 한 가지만 : .bash_profile파일 또는을 업데이트하는 경우 /etc/profile해당 변경 사항은 새 로그인을 수행 한 후에 만 ​​반영됩니다. env 변수를 설정 한 다음 동일한 플레이 북의 후속 작업에서 사용하려면 해당 환경 변수를 .bashrc파일 에 추가하는 것이 좋습니다.
그 이유는 로그인 및 비 로그인 쉘 때문이라고 생각합니다.
Ansible는 다른 작업을 실행하는 동안, a로부터 매개 변수를 읽는 .bashrc대신의 파일 .bash_profile또는를 /etc/profile.

예를 들어, .bash_profile각 사용자 의 파일에 사용자 지정 바이너리를 포함하도록 경로 변수를 업데이트 한 다음 파일 소스를 수행 한 경우입니다. 다음 후속 작업은 내 명령을 인식하지 못합니다. 그러나 .bashrc파일 에서 업데이트 하면 명령이 작동합니다.

 - 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";

이 일 것입니다 , 하지만 난 프로필 파일 (가) 사용을했던 mysql -e "show databases"오류를 준 것이다.

- 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";

이 하나가 작동하지 않습니다 , 우리는 같은 작전에서 모든 작업이있는 경우.


2
기본 셸이 sh이면 소스가 작동하지 않을 수 있습니다. 대신에 source file할 일. file
Cloverr

13

다음은 키 / 값을 영구적으로 설정하는 빠른 로컬 작업입니다 /etc/environment(시스템 전체, 모든 사용자).

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

그리고 그것에 대한 vars :

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

그리고 예, ssh를 껐다가 다시 넣으면 env새 환경 변수가 표시됩니다.


dest로 대체 path되었지만 문서 에 따르면 여전히 작동합니다. 그렇지 않은 경우로 전환하십시오 path.
guessimtoolate

9

환경 변수를 지속적으로 설정하려면 Ansible Galaxy에서 기존 역할 중 하나를 사용할 수 있습니다. 나는 weareinteractive.environment를 추천 합니다 .

ansible-galaxy 사용 :

$ ansible-galaxy install weareinteractive.environment

requirements.yml 사용 :

- src: franklinkim.environment

그런 다음 플레이 북에서 :

- hosts: all
  sudo: yes
  roles:
    - role: franklinkim.environment
      environment_config:
        NODE_ENV: staging
        DATABASE_NAME: staging

@openCivilisation 업데이트되었습니다!
Ates Goral

참고 : weareinteractive.environment는 / etc / environment에 기록합니다
simohe

5

이것이 최선의 선택입니다. Michal Gasek (첫 번째 답변)이 말했듯이 풀 리퀘스트가 병합 되었기 때문에 ( https://github.com/ansible/ansible/pull/8651 ), 플레이 레벨별로 쉽게 영구 환경 변수 를 설정할 수 있습니다.

- hosts: all
  roles:
     - php
     - nginx
  environment:
    MY_ENV_VARIABLE: whatever_value

2
환경이 역할보다 먼저 실행됩니까? 내 조회가 아직 비어 있기 때문입니다.
EvgenyKolyakov

내 조회조차 순서에 관계없이 비어 있습니다
AhmFM

이에 대한 유일한주의 사항은 플레이 북이 실행되기 전에 플레이 북 수준의 환경이 해결된다는 것입니다. 사전에 모든 값을 알고있는 경우에 유용 할 것이다, 그러나 당신이 dinamically 값을 추가하려면 나는 JL Peyret의 대답은 다음과 같은 제안
Bubzsan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.