จะติดตั้งบทบาท Ansible Galaxy โดยอัตโนมัติได้อย่างไร?


129

เพลย์บุ๊ค / บทบาท Ansible ทั้งหมดของฉันถูกเช็คอินที่ git repo ของฉัน

อย่างไรก็ตามสำหรับบทบาทของ Ansible Galaxy ฉันจะต้องดาวน์โหลดทีละเครื่องอย่างชัดเจนในทุกเครื่องที่ฉันต้องการเรียกใช้ Ansible

เป็นเรื่องยากที่จะรู้ล่วงหน้าว่าบทบาทของ Ansible Galaxy ใดที่จำเป็นจนกว่า Ansible จะบ่นเกี่ยวกับบทบาทที่ขาดหายไปในรันไทม์

ควรจะจัดการการพึ่งพาบทบาท Ansible Galaxy อย่างไร? ฉันต้องการให้พวกเขาตรวจสอบใน git repo ของฉันพร้อมกับโค้ด ansible ที่เหลือของฉันหรือให้พวกเขาระบุและดาวน์โหลดโดยอัตโนมัติเมื่อฉันเรียกใช้ Ansible บนเครื่องใหม่


galaxy.ansible.com/docs/using/index.htmlนี่คือทุกสิ่งที่คุณต้องใช้ ansible-galaxy เป็นเอกสารที่ทำได้ดีมาก! แม้ว่าคุณจะเป็นมือใหม่ :)
Ayra

@pdeva คุณยอมรับคำตอบที่ถูกต้องด้านล่างนี้ได้ไหม
GG.

คำตอบ:


149

คุณควรใช้requirements.ymlไฟล์สำหรับกรณีการใช้งานนี้ อธิบายบทบาทที่คุณต้องการโดยใช้วิธีการติดตั้งที่หลากหลาย:

# Install a role from the Ansible Galaxy
- src: dfarrell07.opendaylight

# Install a role from GitHub
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight

# Install a role from a specific git branch
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: origin/master

# Install a role at a specific tag from GitHub
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: 1.0.0

# Install a role at a specific commit from GitHub
- name: opendaylight
  src: https://github.com/dfarrell07/ansible-opendaylight
  version: <commit hash>

จากนั้นติดตั้ง:

ansible-galaxy install -r requirements.yml

นี่คือตัวอย่างการทำงาน (การติดตั้ง OpenDaylight โดยใช้ Ansible เป็นตัวจัดเตรียม Vagrant) ดูเอกสาร Ansible ที่เกี่ยวข้องสำหรับข้อมูลเพิ่มเติม


ดูคำตอบของ @Kieran Andrews ด้านล่าง มันขยายอันนี้
Marco Ferrari

1
นี่ไม่ใช่การติดตั้งการอ้างอิงบทบาทของเพลย์บุ๊กโดยอัตโนมัติ แต่เป็นการติดตั้งรายการการอ้างอิงที่ระบุไว้ด้วยตนเองโดยมนุษย์ที่สร้างเพลย์บุ๊ก
นีล

53

ตามคำแนะนำคุณสามารถใช้ ansible galaxy สำหรับความต้องการนี้

Ansible มีคุณลักษณะที่คุณสามารถสร้างrequirements.ymlไฟล์ที่แสดงรายการบทบาททั้งหมดของคุณ คุณสามารถหาข้อมูลได้ที่นี่: http://docs.ansible.com/ansible/latest/galaxy.html#installing-multiple-roles-from-a-file

ตัวอย่างเช่น (requirements.yml):

- src: yatesr.timezone

จากนั้นคุณก็วิ่ง ansible-galaxy install -r requirements.ymlไฟล์นี้เพื่อดาวน์โหลดบทบาททั้งหมดที่ระบุไว้ที่นั่น

หากคุณต้องการทำให้เป็นอัตโนมัติต่อไปคุณสามารถสร้างเชลล์สคริปต์ง่ายๆที่จะเรียกใช้คำสั่งทั้งสอง

ตัวอย่างเช่น (ansible.sh):

./ansible.sh

ansible-galaxy install -r requirements.yml
ansible-playbook playbook.yml -i inventory 

1
เพิ่งทดสอบแสดงข้อความว่าดาวน์โหลดบทบาทแล้วไม่มีข้อผิดพลาด เวอร์ชั่น2.2.1
Igonato

หากเพลย์บุ๊กใช้ประโยชน์จากบทบาทกาแลคซีที่คุณกำลังติดตั้งจะไม่ทำงานในครั้งแรกที่เรียกใช้เพลย์บุ๊กเนื่องจากมีการตรวจสอบสถานะก่อนที่จะดาวน์โหลด การเรียก playbook เป็นครั้งที่สองจะรับบทบาทที่ติดตั้งใหม่
เบ็น

