Ansible
- Ansible 是一个极其简单的 IT 自动化引擎,可以自动化云配置、配置管理、应用程序部署、服务内部编排以及许多其他 IT 需求。
安装
在控制机器(主控机)上,安装 ansible-core 软件包。此外,您可以安装 ansible 软件包,它提供了一系列社区策划的集合。
在受管机器(节点)上,您希望在其中自动化部署或配置任务,需要 python,并且在某些情况下可能需要指示特定的 #Python 二进制文件位置。还需要一种与节点通信的方式,这通常是 SSH。请注意,功能正常的 SSH 密钥 设置可以简化 Ansible 的使用,但不是必需的。
基本用法
配置
Ansible 参数在配置文件中设置,该文件可以是当前目录中的 ansible.cfg
、主目录中的 .ansible.cfg
或 /etc/ansible/ansible.cfg
,以先找到的为准。
可以使用以下命令生成基本配置
$ ansible-config init --disabled > ansible.cfg
清单
基础设施列在 Ansible 清单文件中,默认情况下保存在位置 /etc/ansible/hosts
中,或者可以使用 -i
命令行开关指定不同的清单文件。例如,以下清单定义了一个包含 7 个节点,组织成两个集群的集群
/etc/ansible/hosts
[control] 192.168.12.1 foo-[a:c].example.org localhost ansible_connection=local [managed] 192.168.12.2 192.168.12.3
可以在基础设施文件中每行或在 ansible.cfg
配置文件中为每个节点分配特定属性。默认情况下,Ansible 通过 SSH 执行 playbook,ansible_connection
参数将连接扩展到
local
以将 playbook 部署到控制机器本身docker
将 playbook 直接部署到 Docker 容器中
有关详细信息,请查看 Ansible - intro inventory。
Ping
您可以检查清单中列出的所有节点是否都处于活动状态,方法是
$ ansible all -m ping
Playbook
Playbook 是配置和部署整个基础设施的主要组织单元。有关更多详细信息,请查看 官方文档。这是一个非常简单的演示,其中上述清单的管理员想要在一组 Arch Linux 主机上执行完整的系统升级。首先,创建一个 playbook 文件,使用 YAML 格式(始终 2 个空格缩进)
syu.yml
--- - name: All hosts up-to-date hosts: control managed become: true tasks: - name: Full system upgrade community.general.pacman: update_cache: true upgrade: true
然后,运行 playbook 脚本
$ ansible-playbook --ask-become-pass syu.yml
Vault
可以使用 vault 将敏感数据以加密形式保存在 playbook 或角色中,而不是以纯文本形式保存。vault 密码可以以纯文本形式存储在文件中,例如包含 myvaultpassword
的 vault_pass.txt
,以便稍后用作命令参数
$ ansible-playbook site.yml --vault-id vault_pass.txt
为了使用存储在 vault_pass.txt
中的密码加密名为 varname
的变量的内容 the var content
,应使用以下命令
$ ansible-vault encrypt_string --vault-id vault_pass.txt 'the var content' --name varname
为了更安全地操作,为了避免在命令行中输入变量内容,而是提示您输入,可以使用
$ ansible-vault encrypt_string --vault-id vault_pass.txt --stdin-name varname
Reading plaintext input from stdin. (ctrl-d to end input)
该命令直接返回受保护的变量,该变量可以插入到 playbook 中。加密和非加密变量可以共存于 YAML 文件中,如下所示
notsecret: myvalue mysecret: !vault | $ANSIBLE_VAULT;1.1;AES256 66386439653236336462626566653063336164663966303231363934653561363964363833313662 6431626536303530376336343832656537303632313433360a626438346336353331386135323734 62656361653630373231613662633962316233633936396165386439616533353965373339616234 3430613539666330390a313736323265656432366236633330313963326365653937323833366536 3462 other_not_secret: othervalue
软件包管理
官方仓库
Ansible 具有 pacman 模块(由 ansible 软件包提供),用于处理使用 pacman 进行安装、删除和系统升级。
AUR
对于 Arch 用户仓库 (AUR),需要使用外部模块 ansible-aur。请参阅 README 以获取使用和安装说明。
虽然 Ansible 期望以 root 身份进行 ssh,但 AUR 助手不允许以 root 身份执行操作,它们都会因“您不能以 root 身份执行此操作”而失败。对于 Ansible 自动化,因此建议创建一个用户,例如名为 aur_builder,该用户在 sudoers 中使用 pacman 时不需要密码。这可以在 Ansible 中使用以下操作完成
task.yml
- user: name=aur_builder - lineinfile: path: /etc/sudoers.d/aur_builder-allow-to-sudo-pacman state: present line: "aur_builder ALL=(ALL) NOPASSWD: /usr/bin/pacman" validate: /usr/sbin/visudo -cf %s create: yes
然后,可以将 AUR 助手或 makepkg 与 Ansible 参数 become: yes
和 become_user: aur_builder
结合使用
技巧和窍门
用户账户创建
Ansible 可以管理用户帐户,尤其能够创建新帐户。这在 playbook 中通过 user 模块 实现,该模块采用可选的 password
参数来设置用户密码。需要提供给模块的是密码的哈希值。
哈希处理可以在 Ansible 中使用其内部 哈希过滤器 之一动态执行
- user: name: user_name password: "{{ 'user_password' | password_hash('sha512', 'mypermsalt') }}" shell: /usr/bin/nologin
使用这种方法,建议对 user_password 进行 vault 加密,使其不以纯文本形式显示,请参阅 #Vault。但是,加密变量不能直接通过管道传输,需要先将其分配给另一个将通过管道传输的变量。
或者,哈希处理可以在 Ansible 外部执行。以下命令分别返回 user_password 的 MD5 和 SHA512 哈希值
$ openssl passwd -1 user_password
$ python -c 'import crypt; print(crypt.crypt("user_password", crypt.mksalt(crypt.METHOD_SHA512)))'
Python 二进制文件位置
Ansible 需要目标机器上安装 Python。默认情况下,Ansible 假定它可以在远程系统上找到 /usr/bin/python
,它是 2.X 或 3.X 版本,特别是 2.6 或更高版本。
如果您的某些模块特别需要 Python2,则需要在清单文件中设置 ansible_python_interpreter
变量来告知 Ansible 其位置。这可以通过在清单中使用主机组来完成
/etc/ansible/hosts
[archlinux] server1 server2 [debian] server3 [archlinux:vars] ansible_python_interpreter=/usr/bin/python2
有关 Ansible 中 Python 版本支持的更多信息,请参见 [1]、[2] 和 [3]。
故障排除
解压
unarchive
模块解压缩归档文件。但是 tar 文件未得到良好支持,并且在 GitHub - unarchive 中报告了几个未解决的问题。特别是当参数 keep_newer
设置为 yes
时,不会观察到幂等性。如果您遇到该模块的问题,可以改用 zip 格式,该格式在 Ansible 中集成得更好。
参见
- https://ansible.org.cn/resources/videos/quick-start-video - 12 分钟了解 Ansible 概念
- https://docs.ansible.org.cn/ansible/latest/collections/community/general/pacman_module.html - pacman 模块的官方文档