วิธีล้างข้อมูลจากบทบาทที่ไม่ได้ใช้อีกต่อไปบนเซิร์ฟเวอร์


15

สมมติว่าฉันมีโฮสต์ซึ่งก็คือเว็บเซิร์ฟเวอร์ที่ติดตั้งบทบาท Ansible ที่เกี่ยวข้องnginxดำเนินการกำหนดค่าที่จำเป็นบางอย่าง/etc/nginxและเปิดพอร์ต 80 และ 443 ในไฟร์วอลล์

บางครั้งฉันต้องการให้โฮสต์นั้นไม่ได้เป็นเว็บเซิร์ฟเวอร์อีกต่อไปเพราะด้วยเหตุผลบางอย่างที่ฉันย้ายบริการนั้นไปที่อื่น เพียงแค่ลบเซิร์ฟเวอร์ออกจาก[webservers]ในสินค้าคงคลังจะทำให้ขยะในเซิร์ฟเวอร์ เป็นการดีที่ฉันต้องการถอนการติดตั้งnginxลบ/etc/nginxไดเรกทอรี (และบางไดเรกทอรีอื่น ๆ ) และปิดพอร์ต 80 และ 443 ในไฟร์วอลล์

ใน Puppet ฉันทำได้ โฮสต์ที่เป็นเว็บเซิร์ฟเวอร์จะมีสิ่งนี้ในการกำหนดค่า:

class { 'nginx':
  ensure => present,
}

และทั้งหมดที่ฉันต้องทำคือแทนที่ "ปัจจุบัน" ด้วย "ขาด" หากnginxคลาสนั้นเขียนได้ดีจะยกเลิกการเปลี่ยนแปลงที่เกิดขึ้น (โดยทั่วไปผู้ดูแลระบบจะแทนที่ "ปัจจุบัน" ด้วย "ขาด" และหลังจากนั้นเมื่อเขาแน่ใจว่าโฮสต์ที่ได้รับผลกระทบทั้งหมดได้ยกเลิกการกำหนดค่าเขาจะลบรายการออกจากรายการ)

ยิ่งกว่านั้นฉันคิดว่าโมดูลไฟร์วอลล์ Puppet จะลบกฎไฟร์วอลล์ที่ไม่พบในรายการโดยอัตโนมัติอีกต่อไป ดังนั้นฉันคิดว่าสำหรับไฟร์วอลล์คุณไม่จำเป็นต้องทำสิ่งที่ "ขาด" ข้างต้นไฟร์วอลล์จะปิดโดยอัตโนมัติ

ฉันจะบรรลุสิ่งเหล่านี้ด้วย Ansible ได้อย่างไร


1
ฉันคิดว่าคำถามสมมุติไม่ใช่หัวข้อจริง ๆ ที่นี่ถึงแม้ว่าคำถามของคุณจะไม่ใช่เรื่องไร้คุณค่า แทน"ลองทำเป็น ... "ใช้ถ้อยคำใหม่และพูดเช่น"ในหุ่นฉันสามารถเปลี่ยนบทบาทเซิร์ฟเวอร์และถอนการติดตั้ง nginx ซึ่งติดตั้งไว้ก่อนหน้านี้โดยเปลี่ยนensure => present เป็นensure => absentสิ่งที่จะ ... วิธีการทำเช่นเดียวกันกับ ansible"ฯลฯ ด้วยตัวอย่างของสิ่งที่คุณได้ลองไปแล้ว
HBruijn

2
ฉันจะโต้แย้งว่า Ansible ไม่ได้ออกแบบมาสำหรับสิ่งนี้ มันมีเป้าหมายที่เซิร์ฟเวอร์สำรองที่ทำซ้ำได้ หากคุณไม่ต้องการให้เครื่องเป็นเว็บเซิร์ฟเวอร์อีกต่อไปคุณเพียงแค่ล้างมัน (หรือยกเลิกถ้ามันเป็นอินสแตนซ์ของคลาวด์) แทนที่จะเปลี่ยนใหม่
ceejayoz

@ceejayoz สิ่งที่ฉันได้อ่านมากที่สุดเกี่ยวกับ Ansibles อยู่ในเกม Ender's Order & ลำดับของOrson Scott Card Card แต่สิ่งที่คุณพูดมีความหมายอย่างมากในการแสดงบนคลาวด์
HBruijn

@ceejayoz: ขณะนี้ฉันไม่ได้ใช้ Ansible สำหรับการตั้งค่าหลายเซิร์ฟเวอร์ แต่เพื่อกำหนดค่าเซิร์ฟเวอร์ขนาดเล็กแบบอัตโนมัติ ฉันคิดว่านี่เป็นการใช้ที่ถูกต้อง ดังนั้นเซิร์ฟเวอร์สามารถมี nginx + django + PostgreSQL หากภายหลังฉันตัดสินใจใส่ nginx หรือ nginx + django ที่อื่นเช็ดเซิร์ฟเวอร์ทั้งหมดและต้องการนำ PostgreSQL กลับมาจากการสำรองข้อมูลดูเหมือนจะไม่ดี (ไม่ต้องพูดถึงการหยุดทำงาน)
Antonis Christofides

คำตอบ:


10

ด้วย Ansible คุณจะไม่ทำสิ่งนี้แตกต่างจากวิธีที่คุณทำกับ Puppet

