ฉันพบปัญหานี้ในการตั้งค่าที่ฉันต้องการในการสร้างสภาพแวดล้อมการปรับใช้ที่หลากหลาย (สด, สาธิต, แซนด์บ็อกซ์) ไปยังเซิร์ฟเวอร์ทางกายภาพเดียวกัน (ไม่อนุญาตเครื่องเสมือนที่นี่) จากนั้นสคริปต์เพื่อปรับใช้ repos svn เอง
สิ่งนี้ต้องการแผนผังไดเรกทอรีของไฟล์ (ไฟล์เสริม) variable.yml ที่จะรวมเข้าด้วยกันและไม่ส่งข้อยกเว้นหากมีที่หายไป
เริ่มต้นด้วยการเปิดใช้งานการรวมตัวแปรใน ansible - โปรดทราบว่านี่เป็นการรวมแฮชแบบตื้น (ความลึก 1 ระดับ) และไม่ผสานการวนซ้ำแบบวนซ้ำอย่างสมบูรณ์
ansible.cfg
[defaults]
hash_behaviour=merge ;; merge rather than replace dictionaries http://docs.ansible.com/ansible/intro_configuration.html###hash-behaviour
เค้าโครงไดเรกทอรีที่ไม่สามารถเข้าถึงได้
/group_vars
└── all.yml
/playbooks
├── boostrap.yml
├── demo.yml
├── live.yml
└── sandbox.yml
/roles/deploy/
├── files
├── tasks
│ ├── includes.yml
│ ├── main.yml
└── vars
├── main.yml
├── project_1.yml
├── project_2.yml
├── demo
│ ├── project_1.yml
│ ├── project_2.yml
│ └── main.yml
├── live
│ ├── project_1.yml
│ ├── project_2.yml
│ └── main.yml
└── sandbox
├── project_1.yml
├── project_2.yml
└── main.yml
บทบาท / ปรับ / งาน / includes.yml
นี่คือตรรกะหลักสำหรับแผนผังไดเรกทอรีของไฟล์ตัวแปรเสริม
;; imports in this order:
;; - /roles/deploy/vars/main.yml
;; - /roles/deploy/vars/{{ project_name }}.yml
;; - /roles/deploy/vars/{{ project_name }}/main.yml
;; - /roles/deploy/vars/{{ project_name }}/{{ project_env }}.yml
- include_vars:
dir: 'vars'
files_matching: "{{ item }}"
depth: 1
with_items:
- "main.yml"
- "{{ project_name }}.yml"
- include_vars:
dir: 'vars/{{ env_name }}'
files_matching: "{{ item }}"
depth: 1
with_items:
- "main.yml"
- "{{ project_name }}.yml"
group_vars / all.yml
กำหนดค่าตัวแปรเริ่มต้นสำหรับโครงการและผู้ใช้และสภาพแวดล้อมที่หลากหลาย
project_users:
bootstrap:
env: bootstrap
user: ansible
group: ansible
mode: 755
root: /cs/ansible/
home: /cs/ansible/home/ansible/
directories:
- /cs/ansible/
- /cs/ansible/home/
live:
env: live
user: ansible-live
group: ansible
mode: 755
root: /cs/ansible/live/
home: /cs/ansible/home/ansible-live/
demo:
env: demo
user: ansible-demo
group: ansible
mode: 755
root: /cs/ansible/demo/
home: /cs/ansible/home/ansible-demo/
sandbox:
env: sandbox
user: ansible-sandbox
group: ansible
mode: 755
root: /cs/ansible/sandbox/
home: /cs/ansible/home/ansible-sandbox/
project_env: bootstrap
project_user: "{{ ansible_users[project_env] }}" ;; this will be retroactively updated if project_env is redefined later
บทบาท / ปรับ / vars / main.yml
ค่าเริ่มต้นของโครงการ
ansible_project:
node_env: development
node_port: 4200
nginx_port: 4400
บทบาท / ปรับ / vars / project_1.yml
ค่าเริ่มต้นสำหรับ project_1
ansible_project:
node_port: 4201
nginx_port: 4401
บทบาท / ปรับ / vars / / main.yml สด
ค่าเริ่มต้นสำหรับสภาพแวดล้อมสดแทนที่ค่าเริ่มต้นของโครงการ
ansible_project:
node_env: production
บทบาท / ปรับ / vars / สด / project_1.yml
แทนที่สุดท้ายสำหรับ project_1 ในสภาพแวดล้อมสด
ansible_project:
nginx_port: 80
playbooks / demo.yml
กำหนดค่า playbooks แยกสำหรับแต่ละสภาพแวดล้อม
- hosts: shared_server
remote_user: ansible-demo
vars:
project_env: demo
pre_tasks:
- debug: "msg='{{ facter_gid }}@{{ facter_fqdn }} ({{ server_pseudonym }})'"
- debug: var=project_ssh_user
roles:
- { role: deploy, project_name: project_1 }
คำเตือน: เนื่องจากสภาพแวดล้อมทั้งหมดอาศัยอยู่ในโฮสต์เดียว playbooks ทั้งหมดจะต้องทำงานแยกกันมิฉะนั้น Ansible จะพยายามเรียกใช้สคริปต์ทั้งหมดในฐานะผู้ใช้เข้าสู่ระบบ ssh แรกและใช้ตัวแปรสำหรับผู้ใช้คนแรกเท่านั้น หากคุณต้องการเรียกใช้สคริปต์ทั้งหมดตามลำดับให้ใช้ xargs เพื่อรันสคริปต์แต่ละรายการเป็นคำสั่งแยกกัน
find ./playbooks/*.yml | xargs -L1 time ansible-playbook