ฉันได้อัปเดตว่าตอนนี้ฉันทำมันอย่างไรโดยมีสคริปต์ wrapper เพื่อลดคำสั่ง
Kieran Andrews

19

ฉันมักจะพบว่าตัวเองติดตั้ง Java JDK การใช้บทบาททำให้การสัมผัสนั้นง่ายขึ้น ฉันได้ลองสองวิธีที่แตกต่างกัน (รวมถึง. gitmodules และโมดูลย่อยจำนวนมาก ... ฉันต้องใช้ระบบ git หลายระบบในการทำงานและทุกอย่างมันก็น่าเกลียด) ข้อกำหนดที่ใหญ่ที่สุดของฉันคือฉันไม่ได้ตรวจสอบรหัสบทบาทในโปรเจ็กต์ playbook ของฉันส่วนใหญ่ฉันจึงสามารถเก็บทุกอย่างไว้ในที่เดียว

เนื้อหาของไฟล์ 'requirements.yml' ของฉัน:

- src: https://github.com/staylorx/ansible-role-wls-prep.git
  version: master
  name: staylorx.wls-prep

- src: https://my-work-git-extravaganza.com
  version: 2.x
  name: coolplace.niftyrole

#From Ansible Galaxy
- src: staylorx.oracle-jdk

ฉันเรียกใช้ playbook แยกต่างหาก install-role.yml:

---

- hosts: localhost

  tasks:
    - file:
        path:  roles
        state: absent

    - local_action:
        command ansible-galaxy install -r requirements.yml --roles-path roles

    - lineinfile:
        dest:   .gitignore
        regexp: '^\/roles$'
        line:   '/roles'
        state:  present

ฉันเรียกใช้เพลย์บุ๊คเล่มแรกนี้จากนั้นฉันก็เรียกใช้บทบาทของฉันในเพลย์บุ๊กตามปกติ สำหรับฉันความลับคือการตรวจสอบให้แน่ใจว่าคอมไพล์ถูกละเลยดังนั้นฉันจึงไม่ได้ตรวจสอบบทบาทโดยไม่ได้ตั้งใจ เนื่องจากฉันล้างโฟลเดอร์ทุกครั้งฉันมั่นใจว่าไม่จำเป็นต้องบังคับหรือเพิกเฉยต่อข้อผิดพลาด


มันจะล้มเหลวด้วย 'ไม่พบบทบาท' ก่อนที่คุณจะเรียกใช้คำสั่งภายในเครื่อง
Daniel Andrei Mincă

1
@ Mincă Daniel Andrei คุณต้องใช้วิธีแบบไดนามิกเช่น include_role ตรวจสอบสิ่งนี้
1686407

4

อีกวิธีหนึ่งคือการใช้โมดูลย่อย git ท้ายที่สุด Ansible Galaxy เป็นไดเรกทอรีของที่เก็บ github เท่านั้น ...

ฉันใช้คำสั่งนี้เพื่อเพิ่มบทบาท Galaxy เป็นโมดูลย่อยโดยอัตโนมัติ:

ansible-galaxy info <package> | grep -A 1 github_repo | tr '\n' ' ' | sed -e "s/.*github_repo: \([^[:space:]]*\)[^\w]*github_user: \([^[:space:]]*\)[[:space:]]*/git submodule add git:\/\/github.com\/\2\/\1.git roles\/\2.\1/g" | sh

ยอมรับการเปลี่ยนแปลงแล้วกับ git repo ของคุณ เมื่อคุณโคลน repo ของคุณในอนาคตอย่าลืมโคลน repo ด้วยโมดูลย่อยเช่นgit clone ... --recursive

ข้อดีของสิ่งนี้คือโมดูลย่อย git มักจะอ้างถึงเวอร์ชันเฉพาะเสมอ (คอมมิต - แฮช) วิธีนี้จะป้องกันไม่ให้คุณเรียกใช้การอัปเดตที่ยังไม่ได้ทดสอบในสภาพแวดล้อมการผลิตของคุณ บทบาท Galaxy เวอร์ชันใหม่อาจมีข้อบกพร่องหรือทำงานแตกต่างไปจากเดิมอย่างสิ้นเชิง ด้วยโมดูลย่อย git คุณจะตัดสินใจได้ว่าจะอัปเดตบทบาทเป็นเวอร์ชันใหม่หรือไม่และเมื่อใด

