我不想将自己标记为特定的配置管理器模块,例如 Ansible 的apt
模块或yum
模块。
是否有一款与发行版无关的配置管理软件,或者至少有一个与发行版无关的代码安装以下软件包架构Linux还有?
我问这个问题是因为我没有找到合适的 Ansible Galaxy 角色来在 Arch Linux 上安装 LAMP,并且以下 Debian 的 Bash 脚本不适合 Arch:
#!/bin/bash
apt update -y
apt upgrade ufw sshguard unattended-upgrades wget curl git zip unzip tree -y
ufw --force enable
ufw allow 22,25,80,443
apt upgrade lamp-server^ ssmtp -y
apt upgrade python-certbot-apache -y
apt upgrade php-{cli,curl,mbstring,mcrypt,gd} phpmyadmin -y
答案1
从技术上讲,Ansible 是这样的:因为它是无代理的;我用它来管理路由器、交换机、服务器等。
你似乎要求的是如果package
模块支持 Arch Linux 吗?我懒得测试是否支持Arch;但如果没有,总会有pacman
模块...如果这不起作用...总是可以编写自己的模块。
不过你所说的是跑步的一个更大的问题生产环境中的多个不同发行版。长期管理会变得痛苦。这就是为什么最好不要在生产中运行多个发行版,因为从管理角度(纯粹从代码)来看,这是一项繁重的工作。解决这个问题最明显的方法是使用 Ansiblewhen
结合使用os_family
:
apt:
name: apache2
when: ansible_facts['os_family'] == "Debian"
pacman:
name: nginx
when: ansible_facts['os_family'] == "Archlinux"
我曾经遇到过这样的情况:我必须在生产环境中管理 Debian 服务器和 CentOS 服务器;最终我选择使用纯 Debian,因为:
- CM 的代码库被削减了一半(发行版特定怪癖的所有逻辑都被删除)。
- 测试变得不那么痛苦了(如果你没有测试你的 CM 代码,那么你就做错了)。
无论如何,你们也会遇到重大差异;例如:
- 有些包的名称不同;
httpd
(RHEL) 与apache2
(Debian)。 - 不同的“默认”配置目录;
/etc/default
(Debian)与/etc/sysconfig
(RHEL)。 - 不同的初始化系统;虽然
systemd
已经很大程度上接管了。 - 没有 SSH;例如,适用于 Windows 的 WinRM。
配置管理系统是将环境抽象为代码的一种方式;他们给你逻辑/条件来做到这一点你自己。
答案2
在我看来,维护元包管理器是一项西西弗斯式的任务,因为某人在 Debian 类中必须维护某种“apache2”,在 RHEL 类(等等)Rosetta Stone 中则必须维护“httpd”。
然而,有一个吃豆人Ansible 的模块,专门用于使用 Ansible(您正在寻找的与 disto 无关的管理工具)来管理类似 Arch 的系统上的包。从链接模块文档的示例部分:
- name: Install package foo
pacman:
name: foo
state: present
- name: Upgrade package foo
pacman:
name: foo
state: latest
update_cache: yes
- name: Remove packages foo and bar
pacman:
name: foo,bar
state: absent
- name: Recursively remove package baz
pacman:
name: baz
state: absent
recurse: yes
答案3
包裹是 Ansible“通用操作系统包管理器”。
一个选项是包含特定于操作系统的包列表
- include_vars: "{{ item }}"
with_first_found:
- files:
- "{{ ansible_distribution }}-{{ ansible_distribution_release }}.yml"
- "{{ ansible_distribution }}.yml"
- "{{ ansible_os_family }}.yml"
- "default.yml"
paths: "{{ role_path }}/vars"
并安装软件包
- package:
state: present
name: "{{ item }}"
loop: "{{ list_of_packages }}"
答案4
Nix 是一个独立的包管理器,不与任何操作系统紧密绑定。我在 MacOS 和 Ubuntu 上使用它https://nixos.org/nix/
Saltstack (Ansible compatitor) 对 pkg.installed 有更好的抽象,你不需要关心底层系统是 apt、rpm 还是 arch...(如果它们在系统上存在差异,仍然需要设置 diff pkg 名称,例如 httpd 或 apache2)