Ansible

来自 ArchWiki

来自 www.ansible.com

Ansible 是一个极其简单的 IT 自动化引擎,可以自动化云配置、配置管理、应用程序部署、服务内部编排以及许多其他 IT 需求。

安装

在控制机器(主控机)上,安装 ansible-core 软件包。此外,您可以安装 ansible 软件包,它提供了一系列社区策划的集合。

在受管机器(节点)上,您希望在其中自动化部署或配置任务,需要 python,并且在某些情况下可能需要指示特定的 #Python 二进制文件位置。还需要一种与节点通信的方式,这通常是 SSH。请注意,功能正常的 SSH 密钥 设置可以简化 Ansible 的使用,但不是必需的。

提示: 您可能想要安装 Ansible 文件的语法高亮显示 (例如 vim-ansible 用于 vim)

基本用法

配置

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 密码可以以纯文本形式存储在文件中,例如包含 myvaultpasswordvault_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: yesbecome_user: aur_builder 结合使用

技巧和窍门

用户账户创建

Ansible 可以管理用户帐户,尤其能够创建新帐户。这在 playbook 中通过 user 模块 实现,该模块采用可选的 password 参数来设置用户密码。需要提供给模块的是密码的哈希值

哈希处理可以在 Ansible 中使用其内部 哈希过滤器 之一动态执行

- user:
  name: user_name
  password: "{{ 'user_password' | password_hash('sha512', 'mypermsalt') }}"
  shell: /usr/bin/nologin
提示: salt 应该是固定的,并且应显式提供为哈希函数的第二个参数,以使操作具有幂等性(可以重复执行而不会更改系统状态)。

使用这种方法,建议对 user_password 进行 vault 加密,使其不以纯文本形式显示,请参阅 #Vault。但是,加密变量不能直接通过管道传输,需要先将其分配给另一个将通过管道传输的变量。

或者,哈希处理可以在 Ansible 外部执行。以下命令分别返回 user_passwordMD5SHA512 哈希值

$ 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 中集成得更好。

参见