วิธีตั้งค่าตัวแปรสภาพแวดล้อม Linux ด้วย Ansible


101

สวัสดีฉันกำลังพยายามค้นหาวิธีตั้งค่าตัวแปรสภาพแวดล้อมด้วย Ansible

สิ่งที่คำสั่งเชลล์ง่ายๆเช่นนี้:

EXPORT LC_ALL=C

พยายามเป็นคำสั่งเชลล์และได้รับข้อผิดพลาดในการลองใช้โมดูลสภาพแวดล้อมและไม่มีอะไรเกิดขึ้น

ฉันขาดอะไรไป


1
คุณต้องการตั้งค่าในบัญชีเฉพาะ ($ HOME / .profile ค่าเริ่มต้น (/ etc / profile) หรือเพียงแค่ทำให้พร้อมใช้งานก่อนติดตั้งหรือเรียกใช้แอปพลิเคชัน
BMW

ฉันต้องตั้งค่าเป็นเพื่อให้ฉันสามารถใช้ mongodb console หลังจากฉัน
ยกเครื่อง

ตกลงคุณกำลังพูดถึงโมดูล mongodb ใน ansible แล้วทำไมไม่ใส่โดยตรงเมื่อคุณเตรียมโมดูลนั้น (ติดตั้งตั้งไฟล์ config หรือเริ่มบริการ)
BMW

1
การตั้งค่าตัวแปรสภาพแวดล้อมมีส่วนเกี่ยวข้องกับโมดูล mongodb อย่างไร และฉันไม่ได้ใช้มันเลย ทั้งหมดที่ฉันต้องการคือการติดตั้ง mongo ตั้งค่า env var และเริ่มการบิน
Gleeb

คุณยังไม่มีโมดูล mongodb นั้นพร้อมหรือไม่? คุณต้องใช้เวลากับมันก่อนแล้วปัญหาของคุณก็ไม่ใช่ปัญหา
BMW

คำตอบ:


163

มีหลายวิธีในการทำเช่นนี้และจากคำถามของคุณก็ไม่ชัดเจนว่าคุณต้องการอะไร

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จะเป็นไปได้ในระดับการเล่นไม่ใช่แค่ระดับงานตามที่กล่าวมา ขณะนี้มีคำขอดึงคุณลักษณะนี้บน GitHub ของ Ansible: https://github.com/ansible/ansible/pull/8651

อัปเดต: ตอนนี้รวมเข้าด้วยกันเมื่อวันที่ 2 มกราคม 2558

2. หากคุณต้องการตัวแปรสภาพแวดล้อมถาวร + ระบบกว้าง / เฉพาะสำหรับผู้ใช้บางราย

คุณควรดูว่าคุณทำอย่างไรในการแจกจ่าย / เชลล์ของ Linux มีหลายที่สำหรับสิ่งนั้น ตัวอย่างเช่นใน Ubuntu คุณกำหนดสิ่งนั้นในไฟล์เช่น:

  • ~/.profile
  • /etc/environment
  • /etc/profile.d ไดเรกทอรี
  • ...

คุณจะพบเอกสารของ Ubuntu ได้ที่นี่: https://help.ubuntu.com/community/EnvironmentVariables

หลังจากทั้งหมดสำหรับการตั้งค่าตัวแปรสภาพแวดล้อมในอดีต Ubuntu คุณสามารถใช้lineinfileโมดูลจาก Ansible และเพิ่มบรรทัดที่ต้องการลงในไฟล์บางไฟล์ ปรึกษาเอกสาร OS ของคุณเพื่อทราบตำแหน่งที่จะเพิ่มเพื่อให้ถาวร


6
ตัวเลือกที่สองคือสิ่งที่ฉันต้องการ ฉันไปถึงวิธีแก้ปัญหาด้วยตัวเอง แต่นั่นคือสิ่งเดียว
Gleeb

2
อัปเดตด่วน: ดึงคำขอ # 8651 สำหรับ Ansible เข้าด้วยกันดังนั้นตอนนี้จึงสามารถทำได้ในระดับการเล่นด้วย
Michal Gasek

8
จึงไม่มีวิธีตั้งค่าตัวแปรสภาพแวดล้อมถาวรผ่าน Ansible?
ร้านเก็บขยะ

1
@DumpHole ฉันเคยใช้บทบาท "franklinkim.environment" จาก Ansible Galaxy สำหรับสิ่งนั้น
Ates Goral

1
จะเกิดอะไรขึ้นถ้าคุณต้องการตั้งค่าสภาพแวดล้อมที่สามารถใช้ได้สำหรับ bash shell ปัจจุบันเท่านั้น? ตัวอย่างเช่นอาจใช้รหัสผ่านที่ถอดรหัสในลักษณะนี้
openCivilisation

30

ฉันไม่มีชื่อเสียงมากพอที่จะแสดงความคิดเห็นดังนั้นฉันจึงเพิ่มคำตอบใหม่
คำตอบของ Gasek ค่อนข้างถูกต้อง มีเพียงสิ่งเดียว: หากคุณกำลังอัปเดต.bash_profileไฟล์หรือการ/etc/profileเปลี่ยนแปลงเหล่านั้นจะแสดงให้เห็นหลังจากคุณทำการเข้าสู่ระบบใหม่เท่านั้น ในกรณีที่คุณต้องการตั้งค่าตัวแปร env แล้วใช้ในงานต่อไปใน playbook เดียวกันให้พิจารณาเพิ่มตัวแปรสภาพแวดล้อมเหล่านั้นใน.bashrcไฟล์
ฉันเดาว่าเหตุผลเบื้องหลังนี่คือล็อกอินและเชลล์ที่ไม่ใช่ล็อกอิน
Ansible ในขณะที่ดำเนินการงานที่แตกต่างกันให้อ่านพารามิเตอร์จาก.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";

หนึ่งในนี้จะไม่ทำงาน , ถ้าเรามีงานเหล่านี้ทั้งหมดใน PlayBook เดียวกัน


2
หากเชลล์ดีฟอลต์คือ sh แหล่งที่มาอาจไม่ทำงาน แทนที่จะsource fileทำ. file
Cloverr

15

ต่อไปนี้เป็นงานด่วนในเครื่องเพื่อตั้งค่าคีย์ / ค่าอย่างถาวร/etc/environment(ซึ่งเป็นทั้งระบบผู้ใช้ทั้งหมด)

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

และตัวแทนสำหรับมัน:

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

และใช่ถ้าคุณออกและกลับเข้ามาenvใหม่จะแสดงตัวแปรสภาพแวดล้อมใหม่


destถูกแทนที่ด้วยpathแต่ตามเอกสารควรยังคงใช้งานได้ หากไม่เป็นเช่นนั้นให้เปลี่ยนไปpathใช้
guessimtoolate

9

สำหรับการตั้งค่าตัวแปรสภาพแวดล้อมอย่างต่อเนื่องคุณสามารถใช้หนึ่งในบทบาทที่มีอยู่ใน Ansible Galaxy ผมขอแนะนำให้weareinteractive.environment

การใช้ ansible-galaxy:

$ ansible-galaxy install weareinteractive.environment

การใช้ requirements.yml:

- src: franklinkim.environment

จากนั้นใน playbook ของคุณ:

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

@openCivilisation อัพเดท!
Ates Goral

หมายเหตุ: weareinteractive.environment เขียนลงใน / etc / environment
simohe

6

นี่คือตัวเลือกที่ดีที่สุด ดังที่กล่าวไว้ Michal Gasek (คำตอบแรก) เนื่องจากคำขอดึงถูกรวมเข้าด้วยกัน ( https://github.com/ansible/ansible/pull/8651 ) เราจึงสามารถตั้งค่าตัวแปรสภาพแวดล้อมถาวรได้อย่างง่ายดายตามระดับการเล่น

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

2
สภาพแวดล้อมทำงานก่อนบทบาทหรือไม่ เนื่องจากการค้นหาของฉันยังคงว่างเปล่า
EvgenyKolyakov

แม้แต่การค้นหาของฉันก็ว่างเปล่าโดยไม่คำนึงถึงลำดับ
AhmFM

ข้อแม้เดียวเกี่ยวกับเรื่องนี้คือสภาพแวดล้อมในระดับเพลย์บุ๊กจะได้รับการแก้ไขก่อนที่เพลย์บุ๊กจะทำงาน สิ่งนี้จะมีประโยชน์ถ้าคุณรู้ค่าทั้งหมดล่วงหน้า แต่ถ้าคุณต้องการเพิ่มมูลค่าตามปกติฉันขอแนะนำให้ทำตามคำตอบของ JL Peyret
Bubzsan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.