อัปเดต: ในฐานะของ Ansible 2.0 ขณะนี้มีโมดูลทั่วไปและบทคัดย่อpackage
ตัวอย่างการใช้งาน:
ตอนนี้เมื่อชื่อแพคเกจเหมือนกันในตระกูล OS ต่าง ๆ มันง่ายเหมือน:
---
- name: Install foo
package: name=foo state=latest
เมื่อชื่อแพ็กเกจแตกต่างกันในตระกูล OS คุณสามารถจัดการได้ด้วยการแจกจ่ายหรือไฟล์ vars เฉพาะตระกูล OS:
---
# roles/apache/apache.yml: Tasks entry point for 'apache' role. Called by main.yml
# Load a variable file based on the OS type, or a default if not found.
- include_vars: "{{ item }}"
with_first_found:
- "../vars/{{ ansible_distribution }}-{{ ansible_distribution_major_version | int}}.yml"
- "../vars/{{ ansible_distribution }}.yml"
- "../vars/{{ ansible_os_family }}.yml"
- "../vars/default.yml"
when: apache_package_name is not defined or apache_service_name is not defined
- name: Install Apache
package: >
name={{ apache_package_name }}
state=latest
- name: Enable apache service
service: >
name={{ apache_service_name }}
state=started
enabled=yes
tags: packages
จากนั้นสำหรับแต่ละระบบปฏิบัติการที่คุณต้องจัดการแตกต่างกัน ... สร้างไฟล์ vars:
---
# roles/apache/vars/default.yml
apache_package_name: apache2
apache_service_name: apache2
---
# roles/apache/vars/RedHat.yml
apache_package_name: httpd
apache_service_name: httpd
---
# roles/apache/vars/SLES.yml
apache_package_name: apache2
apache_service_name: apache2
---
# roles/apache/vars/Debian.yml
apache_package_name: apache2
apache_service_name: apache2
---
# roles/apache/vars/Archlinux.yml
apache_package_name: apache
apache_service_name: httpd
แก้ไข: ตั้งแต่ Michael DeHaan (ผู้สร้าง Ansible) ได้เลือกที่จะไม่สรุปโมดูลการจัดการแพ็กเกจอย่างที่Chefทำ
หากคุณยังคงใช้ Ansible รุ่นเก่า (Ansible <2.0) อยู่แต่น่าเสียดายที่คุณจะต้องจัดการกับมันในplaybooks และบทบาททั้งหมดของคุณ IMHOสิ่งนี้ผลักดันให้เกิดงานซ้ำ ๆ ที่ไม่จำเป็นลงบน Playbook และผู้เขียนบท ... แต่มันเป็นอย่างที่เป็นอยู่ในปัจจุบัน โปรดทราบว่าฉันไม่ได้กำลังบอกว่าเราควรพยายามแยกตัวจัดการแพ็กเกจออกจากกันในขณะที่ยังพยายามสนับสนุนตัวเลือกและคำสั่งเฉพาะทั้งหมดของพวกเขา แต่เพียงแค่มีวิธีที่ง่ายในการติดตั้งแพ็กเกจ ฉันยังไม่ได้บอกว่าเราทุกคนควรข้ามไปที่ Smart Package Managerbandwagon แต่สิ่งที่เป็นนามธรรมของชั้นการติดตั้งแพคเกจบางอย่างในเครื่องมือการจัดการการกำหนดค่าของคุณมีประโยชน์มากในการทำให้ playbooks / cookbooks ข้ามแพลตฟอร์มง่ายขึ้น โครงการสมาร์ทดูน่าสนใจ แต่มันค่อนข้างทะเยอทะยานที่จะรวมการจัดการแพกเกจข้าม distros และแพลทฟอร์มโดยไม่ต้องยอมรับมาก ... มันจะน่าสนใจที่จะเห็นว่ามันประสบความสำเร็จหรือไม่ ปัญหาที่แท้จริงคือเพียงแค่ชื่อแพ็คเกจที่บางครั้งมีแนวโน้มที่จะแตกต่างกันใน distros ดังนั้นเรายังต้องทำคำสั่งกรณีหรือwhen:
คำสั่งเพื่อจัดการความแตกต่าง
วิธีที่ฉันจัดการกับมันก็คือการทำตามtasks
โครงสร้างไดเรกทอรีนี้ใน playbook หรือบทบาท:
roles/foo
└── tasks
├── apt_package.yml
├── foo.yml
├── homebrew_package.yml
├── main.yml
└── yum_package.yml
แล้วมีสิ่งนี้ในของฉันmain.yml
:
---
# foo: entry point for tasks
# Generally only include other file(s) and add tags here.
- include: foo.yml tags=foo
สิ่งนี้ในfoo.yml
(สำหรับแพ็คเกจ 'foo'):
---
# foo: Tasks entry point. Called by main.yml
- include: apt_package.yml
when: ansible_pkg_mgr == 'apt'
- include: yum_package.yml
when: ansible_pkg_mgr == 'yum'
- include: homebrew_package.yml
when: ansible_os_family == 'Darwin'
- name: Enable foo service
service: >
name=foo
state=started
enabled=yes
tags: packages
when: ansible_os_family != 'Darwin'
จากนั้นสำหรับผู้จัดการแพคเกจต่าง ๆ :
พาร์ทเมนต์:
---
# tasks file for installing foo on apt based distros
- name: Install foo package via apt
apt: >
name=foo{% if foo_version is defined %}={{ foo_version }}{% endif %}
state={% if foo_install_latest is defined and foo_version is not defined %}latest{% else %}present{% endif %}
tags: packages
ยำ:
---
# tasks file for installing foo on yum based distros
- name: Install EPEL 6.8 repos (...because it's RedHat and foo is in EPEL for example purposes...)
yum: >
name={{ docker_yum_repo_url }}
state=present
tags: packages
when: ansible_os_family == "RedHat" and ansible_distribution_major_version|int == 6
- name: Install foo package via yum
yum: >
name=foo{% if foo_version is defined %}-{{ foo_version }}{% endif %}
state={% if foo_install_latest is defined and foo_version is not defined %}latest{% else %}present{% endif %}
tags: packages
- name: Install RedHat/yum-based distro specific stuff...
yum: >
name=some-other-custom-dependency-on-redhat
state=latest
when: ansible_os_family == "RedHat"
tags: packages
Homebrew:
---
- name: Tap homebrew foobar/foo
homebrew_tap: >
name=foobar/foo
state=present
- homebrew: >
name=foo
state=latest
โปรดทราบว่านี่เป็นการทำซ้ำอย่างน่ากลัวและไม่ใช่DRYและแม้ว่าบางสิ่งอาจแตกต่างกันในแพลตฟอร์มที่แตกต่างกันและจะต้องได้รับการจัดการโดยทั่วไปฉันคิดว่านี่เป็นสิ่งที่ละเอียดและเทอะทะเมื่อเทียบกับ Chef:
package 'foo' do
version node['foo']['version']
end
case node["platform"]
when "debian", "ubuntu"
# do debian/ubuntu things
when "redhat", "centos", "fedora"
# do redhat/centos/fedora things
end
และใช่มีข้อโต้แย้งว่าชื่อแพคเกจบางชื่อมีความแตกต่างกันไปในส่วนของ distros และถึงแม้จะมีอยู่ในปัจจุบันคือการขาดข้อมูลสามารถเข้าถึงได้ง่ายผมกล้าที่จะเดาว่าส่วนใหญ่ชื่อแพคเกจที่เป็นที่นิยมทั่วไปทั่ว distros และสามารถติดตั้งผ่านโมดูลผู้จัดการแพคเกจใจลอย กรณีพิเศษจะต้องมีการจัดการอยู่แล้วและแล้วจะต้องมีงานพิเศษทำสิ่งที่แห้งน้อยหากมีข้อสงสัยให้ตรวจสอบpkgs.org