建立仓库

仓库将托管节点,组织在为 Ansible 提供系统信息及网络位置的中心化文件中。使用仓库文件,Ansible 可以单个命令,管理大量主机。

要完成以下步骤,咱们需要至少一个主机系统的 IP 地址或完全限定域名 (FQDN)。出于演示目的,该主机可以在容器或虚拟机中本地运行。还必须确保咱们的 SSH 公钥,已添加到每台主机上的 authorized_keys 文件中。

译注:译者在 ArchLinux/Manjaro 通过 virt-manager/Virt-manager,建立了 4 个 AlmaLinux 8 AlmaLinux 9 的虚拟机实例,用于 Ansible 实验目的。

更新:随后发现在针对 AlmaLinux 8 实例运行 Ansible 临时命令时,会报出 MODULE FAILURE: No start of json char found 错误,查询发现这是因为高版本的 Ansible 不再支持 AlmaLinux 8 版本,具体是因为 ArchLinux 8 上 Python 版本为 3.8,而 AlmaLinux 9 上 Python 版本为 3.9。后安装新的 AlmaLinux 9 后,不再报出错误。

AlmaLinux 上运行 dnf install epel-release 以安装开启 EPEL。后即可添加其国内镜像源。

参考:AlmaLinux yum/dnf repo/mirrors 国内镜像列表及更换方法

请继续 Anisble 的入门,并像下面这样建立一个仓库:

  1. 在咱们在上一步中创建的 ansible_quickstart 目录中,创建一个名为 inventory.ini 的文件;

  2. 把一个新的 [myhosts] 组,添加到 inventory.ini 文件,并指定出每个主机系统的 IP 地址或完全限定域名 (FQDN);

[myhosts]
almalinux-6
almalinux-100
almalinux-109
almalinux-213
  1. 检查咱们的仓库;
> ansible-inventory -i ansible_quickstart/inventory.ini --list

译注: 该命令的输出如下。

{
    "_meta": {
        "hostvars": {}
    },
    "all": {
        "children": [
            "ungrouped",
            "myhosts"
        ]
    },
    "myhosts": {
        "hosts": [
            "almalinux-6",
            "almalinux-100",
            "almalinux-109",
            "almalinux-213"
        ]
    }
}
  1. 对咱们仓库中的 myhosts 组,进行 ping 操作。
ansible myhosts -u root -m ping -i ansible_quickstart/inventory.ini

:如果控制节点和托管节点上的用户名不同,请传递 ansible 命令下的 -u 选项。

almalinux-100 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3.8"
    },
    "changed": false,
    "ping": "pong"
}
almalinux-213 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3.8"
    },
    "changed": false,
    "ping": "pong"
}
almalinux-109 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3.8"
    },
    "changed": false,
    "ping": "pong"
}
almalinux-6 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3.8"
    },
    "changed": false,
    "ping": "pong"
}

恭喜,咱们已成功建立了一个仓库。

INI 或 YAML 格式的库存

咱们既可以在 INI 文件中,也可以在 YAML 中创建仓库。大多数情况下,例如前面步骤中的示例,对于少量托管节点来说,INI 文件就非常简单且易于读取。

随着托管节点数量的增加,以 YAML 格式创建仓库,就成为一个明智选择。例如,下面就是个与 inventory.ini 等效的,声明了那些托管节点的唯一名称,并使用了 ansible_host 字段:

myhosts:
  hosts:
    my_host_01:
      ansible_host: 192.0.2.50
    my_host_02:
      ansible_host: 192.0.2.51
    my_host_03:
      ansible_host: 192.0.2.52

译注:此时运行命令:ansible-inventory -i ansible_quickstart/inventory.yaml --list 的输出为:

