안녕하세요, Ansible로 환경 변수를 설정하는 방법을 찾으려고합니다.
다음과 같은 간단한 쉘 명령이 있습니다.
EXPORT LC_ALL=C
쉘 명령으로 시도했지만 환경 모듈을 사용하여 오류가 발생했지만 아무 일도 일어나지 않았습니다.
내가 뭘 놓치고 있니
안녕하세요, 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에서는 lineinfile
Ansible의 모듈을 사용 하고 특정 파일에 원하는 줄을 추가 할 수 있습니다. 영구적으로 만들기 위해 추가 할 위치를 알아 보려면 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";
이 하나가 작동하지 않습니다 , 우리는 같은 작전에서 모든 작업이있는 경우.
source file
할 일. file
다음은 키 / 값을 영구적으로 설정하는 빠른 로컬 작업입니다 /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