Ansible Playbooks เทียบกับบทบาท


98

ตามเอกสาร Ansible Playbook คือ:

... พื้นฐานสำหรับการจัดการการกำหนดค่าที่เรียบง่ายและระบบการปรับใช้หลายเครื่องซึ่งแตกต่างจากที่มีอยู่แล้วและเป็นระบบที่เหมาะอย่างยิ่งกับการปรับใช้แอปพลิเคชันที่ซับซ้อน

และตามเอกสารเดียวกันอีกครั้งบทบาท คือ:

... วิธีโหลดไฟล์ vars_files งานและตัวจัดการโดยอัตโนมัติตามโครงสร้างไฟล์ที่รู้จัก การจัดกลุ่มเนื้อหาตามบทบาทยังช่วยให้สามารถแบ่งปันบทบาทกับผู้ใช้รายอื่นได้ง่าย

อย่างไรก็ตามความแตกต่างระหว่างสิ่งเหล่านี้และกรณีการใช้งานที่แตกต่างกันนั้นไม่ชัดเจนสำหรับฉันในทันที ตัวอย่างเช่นหากฉันกำหนดค่า/etc/ansible/hostsไฟล์ของฉันให้มีลักษณะดังนี้:

[databases]
mydb01.example.org
mydb02.example.org

[mail_servers]
mymail01.example.org
mymail_dr.example.org

... แล้วนี่ " [databases]" รายการ ... บทบาทอะไร? หรือชื่อไฟล์ YAML ของ playbook ที่ไหนสักแห่ง? หรืออย่างอื่น?!?

หากมีใครสามารถอธิบายความแตกต่างของสิ่งเหล่านี้ให้ฉันเข้าใจเกี่ยวกับ Ansible ของฉันจะดีขึ้นมาก!

  • Playbook vs Role vs [databases]และรายการที่คล้ายกันใน/etc/ansible/hosts
  • ถ้า Playbooks ถูกกำหนดไว้ในไฟล์ YAML แล้ว Roles จะกำหนดไว้ที่ใด?
  • นอกเหนือจากสิ่งansible.cfgมีชีวิตบนเซิร์ฟเวอร์ Ansible แล้วฉันจะเพิ่ม / กำหนดค่า Ansible ด้วย Playbooks / Roles ที่มีได้อย่างไร ตัวอย่างเช่นเมื่อฉันเรียกใช้ansible-playbook someplaybook.yamlAnsible จะรู้ได้อย่างไรว่าจะหา playbook นั้นได้อย่างไร

2
บทบาทเป็นวิธีการทำให้โค้ดในเพลย์บุ๊กสามารถนำกลับมาใช้ใหม่ได้โดยใส่ฟังก์ชันลงใน "ไลบรารี" ทั่วไปที่สามารถใช้ในเพลย์บุ๊กใดก็ได้ตามต้องการ
Juan Jimenez

tasksทำสิ่งต่างๆ playbooksจัดระเบียบและเปิดใช้งาน rolesจัดระเบียบกลุ่มงานตัวจัดการ ฯลฯ ที่ทำหน้าที่เฉพาะ playbookจำเป็นต้องมีบางอย่างเพื่อเปิดใช้งานrole(s) คุณจะเรียกคอลเลกชันของอะไรrolesและplaybooks? สมมติว่าเป็นตัวอย่างที่จัดการการกำหนดค่าโฮสต์ทั้งหมดในไซต์ของคุณหรือไม่
fbicknel

คำตอบ:


113

Playbook vs Role vs [ฐานข้อมูล] และรายการที่คล้ายกันใน / etc / ansible / hosts

[databases]เป็นชื่อเดียวสำหรับกลุ่มโฮสต์ ช่วยให้คุณสามารถอ้างอิงหลายโฮสต์ด้วยชื่อเดียว

บทบาทคือชุดของงานและไฟล์เพิ่มเติมเพื่อกำหนดค่าโฮสต์เพื่อให้บริการสำหรับบทบาทหนึ่งๆ

Playbook คือการจับคู่ระหว่างโฮสต์และบทบาท

ตัวอย่างจากเอกสารอธิบายโครงการตัวอย่าง ประกอบด้วยสองสิ่ง:

  • Playbooks site.yml, webservers.yml, fooservers.ymlมี playbooks
  • บทบาท: roles/common/และroles/webservers/มีคำจำกัดความcommonและwebserversบทบาทตามนั้น

ภายใน playbook ( webservers.yml) คุณมีสิ่งที่ต้องการ:

---
- hosts: webservers <- this group of hosts defined in /etc/ansible/hosts, databases and mail_servers in example from your question
  roles: <- this is list of roles to assign to these hosts
     - common
     - webservers

ถ้า Playbooks ถูกกำหนดไว้ในไฟล์ YAML แล้ว Roles จะกำหนดไว้ที่ใด?

พวกเขาถูกกำหนดภายในroles/*ไดเรกทอรี บทบาทถูกกำหนดโดยส่วนใหญ่โดยใช้ไฟล์ YAML แต่ยังสามารถมีทรัพยากรประเภทใดก็ได้ ( files/, templates/) ตามการกำหนดบทบาทเอกสารมีโครงสร้างในลักษณะนี้:

  • หากมีบทบาท / x / งาน / main.yml งานที่ระบุไว้ในนั้นจะถูกเพิ่มเข้าไปในการเล่น
  • หากมีบทบาท / x / handlers / main.yml ตัวจัดการที่ระบุไว้ในนั้นจะถูกเพิ่มเข้าไปในการเล่น
  • หากมีบทบาท / x / vars / main.yml ตัวแปรที่อยู่ในรายการนั้นจะถูกเพิ่มเข้าไปในการเล่น
  • หากมีบทบาท / x / meta / main.yml การอ้างอิงบทบาทใด ๆ ที่ระบุไว้ในนั้นจะถูกเพิ่มในรายการบทบาท (1.3 ขึ้นไป)
  • งานการคัดลอกใด ๆ สามารถอ้างอิงไฟล์ใน role / x / files / โดยไม่ต้องกำหนดเส้นทางให้ยุ่งยากหรือแน่นอน
  • งานสคริปต์ใด ๆ สามารถอ้างอิงสคริปต์ในบทบาท / x / ไฟล์ / ได้โดยไม่ต้องกำหนดเส้นทางให้ยุ่งยากหรือแน่นอน
  • งานเทมเพลตใด ๆ สามารถอ้างอิงไฟล์ใน role / x / template / ได้โดยไม่ต้องกำหนดเส้นทางให้ยุ่งยากหรือแน่นอน
  • งานรวมใด ๆ สามารถอ้างอิงไฟล์ในบทบาท / x / งาน / โดยไม่ต้องกำหนดเส้นทางให้ยุ่งยากหรือแน่นอน

ไฟล์ที่สำคัญที่สุดคือroles/x/tasks/main.ymlที่นี่คุณกำหนดงานซึ่งจะถูกเรียกใช้เมื่อดำเนินการตามบทบาท

นอกเหนือจาก ansible.cfg ที่อาศัยอยู่บนเซิร์ฟเวอร์ Ansible ฉันจะเพิ่ม / กำหนดค่า Ansible ด้วย Playbooks / Roles ที่มีได้อย่างไร ตัวอย่างเช่นเมื่อฉันเรียกใช้ ansible-playbook someplaybook.yaml Ansible จะรู้ได้อย่างไรว่าจะหา playbook นั้นได้อย่างไร

$ ansible-playbook someplaybook.yaml

จะมองหา playbook ในไดเรกทอรีปัจจุบัน

$ ansible-playbook somedir/somedir/someplaybook.yaml

จะมองหา playbook ภายในsomedir/somedir/ไดเร็กทอรี

เป็นความรับผิดชอบของคุณในการวางโครงการของคุณพร้อมกับ Playbooks และบทบาททั้งหมดบนเซิร์ฟเวอร์ Ansible ไม่มีส่วนเกี่ยวข้องกับสิ่งนั้น


ขอบคุณ @Yaroslav Admin (+1) - คำถามติดตามผลด่วนหนึ่งคำถาม: คุณระบุว่าบทบาทถูกกำหนดไว้ในไดเร็กทอรีแต่จริงๆแล้วอะไรเป็นตัวกำหนดบทบาท? กล่าวอีกนัยหนึ่งคือwebservers.ymlเพลย์บุ๊กจะแมป[webservers]โฮสต์กับบทบาทcommonและ webserversแต่มีอะไรบ้างที่รวมอยู่ในcommonบทบาทนี้? ไม่มีวิธีกำหนดสิ่งนั้นในไดเรกทอรีดังนั้นโดยทั่วไปแล้วไฟล์ YAML จะอยู่ใน "ไดเรกทอรีบทบาท" เหล่านั้นหรือไม่ ขอบคุณอีกครั้ง!
smeeb

@smeeb ใช่บทบาทของคุณถูกกำหนดโดยไฟล์ในไดเร็กทอรีนั้น โดยส่วนใหญ่เป็น YAML แต่ยังสามารถมีไฟล์ประเภทอื่น ๆ ดูคำตอบที่อัปเดตสำหรับรายละเอียดเพิ่มเติม
Yaroslav Admin

36

Playbook vs Role vs [ฐานข้อมูล] และรายการที่คล้ายกันใน / etc / ansible / hosts

บทบาทเป็นวิธีการจัดกลุ่มงานเข้าด้วยกันในคอนเทนเนอร์เดียว คุณสามารถมีบทบาทในการตั้งค่า MySQL อีกคนหนึ่งสำหรับการตั้งค่า Postfix เป็นต้น

กำหนด playbook ของสิ่งที่เกิดขึ้นที่ นี่คือสถานที่ที่คุณกำหนดโฮสต์ (กลุ่มโฮสต์ดูด้านล่าง) และบทบาทที่จะนำไปใช้กับโฮสต์เหล่านั้น

[databases]และรายการอื่น ๆ ในสินค้าคงคลังของคุณคือกลุ่มโฮสต์ Hostgroups กำหนดชุดโฮสต์ที่การเล่นจะดำเนินต่อไป

การเล่นคือชุดของงานหรือบทบาท (หรือทั้งสองอย่าง) ภายในเพลย์บุ๊ก ในกรณีส่วนใหญ่ (และตัวอย่าง) เพลย์บุ๊กจะมีการเล่นเพียงครั้งเดียว แต่คุณสามารถมีได้มากเท่าที่คุณต้องการ นั่นหมายความว่าคุณสามารถมี playbook ซึ่งจะเรียกใช้บทบาทpostfixบน hostgroup mail_serversและบทบาทmysqlบน hostgroup databases:

- hosts: mail_servers
  roles:
    - postfix

- hosts: databases
  roles:
    - mysql

ถ้า Playbooks ถูกกำหนดไว้ในไฟล์ YAML แล้ว Roles จะกำหนดไว้ที่ใด?

ใน Ansible ทุกอย่างถูกกำหนดไว้ใน YAML ซึ่งนับรวมถึงบทบาทและ Playbooks

นอกเหนือจาก ansible.cfg ที่อาศัยอยู่บนเซิร์ฟเวอร์ Ansible ฉันจะเพิ่ม / กำหนดค่า Ansible ด้วย Playbooks / Roles ที่มีได้อย่างไร ตัวอย่างเช่นเมื่อฉันเรียกใช้ ansible-playbook someplaybook.yaml Ansible จะรู้ได้อย่างไรว่าจะหา playbook นั้นได้อย่างไร

AFAIK คุณจะต้องให้เส้นทางไปยัง PlayBook ansible-playbookเมื่อกล่าวอ้าง ดังนั้นansible-playbook someplaybook.yamlคาดว่าsomeplaybook.yamlจะอยู่ในไดเรกทอรีปัจจุบันของคุณ แต่คุณสามารถระบุเส้นทางแบบเต็ม:ansible-playbook /path/to/someplaybook.yaml


13

เป็นคำถามเกี่ยวกับศัพท์ / ความหมาย สามารถเป็นอัตนัยได้แม้ว่าจะมีคำจำกัดความพื้นฐานก็ตาม

มุมมองของฉันมีดังนี้:

ระบบการจัดการ / การปรับใช้การกำหนดค่าใด ๆ มี:

  1. source data - ข้อมูลที่ใช้สร้างการกำหนดค่าของโฮสต์เป้าหมาย
  2. target data - ข้อมูลที่ใช้ในการระบุโฮสต์เป้าหมาย
  3. config changes- รายการ / ชุดของกฎ / การดำเนินการที่เราใช้กับsource dataโฮสต์เป้าหมายตามtarget data

ในเงื่อนไขที่ตอบได้:

  1. source data- คือตำแหน่งต่างๆที่เราสามารถใส่ข้อมูล - group_vars, playbookvars, rolevars และอื่น ๆ สถานที่เหล่านี้มีผลต่อลำดับความสำคัญ (หากตัวแปรที่มีชื่อเหมือนกันถูกกำหนดใหม่ในตำแหน่งที่แตกต่างกันจะมีกฎที่เฉพาะเจาะจงมากสำหรับสิ่งที่จะเป็นค่าของ ตัวแปรระหว่างansible/ ansible-playbookการดำเนินการ
  2. target data - คือสินค้าคงคลัง (และยังสามารถกำหนดตัวแปรพื้นที่โฆษณา / กลุ่มโฮสต์ภายในสินค้าคงคลังได้ด้วย!)
  3. config changes - ansible มีนามธรรม 4 ระดับสำหรับมัน:
    1. งาน - การกระทำเดียว
    2. รายการงาน - รายการการดำเนินการ
    3. บทบาท - รายการการดำเนินการ (หรือรายชื่อรายการ) ที่จัดกลุ่มตาม 'หัวเรื่อง' เดียวกันโดยปกติเป้าหมายทั้งหมดจะทำงานบนโฮสต์ / กลุ่มโฮสต์เดียวกัน
    4. playbook - รายชื่อของการเล่นแต่ละรายการดำเนินการในกลุ่มโฮสต์ที่แตกต่างกันโดยใช้roles / tasks / tasklists หลายรายการ (และงานพิเศษเช่นhandlers)

จากด้าน 'ซอฟต์แวร์' - บทบาทควรเป็นแบบทั่วไปพอที่จะนำมาใช้ซ้ำได้

นอกจากนี้ในบางองค์กร (ค่อนข้างใหญ่) 'บทบาท' จะถูกจัดส่งโดยกลุ่ม A ในขณะที่ใช้ในเพลย์บุ๊กที่ดูแลโดยกลุ่ม B

สรุป

ทั้งหมดข้างต้นช่วยให้สามารถจัดกลุ่มการกำหนดค่าที่คล้ายกัน - เป็นไฟล์role. การจัดกลุ่มที่เกี่ยวข้องกับระบบย่อย / playbookชิ้นส่วนเข้าเป็นหนึ่งเดียว นอกจากนี้ยังกล่าวถึงมูลค่า 1 YAML รายการใน PlayBook (รวมถึงhosts:และหรือtasks, pre_tasks, post_tasks, roles) เรียกว่าplay

ตอนนี้สำหรับคำถามของคุณ:

ใช่มันสับสนในตอนแรก

คุณมักจะเชื่อมโยงของคุณsource dataกับความหมายของบทบาทของคุณดังนั้นเมื่อคุณเห็นว่าบทบาทsetup_dbนั้นถูกนำไปใช้ในการเล่นกับกลุ่มโฮสต์ที่เกี่ยวข้อง (เช่นdb_hosts) แต่playสามารถทำงานผ่านการรวมกันของกลุ่มโฮสต์หลายกลุ่มได้ มันเป็นเพียงเรื่องของการประชุมและความยืดหยุ่น

ปล

โปรดเขียนกลับมาว่าสิ่งนี้เพิ่มความสับสนหรือได้รับการชี้แจงแล้ว ขอบคุณ.


2

ใส่เพียง:

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

บทบาทคือรูทีนย่อยและโดยปกติจะบรรลุเป้าหมายเดียวเช่นตั้งค่าเซิร์ฟเวอร์ฐานข้อมูล คุณสามารถใส่ไว้ในroles/ไดเร็กทอรีหรือดาวน์โหลดบทบาทของบุคคลที่สามโดยระบุ URI rolesfile.ymlและขอให้ansible-galaxyดาวน์โหลดให้คุณ

[database]เป็นกลุ่มโฮสต์ที่กำหนดไว้ในแฟ้มสินค้าคงคลังที่แสดงรายการโฮสต์ที่อยู่ในdatabaseกลุ่ม คุณยังสามารถระบุกลุ่มของเว็บเซิร์ฟเวอร์โดยระบุสิ่งที่ต้องการ

[web]
web1.example.com
web2.example.com

จัดกลุ่มwebหรือdatabaseสามารถใช้ในเพลย์บุ๊กหรือบทบาทเพื่อระบุโฮสต์ที่จะใช้

นอกจากนี้ยังสามารถใช้กลุ่มในคำสั่งansibleเพื่อเรียกใช้คำสั่งad-hoc


1

นอกจากนี้โปรดทราบว่า playbook สามารถเรียกได้มากกว่าหนึ่งบทบาทหากมีการใช้ไฟล์เมตาที่มีวัตถุประสงค์เพื่อส่งผลต่อบทบาทต่างๆ

ตัวอย่าง Playbook: dual_role-playbook.yml

- name: Some Action for two roles
  hosts: localhost

  vars_files:
    - roles/dual_role/meta/main.yml

  roles:
    - dual_role/container-1
    - dual_role/container-2

โครงร่างโฟลเดอร์และไฟล์บทบาทจะมีลักษณะดังนี้:

dual_role-playbook.yml
  -- roles
     -- dual_role
        -- meta/main.yml
        -- container-1
           -- tasks/main.yml
           -- templates/template.j2
        -- container-2
           -- tasks/main.yml
           -- templates/template.j2
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.