关于 Ansible
Ansible 是一个 IT 自动化工具。它可以配置系统,部署软件,并协调更高级的 IT 任务,如持续部署或零停机滚动更新。Ansible 的主要目标是简单和易用性。它还非常注重安全性和可靠性,具有最小的移动部件,使用 OpenSSH 进行运输(以其他运输和拉取模式作为替代方案),以及一种围绕人类(即使是不熟悉程序的人)的可审计性设计的语言。
Ansible 以无代理的方式管理机器。从来没有关于如何升级远程守护进程的问题,或者因为守护进程被卸载而无法管理系统的问题。此外,安全性暴露大大降低,因为 Ansible 使用 OpenSSH —— 使用SSH(安全壳)协议进行远程登录的开源连接工具。
安装配置
Ansible 是一个无代理自动化工具,您可以将其安装在单个主机上(称为控制节点)。从控制节点,Ansible 可以使用 SSH、Powershell 远程和许多其他传输远程管理整个机器和其他设备(称为托管节点),所有这些都来自一个简单的命令行界面,不需要数据库或守护进程。
节点依赖条件
对于控制节点(运行 Ansible 的机器),可以使用几乎任何安装了Python 3.9 或更新版本的类UNIX机器。这包括 Linux 版 Windows子系统(WSL)发行版下的 Red Hat、Debian、Ubuntu、macOS、BSD 和 Windows。没有 WSL 的Windows 作为控制节点不受原生支持;
托管节点(Ansible 正在管理的机器)不需要安装 Ansible,但需要 Python 2.7 或 Python 3.5 - 3.11 来运行 Ansible 库代码。托管节点还需要一个用户帐户,该用户帐户可以使用交互式 POSIX shell 向节点 SSH。
注意: 网络模块是一个例外,不需要托管设备上的Python。请参阅 Network modules。
下表列出了控制和托管节点所需的 Python 的当前和历史版本。
ansible-core Version | 控制节点 Python | 托管节点 Python |
---|---|---|
2.11 | Python 2.7, Python 3.5 - 3.9 | Python 2.6 - 2.7, Python 3.5 - 3.9 |
2.12 | Python 3.8 - 3.10 | Python 2.6 - 2.7, Python 3.5 - 3.10 |
2.13 | Python 3.8 - 3.10 | Python 2.7, Python 3.5 - 3.10 |
2.14 | Python 3.9 - 3.11 | Python 2.7, Python 3.5 - 3.11 |
安装 Ansible
在您选择的 Python 环境中使用 pip 为当前用户安装您选择的 Ansible 软件包
1
2
3
4
5
6
7
8
9
10
11
12
13
14# 创建虚拟环境
python -m venv ~/.pyenv/versions/Ansible
# 激活虚拟环境
source ~/.pyenv/versions/Ansible/bin/activate
# 升级 pip 命令
pip install -U pip
# 安装 ansible
pip install ansible
# 或者,您可以在此 Python 环境中安装特定版本的 ansible-core:
pip install ansible-core==2.12.3要将此 Python 环境中的现有 Ansible 安装升级到最新版本,只需添加
--upgrade
到上面的命令1
pip install --upgrade ansible
可以通过检查版本来测试 Ansible 是否安装正确
1
2
3
4
5
6
7
8
9
10
11
12ansible --version
# 输出信息如下
ansible [core 2.14.2]
config file = None
configured module search path = ['/Users/wanwu/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /Users/wanwu/.pyenv/versions/Ansible/lib/python3.9/site-packages/ansible
ansible collection location = /Users/wanwu/.ansible/collections:/usr/share/ansible/collections
executable location = /Users/wanwu/.pyenv/versions/Ansible/bin/ansible
python version = 3.9.15 (main, Nov 18 2022, 11:17:46) [Clang 14.0.0 (clang-1400.0.29.202)] (/Users/wanwu/.pyenv/versions/Ansible/bin/python)
jinja version = 3.1.2
libyaml = True此命令显示的版本适用于已安装的关联的 ansible-core 软件包。要检查已安装的 ansible 软件包的版本,请按照以下步骤操作:
1
2
3
4
5
6
7
8
9
10
11
12
13pip show ansible
# 输出信息如下
Name: ansible
Version: 7.2.0
Summary: Radically simple IT automation
Home-page: https://ansible.com/
Author: Ansible, Inc.
Author-email: info@ansible.com
License: GPLv3+
Location: /Users/wanwu/.pyenv/versions/Ansible/lib/python3.9/site-packages
Requires: ansible-core
Required-by:
配置 Ansible
Ansible 支持几个来源来配置其行为,包括名为 ansible.cfg
的ini文件、环境变量、命令行选项、playbook 关键字和变量。ansible-config
实用程序允许用户查看所有可用的配置设置、默认设置、如何设置它们以及它们的当前值来自哪里。
Ansible 的配置文件将按以下顺序进行搜索:
- ANSIBLE_CONFIG (环境变量设置的位置)
- ansible.cfg (在当前目录中的配置文件)
- ~/.ansible.cfg (在家目录中的配置文件)
- /etc/ansible/ansible.cfg
Ansible 将按照上述顺序使用找到的第一个文件,所有其他文件都会被忽略。
生成配置文件
生成一个完全注释的示例
ansible.cfg
文件,例如:1
ansible-config init --disabled > ~/.ansible.cfg
生成一个包含现有插件的更完整的文件
1
ansible-config init --disabled -t all > ~/.ansible.cfg
可以使用这些作为起点来创建自己的
ansible.cfg
文件。
连接方法和详细信息
ControlPersist和paramiko
默认情况下,Ansible 使用原生 OpenSSH,因为它支持 ControlPersist(性能功能)、Kerberos 和 ~/.ssh/config
中的选项,如 Jump Host 设置。如果您的控制机器使用不支持 ControlPersist 的旧版本的 OpenSSH,Ansible 将回退到 Python 实现的名为 “paramiko” 的 OpenSSH。
设置远程用户
默认情况下,Ansible 使用您在控制节点上使用的用户名连接到所有远程设备。如果远程设备上不存在该用户名,您可以为连接设置其他用户名。如果您只需要以其他用户的身份完成一些任务,请查看了解特权升级:Understanding privilege escalation: become。
您可以在剧本中设置连接用户:
1
2
3
4
5
6
7
8
- name: update webservers
hosts: webservers
remote_user: admin
tasks:
- name: thing to do first in this playbook
...作为 Inventory 中的主机变量:
1
2other1.example.com ansible_connection=ssh ansible_user=myuser
other2.example.com ansible_connection=ssh ansible_user=myotheruser或者作为库存中的组变量
1
2
3
4
5
6cloud:
hosts:
cloud1: my_backup.cloud.com
cloud2: my_backup2.cloud.com
vars:
ansible_user: admin
设置 SSH keys
默认情况下,Ansible 假设您正在使用 SSH 密钥连接到远程机器。鼓励使用 SSH 密钥,但如果需要,您可以使用 --ask-pass
选项进行密码身份验证。如果您需要提供特权升级的密码(sudo、pbrun等),请使用 --ask-become-pass
。
设置 SSH 代理以避免重新输入密码:
1
2ssh-agent bash
ssh-add ~/.ssh/id_rsa根据您的设置,您可能希望使用 Ansible 的
--private-key
命令行选项来指定 pem 文件。您还可以添加私钥文件:1
2ssh-agent bash
ssh-add ~/.ssh/keypair.pem在不使用 ssh-agent 的情况下添加私钥文件的另一种方法是在清单文件中使用
ansible_ssh_private_key_file
在本地运行命令
可以使用 “localhost” 或 “127.0.0.1” 作为服务器名称来运行对控制节点的命令:
1
ansible localhost -m ping -e 'ansible_python_interpreter="/usr/bin/env python"'
可以通过将其添加到 Inventory 文件中来显式指定 localhost:
1
localhost ansible_connection=local ansible_python_interpreter="/usr/bin/env python"
管理主机密钥检查
Ansible 默认启用主机密钥检查。检查主机密钥可以防止服务器欺骗和中间人攻击,但它确实需要一些维护。
如果主机被重新安装,并且在 “known_hosts” 中具有不同的密钥,这将导致错误消息,直到更正。如果新主机不在 “known_hosts” 中,您的控制节点可能会提示确认密钥,如果使用 Ansible(从cron)开始,这将带来交互式体验。你可能不想要这个。
如果您理解其含义并希望禁用此行为,您可以通过编辑
/etc/ansible/ansible.cfg
或~/.ansible.cfg
来做到这一点:1
2[defaults]
host_key_checking = False或者,这可以通过
ANSIBLE_HOST_KEY_CHECKING
环境变量设置:1
export ANSIBLE_HOST_KEY_CHECKING=False
另请注意,paramiko 模式下的主机密钥检查相当慢,因此使用此功能时也建议切换到 “ssh”。
其他连接方法
Ansible 可以使用 SSH 以外的各种连接方法。您可以选择任何连接插件,包括本地管理内容和管理 chroot、lxc 和 jail containers。一种名为 “ansible-pull” 的模式也可以反转系统,并通过计划的 git checkouts 让系统 “phone home”,以从中央存储库中提取配置指令。
使用 Ansible
现在你已经安装了 Ansible,是时候从一些基本知识开始了.
第一条命令
编辑(或创建)
/etc/ansible/hosts
并在其中加入一个或多个远程系统.你的 public SSH key 必须在这些系统的authorized_keys
中1
2
3
4
5
610.1.30.87
10.1.40.61
10.1.40.62
10.1.40.63
10.1.40.64
10.1.40.65我们这里使用 SSH Key 来授权.为了避免在建立 SSH 连接时,重复输入密码你可以这么做
1
2ssh-agent bash
ssh-add ~/.ssh/id_rsa现在 ping 你的所有节点
1
ansible -i ./hosts all -m ping
Ansible 会像SSH 那样试图用你的当前用户名来连接你的远程机器。要覆写远程用户名,只需使用
-u
参数. 如果你想访问 sudo 模式, 这里也有标识(flags)来实现1
2
3
4
5
6
7
8# as patrol
$ ansible all -m ping -u patrol
# as patrol, sudoing to root
$ ansible all -m ping -u patrol --sudo
# as patrol, sudoing to deployer
$ ansible all -m ping -u patrol --sudo --sudo-user deployer现在对你的所有节点运行一个命令
1
ansible all -a "/bin/echo hello"
公钥认证
Ansible 1.2.1 及其之后的版本都会默认启用公钥认证.
如果有个主机重新安装并在 known_hosts
中有了不同的 key,这会提示一个错误信息直到被纠正为止。在使用 Ansible 时,你可能不想遇到这样的情况: 如果有个主机没有在 known_hosts
中被初始化将会导致在交互使用 Ansible 或定时执行 Ansible 时对key信息的确认提示。
如果你想禁用此项行为并明白其含义,你能够通过编辑
/etc/ansible/ansible.cfg
or~/.ansible.cfg
来实现:1
2[defaults]
host_key_checking = False或者你也可以通过设置环境变量来实现
1
export ANSIBLE_HOST_KEY_CHECKING=False
同样注意,在 paramiko
模式中公钥认证相当的慢.因此当使用这项特性时,切换至 SSH
是推荐做法.
Ansible 将会对远程系统模块参数记录在远程的 syslog
中,除非一个任务或者 play 被标记了 no_log: True
属性。在主控机上启用基本的日志功能参见 Ansible 的配置文件文档并在配置文件中设置 log_path
。