{
    "_meta": {
        "hostvars": {
            "my_host_01": {
                "ansible_host": "192.0.2.50"
            },
            "my_host_02": {
                "ansible_host": "192.0.2.51"
            },
            "my_host_03": {
                "ansible_host": "192.0.2.52"
            }
        }
    },
    "all": {
        "children": [
            "ungrouped",
            "myhosts"
        ]
    },
    "myhosts": {
        "hosts": [
            "my_host_01",
            "my_host_02",
            "my_host_03"
        ]
    }
}

相比于等价的 INI 格式仓库的命令输出,可以看出 YAML 格式提供了更多信息。

建立仓库的一些技巧

  • 确保组的名字有意义且唯一。组的名字同样区分大小写;

  • 组的名字中要避免使用空格、连字符(-)和先导数字(比如要使用 floor_19,而不是 19th_floor);

  • 要根据主机是什么(What)、位于何处(Where)以及何时存在(When),对清单中的主机进行逻辑分组。

    • What

    根据拓扑对主机进行分组,例如:dbwebleafspine

    译注:这里的 leafspine 是指 Spine-Leaf 网络拓扑,特指数据中心网络拓扑。spine 有枝干,而 leaf即叶子的字面意思。 参考:

    • Where

    按地理位置对主机进行分组,例如:数据中心、区域、楼层、建筑物。

    • When

    按阶段对主机进行分组,例如:开发、测试、灰度发布(staging)、生产。

使用元组别

Use metagroups

使用以下语法,创建出对仓库中的多个组,加以组织的元组别:

metagroupname:
  children:

下面这个仓库,演示了某个数据中心的基本结构。这个示例仓库,包含着一个包括了所有网络设备的 network 元组别,以及一个包含了 network 组以及全部 Web 服务器的 datacenter 元组别。

leafs:
  hosts:
    leaf01:
      ansible_host: 192.0.2.100
    leaf02:
      ansible_host: 192.0.2.110

spines:
  hosts:
    spine01:
      ansible_host: 192.0.2.120
    spine02:
      ansible_host: 192.0.2.130

network:
  children:
    leafs:
    spines:

webservers:
  hosts:
    webserver01:
      ansible_host: 192.0.2.140
    webserver02:
      ansible_host: 192.0.2.150

datacenter:
  children:
    network:
    webservers:

译注:执行命令 ansible-inventory -i ansible_quickstart/datacenter.yaml --list 的输出如下:

{{#include ../ansible_quickstart/datacenter.json}}

创建变量

变量设置托管节点的一些值,比如 IP 地址、FQDN、操作系统及 SSH 用户等,如此咱们在运行 Ansible 命令时,就无需传递他们了。

变量可以应用于特定主机。

webservers:
  hosts:
    webserver01:
      ansible_host: 192.0.2.140
      http_port: 80
    webserver02:
      ansible_host: 192.0.2.150
      http_port: 443

变量也可以应用于某个组别中的全部主机。

webservers:
  hosts:
    webserver01:
      ansible_host: 192.0.2.140
      http_port: 80
    webserver02:
      ansible_host: 192.0.2.150
      http_port: 443
  vars:
    ansible_user: it

译注:此时对于更新后的 ansible_quickstart/inventory_updated.yaml

db:
  hosts:
    almalinux-39:
      ansible_host: 192.168.122.39
  vars:
      db_port: 5432

webservers:
  hosts:
    almalinux-5:
      ansible_host: 192.168.122.5
    debian-199:
      ansible_host: 192.168.122.199
  vars:
    http_port: 443

facility:
  children:
    db:
    webservers:

app:
  hosts:
    almalinux-61:
      ansible_host: 192.168.122.61
    almalinux-207:
      ansible_host: 192.168.122.207
  vars:
    app_port: 8080

website:
  children:
    facility:
    app:
  vars:
    ansible_user: hector

执行 ansible website -m ping -i ansible_quickstart/inventory_updated.yaml,可得到与原先同样的结果。

(End)

Last change: 2025-01-10, commit: 8449e5a

小额打赏,赞助 xfoss.com 长存......

微信 | 支付宝

若这里内容有帮助到你,请选择上述方式向 xfoss.com 捐赠。