Cách đặt các biến môi trường Linux với Ansible


95

Xin chào, tôi đang cố gắng tìm cách đặt biến môi trường với Ansible.

một cái gì đó mà một lệnh shell đơn giản như thế này:

EXPORT LC_ALL=C

đã thử dưới dạng lệnh shell và gặp lỗi khi thử sử dụng mô-đun môi trường và không có gì xảy ra.

tôi đang thiếu cái gì


1
Bạn có cần đặt nó trong một tài khoản cụ thể ($ HOME / .profile, mặc định (/ etc / profile) hay chỉ làm cho nó có sẵn trước khi cài đặt hoặc chạy một ứng dụng?
BMW

Tôi cần đặt nó thành để có thể sử dụng bảng điều khiển mongodb. Sau khi tôi nâng máy tôi không thể đi vào giao diện điều khiển với ra xuất khẩu biến này
Gleeb

ok, bạn đang nói về mô-đun mongodb trong ansible, vậy tại sao không đặt nó trực tiếp khi bạn chuẩn bị mô-đun đó (cài đặt, đặt tệp cấu hình hoặc khởi động dịch vụ của nó)?
BMW

1
Làm thế nào để thiết lập một biến môi trường có liên quan đến mô-đun mongodb. Và tôi đã không sử dụng nó ở tất cả. Tất cả những gì tôi muốn là cài đặt mongo, đặt env var và bắt đầu aervice
Gleeb

vì vậy bạn chưa có sẵn mô-đun mongodb đó? sau đó bạn cần dành thời gian cho nó trước, sau đó vấn đề của bạn không phải là vấn đề.
BMW

Câu trả lời:


157

Có nhiều cách để làm điều này và từ câu hỏi của bạn, không rõ bạn cần gì.

1. Nếu bạn cần biến môi trường được xác định CHỈ MỖI NHIỆM VỤ, bạn thực hiện điều này:

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

Lưu ý rằng MY_ENV_VARIABLEchỉ khả dụng cho tác vụ đầu tiên, environmentkhông đặt nó vĩnh viễn trên hệ thống của bạn.

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

Hy vọng rằng sẽ sớm sử dụng environmentđược ở cấp độ chơi chứ không chỉ cấp độ nhiệm vụ như trên. Hiện có một yêu cầu kéo đang mở cho tính năng này trên GitHub của Ansible: https://github.com/ansible/ansible/pull/8651

CẬP NHẬT: Nó hiện đã được hợp nhất kể từ ngày 2 tháng 1 năm 2015.

2. Nếu bạn muốn biến môi trường vĩnh viễn + toàn hệ thống / chỉ cho một số người dùng nhất định

Bạn nên xem xét cách bạn thực hiện trong bản phân phối / shell Linux của mình, có rất nhiều nơi cho điều đó. Ví dụ trong Ubuntu, bạn xác định điều đó trong các tệp như ví dụ:

  • ~/.profile
  • /etc/environment
  • /etc/profile.d danh mục
  • ...

Bạn sẽ tìm thấy tài liệu Ubuntu về nó tại đây: https://help.ubuntu.com/community/EnosystemVariables

Sau khi tất cả để thiết lập biến môi trường trong ví dụ. Ubuntu bạn chỉ có thể sử dụng lineinfilemô-đun từ Ansible và thêm dòng mong muốn vào tệp nhất định. Tham khảo tài liệu hệ điều hành của bạn để biết nơi thêm nó để làm cho nó vĩnh viễn.


6
Tùy chọn thứ hai là những gì tôi cần. Tôi đã tự mình tìm ra giải pháp, nhưng đó là giải pháp.
Gleeb

2
Cập nhật nhanh: Yêu cầu kéo # 8651 cho Ansible đã được hợp nhất, vì vậy bây giờ bạn cũng có thể thực hiện việc này ở cấp độ chơi.
Michal Gasek

8
Vì vậy, không có cách nào để thiết lập các biến môi trường liên tục thông qua Ansible?
garbagecollector

1
@DumpHole Tôi đã sử dụng vai trò "Franklinkim.enosystem" từ Ansible Galaxy cho điều đó.
Ates Goral

1
Điều gì sẽ xảy ra nếu bạn muốn đặt một môi trường có thể so sánh được cho chỉ bash shell hiện tại? ví dụ: mật khẩu được giải mã có thể được sử dụng theo cách này.
openCivilisation

28

Tôi không có đủ danh tiếng để bình luận và do đó tôi đang thêm một câu trả lời mới.
Câu trả lời của Gasek là khá đúng. Chỉ một điều: nếu bạn đang cập nhật .bash_profiletệp hoặc /etc/profile, những thay đổi đó sẽ chỉ được phản ánh sau khi bạn thực hiện đăng nhập mới. Trong trường hợp bạn muốn đặt biến env và sau đó sử dụng nó trong các tác vụ tiếp theo trong cùng một playbook, hãy xem xét việc thêm các biến môi trường đó vào .bashrctệp.
Tôi đoán lý do đằng sau điều này là do đăng nhập và shell không đăng nhập.
Ansible, trong khi thực thi các tác vụ khác nhau, đọc các tham số từ một .bashrctệp thay vì .bash_profilehoặc /etc/profile.

Ví dụ: nếu tôi cập nhật biến đường dẫn của mình để bao gồm tệp nhị phân tùy chỉnh trong .bash_profiletệp của người dùng tương ứng và sau đó tạo nguồn của tệp. Các tác vụ tiếp theo sẽ không nhận ra lệnh của tôi. Tuy nhiên, nếu bạn cập nhật trong .bashrctệp, lệnh sẽ hoạt động.

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

Điều này sẽ hoạt động , nhưng nếu tôi thực hiện nó bằng cách sử dụng các tệp hồ sơ thì mysql -e "show databases"sẽ có lỗi.

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

Cái này sẽ không hoạt động , nếu chúng ta có tất cả các tác vụ này trong cùng một playbook.


2
Nếu shell mặc định là sh, nguồn có thể không hoạt động. Thay vì source filelàm. file
Cloverr

12

Đây là tác vụ cục bộ nhanh chóng để bật khóa / giá trị vĩnh viễn /etc/environment(áp dụng cho toàn hệ thống, tất cả người dùng):

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

và các vars cho nó:

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

và, có, nếu bạn ra và quay lại, envsẽ hiển thị các biến môi trường mới.


destđã được thay thế bằng path, nhưng theo tài liệu sẽ vẫn hoạt động. Nếu không, hãy chuyển sang path.
đoán

9

Để liên tục thiết lập các biến môi trường, bạn có thể sử dụng một trong các vai trò hiện có tại Ansible Galaxy. Tôi khuyên bạn nên dùng Weareinteractive.en môi trường .

Sử dụng thiên hà ansible:

$ ansible-galaxy install weareinteractive.environment

Sử dụng request.yml:

- src: franklinkim.environment

Sau đó, trong playbook của bạn:

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

@openCivilisation đã cập nhật!
Ates Goral

lưu ý: wearreinteractive.enosystem ghi vào / etc / environment
simohe

5

Đây là lựa chọn tốt nhất. Như đã nói Michal Gasek (câu trả lời đầu tiên), vì yêu cầu kéo đã được hợp nhất ( https://github.com/ansible/ansible/pull/8651 ), chúng tôi có thể dễ dàng đặt các biến môi trường vĩnh viễn theo cấp độ chơi.

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

2
Môi trường có chạy trước vai trò không? Bởi vì tra cứu của tôi vẫn còn trống.
EvgenyKolyakov

Thậm chí tra cứu của tôi là không phân biệt trống trật tự
AhmFM

Cảnh báo duy nhất về điều này là các môi trường trong cấp playbook sẽ được giải quyết trước khi playbook chạy. Đây sẽ là hữu ích nếu bạn biết tất cả các giá trị trước đó, nhưng nếu bạn muốn thêm một giá trị dinamically Tôi đề nghị sau câu trả lời JL Peyret của
Bubzsan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.