ในตัวอย่างของคุณที่คุณจะตั้ง

class { 'nginx':
  ensure => absent,
}

คุณพึ่งผู้เขียนโมดูลหุ่นเชิดนั้นได้เขียนโค้ดที่จำเป็นเพื่อจัดการกับการลบทุกอย่าง ไม่ใช่โมดูลหุ่นเชิดทุกอันที่มีสิ่งนี้

ในทำนองเดียวกันด้วย Ansible คุณอาจมีบทบาทที่มีทั้งขั้นตอนที่จำเป็นในการติดตั้งและลบออก ความแตกต่างเป็นเพียงวิธีการเรียกทั้งสอง

วิธีการหนึ่งอาจเป็นวิธีที่บทบาทในคำถามเปิดเผยตัวแปรเพื่อสลับพฤติกรรม ยกตัวอย่างเช่นว่าบทบาท Nginx อาจใช้ตัวแปรnginx_stateซึ่งจะมีค่าและinstalledabsent

ในบทบาทของtasks/main.ymlผู้เขียนบทบาทอาจมีบางสิ่งบางอย่างตามแนว ..

- include: install.yml
  when: nginx_state|default('present') == "present"

- include: uninstall.yml
  when: nginx_state|default('present') == "absent"

.. ด้วยตรรกะการติดตั้ง / ถอนการติดตั้งที่เกี่ยวข้องถูกแยกระหว่างไฟล์ที่รวมตามเงื่อนไขทั้งสอง

บทบาทที่ซ้อนกันยังสามารถซ้อนกันได้ เป็นวิธีที่จะทำเช่นเดียวกันอีกอาจเขียนบทบาทเช่นให้บทบาทกับภายในอีกบทบาทหนึ่งของมันเรียกว่าnginx uninstalledจากนั้นคุณสามารถทำได้:

- name: Uninstall nginx
  hosts: some_group
  roles:
    - nginx/uninstalled

Ansible เมื่อเปรียบเทียบกับ Puppet นั้นมีกฎและแนวทางที่น้อยลงเกี่ยวกับวิธีการทำสิ่งต่าง ๆ ดังนั้นการฝึกฝนจะแตกต่างกันเล็กน้อยในป่า แต่แนวคิดเดียวกันนี้ใช้


1
ในขณะที่ในทางเทคนิคคุณสามารถส่งผ่านข้อโต้แย้งไปยังบทบาทต่างๆได้โดยตรงฉันขอแนะนำให้ใช้บทบาทซ้อนกัน ฉันจะพบว่ามันแปลกจริง ๆ ที่เห็นใน playbook บางบทบาทที่จริงจะได้รับการถอนการติดตั้งในการดำเนินการ playbook ตั้งแต่ในตัวแปรที่กำหนดเช่นนี้ การให้มันชัดเจนผ่านบทบาทที่ซ้อนกันดูสะอาดขึ้นมาก ในทางเทคนิคแล้วมันเป็นไปได้ที่จะส่งผ่านข้อโต้แย้งไปยังบทบาท ( - { role: nginx, state: absent }) แต่สำหรับฉันแล้ว ข้อเสียเปรียบเพียงอย่างเดียวกับบทบาทที่ซ้อนกันที่ฉันเคยเห็นคือฉันต้องเชื่อมโยง vars เริ่มต้นจากผู้ปกครอง
bogdan.mustiata

คุณต้องทำอะไรroles: -nginx/uninstalledเพื่อทำงานเช่นนี้? ฉันดูทั่วสถานที่ แต่ไม่พบเอกสารใด ๆ เกี่ยวกับบทบาทการซ้อนในวิธีที่จะทำให้ฉันทำเช่นนั้นได้
รวม

1

เนื่องจากคุณมีการกำหนดค่า / การจัดสรรใน Ansible คุณสามารถระเบิดเซิร์ฟเวอร์ทั้งหมดติดตั้งใหม่ / จัดเตรียมใหม่และมีสถานะที่เป็นที่รู้จักดีสำหรับการทำงาน

หากคุณต้องการ "กำหนดค่า" ใหม่เพื่อวัตถุประสงค์อื่นคุณต้องสร้าง playbook ใหม่ที่ดำเนินงานล้างข้อมูลที่จำเป็น

เท่าที่ฉันทราบโมดูลบรรจุภัณฑ์ Ansible ทั้งหมดสนับสนุนstate=absentเพื่อให้แน่ใจว่าแพคเกจที่กำหนดไม่ได้ติดตั้งบนเซิร์ฟเวอร์ของคุณ นอกจากนี้aptโมดูลมีpurge=yesพารามิเตอร์ซึ่งจะล้างไฟล์กำหนดเองที่เหลืออยู่

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


เพื่อเพิ่มสิ่งนี้ฉันเดิมพันส่วนใหญ่ของบทละครในบทบาทนั้นอาจมีการstate=absentเพิ่ม มีโอกาสที่ดีที่จะลบหรือเลิกทำการเปลี่ยนแปลงการกำหนดค่าส่วนใหญ่ที่คุณทำ ขึ้นอยู่กับว่าบทบาทมีขนาดใหญ่เพียงใดนี่อาจเป็น PITA ที่แท้จริงในการทดสอบ
Christopher Karel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.