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

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

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

EXPORT LC_ALL=C

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

내가 뭘 놓치고 있니



답변

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

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 문서를 참조하십시오.


답변

나는 논평 할만한 충분한 평판을 얻지 못했기 때문에 새로운 답변을 추가하고 있습니다.
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";

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


답변

다음은 키 / 값을 영구적으로 설정하는 빠른 로컬 작업입니다 /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새 환경 변수가 표시됩니다.


답변

환경 변수를 지속적으로 설정하려면 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


답변

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

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


답변