使用 Ansible 管理 BSD 主机
管理 BSD 计算机与管理其他类 Unix 计算机不同。如果您有运行 BSD 的托管节点,请查看以下主题。
连接到 BSD 节点
Ansible 默认使用 OpenSSH 连接到托管节点。如果您使用 SSH 密钥进行身份验证,这在 BSD 上有效。但是,如果您使用 SSH 密码进行身份验证,则 Ansible 依赖于 sshpass
。大多数版本的 sshpass
不能很好地处理 BSD 登录提示,因此在使用 SSH 密码连接 BSD 计算机时,请使用 paramiko
而不是 OpenSSH 进行连接。您可以在 ansible.cfg
中全局执行此操作,也可以将其设置为清单/组/主机变量。例如
[freebsd]
mybsdhost1 ansible_connection=paramiko
引导 BSD
Ansible 默认是无代理的,但是,它需要在托管节点上安装 Python。只有 raw 模块才能在没有 Python 的情况下运行。尽管此模块可用于引导 Ansible 并在 BSD 变体上安装 Python(请参见下文),但它非常有限,并且需要使用 Python 才能充分利用 Ansible 的功能。
以下示例安装了 Python,其中包括 Ansible 全部功能所需的 json 库。在您的控制计算机上,您可以对大多数 FreeBSD 版本执行以下操作
ansible -m raw -a "pkg install -y python" mybsdhost1
或者对于 OpenBSD
ansible -m raw -a "pkg_add python%3.8"
完成此操作后,您现在可以使用 raw
模块之外的其他 Ansible 模块。
注意
此示例演示了在 FreeBSD 上使用 pkg 和在 OpenBSD 上使用 pkg_add,但是,您应该能够为您的 BSD 替换适当的软件包工具;软件包名称也可能有所不同。有关您打算安装的确切 Python 软件包名称,请参阅您正在使用的 BSD 变体的软件包列表或文档。
设置 Python 解释器
为了支持各种类 Unix 操作系统和发行版,Ansible 不能总是依赖于现有环境或 env
变量来定位正确的 Python 二进制文件。默认情况下,模块指向 /usr/bin/python
,因为这是最常见的位置。在 BSD 变体上,此路径可能有所不同,因此建议通知 Ansible 二进制文件的位置。请参阅 INTERPRETER_PYTHON。例如,设置 ansible_python_interpreter
清单变量
[freebsd:vars]
ansible_python_interpreter=/usr/local/bin/python
[openbsd:vars]
ansible_python_interpreter=/usr/local/bin/python3.8
FreeBSD 软件包和 Ports
在 FreeBSD 中,不能保证默认情况下会安装 /usr/local/bin/python
可执行文件或指向可执行文件的链接。对于远程主机,关于 Ansible 的最佳实践是至少安装 Ansible 支持的 Python 版本,例如, lang/python38
,以及元端口 lang/python3
和 lang/python
。引用自 /usr/ports/lang/python3/pkg-descr
This is a meta port to the Python 3.x interpreter and provides symbolic links
to bin/python3, bin/pydoc3, bin/idle3 and so on to allow compatibility with
minor version agnostic Python scripts.
引用自 /usr/ports/lang/python/pkg-descr
This is a meta port to the Python interpreter and provides symbolic links
to bin/python, bin/pydoc, bin/idle and so on to allow compatibility with
version agnostic python scripts.
因此,安装以下软件包
shell> pkg info | grep python
python-3.8_3,2 "meta-port" for the default version of Python interpreter
python3-3_3 Meta-port for the Python interpreter 3.x
python38-3.8.12_1 Interpreted object-oriented programming language
和以下可执行文件和链接
shell> ll /usr/local/bin/ | grep python
lrwxr-xr-x 1 root wheel 7 Jan 24 08:30 python@ -> python3
lrwxr-xr-x 1 root wheel 14 Jan 24 08:30 python-config@ -> python3-config
lrwxr-xr-x 1 root wheel 9 Jan 24 08:29 python3@ -> python3.8
lrwxr-xr-x 1 root wheel 16 Jan 24 08:29 python3-config@ -> python3.8-config
-r-xr-xr-x 1 root wheel 5248 Jan 13 01:12 python3.8*
-r-xr-xr-x 1 root wheel 3153 Jan 13 01:12 python3.8-config*
INTERPRETER_PYTHON_FALLBACK
自 2.8 版本起,Ansible 提供了一个有用的变量 ansible_interpreter_python_fallback
来指定搜索 Python 的路径列表。请参阅 INTERPRETER_PYTHON_FALLBACK。将搜索此列表,并将使用找到的第一项。例如,以下配置将使上一节中元端口的安装变得多余,也就是说,如果您不安装 Python 元端口,则将跳过列表中的前两项,并且将发现 /usr/local/bin/python3.8
。
ansible_interpreter_python_fallback=['/usr/local/bin/python', '/usr/local/bin/python3', '/usr/local/bin/python3.8']
您可以延长此变量,使用较低版本的 Python,并将其放置在例如 group_vars/all
中。然后,根据需要在 group_vars/{group1, group2, ...}
中覆盖特定组的变量,并在 host_vars/{host1, host2, ...}
中覆盖特定主机的变量。请参阅 变量优先级:我应该将变量放在哪里?。
调试 Python 的发现
例如,给定清单
shell> cat hosts
[test]
test_11
test_12
test_13
[test:vars]
ansible_connection=ssh
ansible_user=admin
ansible_become=true
ansible_become_user=root
ansible_become_method=sudo
ansible_interpreter_python_fallback=['/usr/local/bin/python', '/usr/local/bin/python3', '/usr/local/bin/python3.8']
ansible_perl_interpreter=/usr/local/bin/perl
以下 Playbook
shell> cat playbook.yml
- hosts: test_11
gather_facts: false
tasks:
- command: which python
register: result
- debug:
var: result.stdout
- debug:
msg: |-
{% for i in _vars %}
{{ i }}:
{{ lookup('vars', i)|to_nice_yaml|indent(2) }}
{% endfor %}
vars:
_vars: "{{ query('varnames', '.*python.*') }}"
显示详细信息
shell> ansible-playbook -i hosts playbook.yml
PLAY [test_11] *******************************************************************************
TASK [command] *******************************************************************************
[WARNING]: Platform freebsd on host test_11 is using the discovered Python interpreter at
/usr/local/bin/python, but future installation of another Python interpreter could change the
meaning of that path. See https://docs.ansible.org.cn/ansible-
core/2.12/reference_appendices/interpreter_discovery.html for more information.
changed: [test_11]
TASK [debug] *********************************************************************************
ok: [test_11] =>
result.stdout: /usr/local/bin/python
TASK [debug] *********************************************************************************
ok: [test_11] =>
msg: |-
ansible_interpreter_python_fallback:
- /usr/local/bin/python
- /usr/local/bin/python3
- /usr/local/bin/python3.8
discovered_interpreter_python:
/usr/local/bin/python
ansible_playbook_python:
/usr/bin/python3
您可以看到,从列表 ansible_interpreter_python_fallback
中的第一项是在 FreeBSD 远程主机上发现的。变量 ansible_playbook_python
保留了在运行 Playbook 的 Linux 控制节点上的 Python 路径。
关于警告,引用自 INTERPRETER_PYTHON
The fallback behavior will issue a warning that the interpreter
should be set explicitly (since interpreters installed later may
change which one is used). This warning behavior can be disabled by
setting auto_silent or auto_legacy_silent. ...
您可以忽略它,也可以通过设置变量 ansible_python_interpreter=auto_silent
来消除它,因为这实际上是您通过使用 /usr/local/bin/python
(“稍后安装的解释器可能会更改使用的解释器”)想要实现的目标。例如
shell> cat hosts
[test]
test_11
test_12
test_13
[test:vars]
ansible_connection=ssh
ansible_user=admin
ansible_become=true
ansible_become_user=root
ansible_become_method=sudo
ansible_interpreter_python_fallback=['/usr/local/bin/python', '/usr/local/bin/python3', '/usr/local/bin/python3.8']
ansible_python_interpreter=auto_silent
ansible_perl_interpreter=/usr/local/bin/perl
其他变量
如果您使用 Ansible 捆绑的插件之外的其他插件,则可以根据插件的编写方式为 bash
、perl
或 ruby
设置类似的变量。例如
[freebsd:vars]
ansible_python_interpreter=/usr/local/bin/python
ansible_perl_interpreter=/usr/local/bin/perl
哪些模块可用?
大多数核心 Ansible 模块是为类 Unix 计算机和其他通用服务的组合编写的,因此大多数模块应该在 BSD 上运行良好,但明显例外的是那些针对仅限 Linux 技术的模块(例如 LVG)。
将 BSD 用作控制节点
将 BSD 用作控制计算机与为您的 BSD 变体安装 Ansible 软件包或按照 pip
或“从源代码”的说明进行安装一样简单。
BSD facts
Ansible 从 BSD 系统收集信息的方式与 Linux 机器类似,但由于网络、磁盘和其他设备的数据、名称和结构可能有所不同,因此输出结果可能会略有不同,但对于 BSD 管理员来说仍然是熟悉的。
BSD 贡献与努力
在 Ansible 中,对 BSD 的支持对我们来说非常重要。尽管我们的大部分贡献者使用并面向 Linux,但我们有一个活跃的 BSD 社区,并努力尽可能地对 BSD 友好。请随时报告您在使用 BSD 时发现的任何问题或不兼容之处;我们也欢迎包含修复的拉取请求!
另请参阅
- Ad hoc 命令简介
基本命令示例
- 使用 Playbook
学习 Ansible 的配置管理语言
- 你是否应该开发一个模块?
如何编写模块
- 沟通
有问题?需要帮助?想要分享你的想法?请访问 Ansible 沟通指南