นอกจากนี้คุณจะไม่ต้องดูแลบทบาทกาแลคซีในบัญชีดำเพิ่มเติม.gitignoreเพื่อป้องกันการส่งรหัสไปยังที่เก็บของคุณ


5
นี่เป็นการปฏิบัติที่ไม่ดีในความคิดของฉัน โดยปกติแล้วการใช้เครื่องมือการจัดการการพึ่งพาจะง่ายกว่าเพื่อรวม SCM repos เข้าด้วยกันโดยเฉพาะอย่างยิ่งเมื่อเรากำลังพูดถึงโมดูลย่อย git สำหรับ SCM
David Resnick

1
ตกลง อันที่จริงฉันไม่ได้ใช้มันอีกต่อไป ยังคงเป็นแนวทางที่ถูกต้องเนื่องจากกาแลคซีแอนซิเบิลยังห่างไกลจากความสมบูรณ์แบบ Galaxy จะไม่ตรวจสอบการอัปเดตแม้ว่าเวอร์ชันจะถูกชนในไฟล์ความต้องการของคุณหากคุณบังคับให้ดาวน์โหลดบทบาททั้งหมดอีกครั้งด้วยการ--forceตั้งค่าสถานะที่ไม่มีเอกสารจะไม่แสดงให้คุณทราบว่ามีการเปลี่ยนแปลงจริงหรือไม่ เป็นกล่องดำที่คุณสามารถควบคุมได้ก็ต่อเมื่อคุณเก็บบทบาทกาแลคซีที่ดาวน์โหลดไว้ใน SCM ด้วยเหตุผลอื่น ๆ นั่นก็เป็นความคิดที่ดีอยู่ดี เมื่อดึงโมดูลย่อยอย่างน้อยคุณจะเห็นว่าบทบาทใดเปลี่ยนแปลงไป
udondan

BTW ปัญหาทั้งหมดของโมดูลย่อยมี AFAIK เล็กน้อยในสถานการณ์นี้เนื่องจากเกี่ยวข้องกับการแก้ไขเนื้อหา ประสบการณ์ของฉันดึงเป็นอย่างดี ..
udondan

4

คุณสามารถใช้บทบาท Ansible เพื่อติดตั้งบทบาทที่ต้องการโดยใช้โมดูลคำสั่งโมดูลคำสั่ง

นี่คือตัวอย่างพื้นฐานที่รันansible-galaxy install:

- name: Install roles from Ansible Galaxy
  command: ansible-galaxy install {{ item.item }}
  with_items:
    - "{{ ansible_roles_list }}"

ansible_roles_listอาจจะจัดเป็นตัวแปรหรือเป็นพารามิเตอร์บทบาท

หากคุณทำสิ่งนี้ในบทบาทนั้นจะต้องถูกนำไปใช้ก่อนบทบาทอื่น ๆ ที่คุณต้องการติดตั้งโดยใช้ในเพลย์บุ๊กแยกต่างหาก เนื่องจาก Ansible ตรวจสอบว่ามีบทบาททั้งหมดหรือไม่ก่อนที่จะเรียกใช้ Playbook ที่คุณอ้างอิง


ไข่และไก่ :)
bazeusz

2

ณ เวลานี้เท่าที่ฉันรู้ว่าไม่มีวิธีอัตโนมัติในการดาวน์โหลดบทบาทที่รันไทม์ ทางออกที่ดีที่สุดของคุณคือการฝากไว้ใน repo ของคุณเองหรือมีเอกสารประกอบที่เหมาะสมซึ่งแสดงรายการข้อกำหนดทั้งหมด คุณยังสามารถสร้าง Playbook ก่อนการบินที่ติดตั้งบทบาทของคุณ :)


3
คุณสามารถใช้ไฟล์ requirements.txt สำหรับสิ่งนี้ ดู: docs.ansible.com/…
toast38coza

0

ที่นี่ข้อกำหนดของฉันอยู่ในบทบาทและใช้ใน install.yml

main.yml

 # tasks file for MY_ROLE
- name: Install requirements
  local_action: command ansible-galaxy install -r {{ role_path }}/requirements.yml -p /etc/ansible/roles

- include_tasks: install.yml 
.  
├── playbook.yml  
├── inventory  
├── roles  
│    └── My_Role   
│        ├── tasks  
│        │   └── main.yml  
│        │   └── install.yml  
│        └── requirements.yml

0

หาก requirements.yml อยู่ในไดเรกทอรีบทบาทของโครงการของคุณ Tower / AWX จะติดตั้งบทบาทโดยอัตโนมัติ

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