สวัสดีฉันกำลังพยายามค้นหาวิธีตั้งค่าตัวแปรสภาพแวดล้อมด้วย 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
จะเป็นไปได้ในระดับการเล่นไม่ใช่แค่ระดับงานตามที่กล่าวมา ขณะนี้มีคำขอดึงคุณลักษณะนี้บน 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 ของคุณเพื่อทราบตำแหน่งที่จะเพิ่มเพื่อให้ถาวร
ฉันไม่มีชื่อเสียงมากพอที่จะแสดงความคิดเห็นดังนั้นฉันจึงเพิ่มคำตอบใหม่
คำตอบของ 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 เดียวกัน
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 }}"
และตัวแทนสำหรับมัน:
os_environment:
- key: DJANGO_SETTINGS_MODULE
value : websec.prod_settings
- key: DJANGO_SUPER_USER
value : admin
และใช่ถ้าคุณออกและกลับเข้ามาenv
ใหม่จะแสดงตัวแปรสภาพแวดล้อมใหม่
สำหรับการตั้งค่าตัวแปรสภาพแวดล้อมอย่างต่อเนื่องคุณสามารถใช้หนึ่งในบทบาทที่มีอยู่ใน 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
นี่คือตัวเลือกที่ดีที่สุด ดังที่กล่าวไว้ Michal Gasek (คำตอบแรก) เนื่องจากคำขอดึงถูกรวมเข้าด้วยกัน ( https://github.com/ansible/ansible/pull/8651 ) เราจึงสามารถตั้งค่าตัวแปรสภาพแวดล้อมถาวรได้อย่างง่ายดายตามระดับการเล่น
- hosts: all
roles:
- php
- nginx
environment:
MY_ENV_VARIABLE: whatever_value