如何使用 Ansible

Ansible 是一款易于使用的自动化软件,可以根据您选择的时间表更新服务器、配置任务、管理日常服务器功能以及部署作业。 它通常从单个位置或控制服务器进行管理,并使用 SSH 连接到远程服务器。 因为它使用 SSH 进行连接,所以非常安全,并且无需在被管理的服务器上安装软件。 它可以在您的台式机、笔记本电脑或其他平台上运行,以帮助自动化每个服务器所有者面临的繁琐任务。

配置完成后,Ansible 会根据所谓的 Playbook 中的有序分配列表执行任务。 Playbook 概述了需要在远程服务器上运行哪些任务以及按什么顺序运行。 配置完成后,Ansible 就像一个 bash for-loop 命令允许一段代码反复重复。 使用 a 的区别 bash 命令和 Ansible 是 Ansible 是 幂等的. 幂等这个词听起来有点吓人,但它仅仅意味着你可以一遍又一遍地发出相同类型的请求,除非有什么改变,否则你会得到相同的结果。

要求

源服务器要求

Ansible 需要在源服务器上安装 Python 2.7 或 Python 3.5。 源服务器是您将在远程服务器的剧本中运行任务的地方。 远程服务器接收剧本中定义的命令。 剧本是一个文件,它定义了将在远程服务器上运行的脚本。

注意:很遗憾,不支持将 Windows 作为源服务器。 某些 Ansible 插件和/或模块会有其他需求或要求。 通常,这些插件或模块安装在 Ansible 安装的同一台服务器上。

让我们从在源服务器上安装 Python 开始。

root@test:~# apt-get install python

目标服务器要求

目标服务器的唯一要求是开放的 SSH 端口。 如果在 /etc/ansible/ansible.cfg 文件中配置,还可以授予 scp(安全复制)和/或 SFTP 连接的访问​​权限。

在 Ubuntu 16.04 上安装 Ansible

要在源 Ubuntu 服务器上安装 Ansible,让我们按照以下步骤操作:

注意:Ansible 的 PPA 在这里:https://launchpad.net/~ansible/+archive/ubuntu/ansible 如果您想查看适用于您的 Ubuntu 变体的版本。

root@test:~# apt-get update
 root@test:~# apt-get install software-properties-common
 root@test:~# apt-add-repository ppa:ansible/ansible
 root@test:~# apt-get update
 root@test:~# apt-get install ansible
 (install text)After this operation, 42.0 MB of additional disk space will be used.
 Do you want to continue? [Y/n] y

回答 ”” 提示。 安装将完成并带您返回命令提示符。 现在,让我们检查安装的 Ansible 版本。

检查 Ansible 版本

root@test:~# ansible --version
 ansible 2.7.0
   config file = /etc/ansible/ansible.cfg
   configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
   ansible python module location = /usr/lib/python2.7/dist-packages/ansible
   executable location = /usr/bin/ansible
   python version = 2.7.12 (default, Dec  4 2017, 14:50:18) [GCC 5.4.0 20160609]

作为替代方案,您也可以在 CentOS 7 服务器上安装 Ansible。

Ansible 也可以安装在 RedHat、Debian、MacOS 和任何 BSD 版本上!

在 CentOS 7 上安装 Ansible

为了在源 CentOS 7 服务器上安装 Ansible,请按照以下步骤操作。
首先,我们需要确保添加了 CentOS 7 EPEL 存储库:

[root@test ~]# cat /etc/redhat-release
 CentOS Linux release 7.5.1804 (Core)
[root@test ~]# yum install epel-release
 Loaded plugins: fastestmirror, priorities, universal-hooks
 Loading mirror speeds from cached hostfile
 …
 ...
 Resolving Dependencies
 --> Running transaction check
 ---> Package epel-release.noarch 0:7-11 will be installed
 --> Finished Dependency Resolution
 Dependencies Resolved
 =========================================================================
 Package              Arch          Version       Repository        Size
 =========================================================================
 Installing:
 epel-release         noarch         7-11         system-extras     15 k
 Transaction Summary
 =========================================================================
 Install  1 Package
 Total download size: 15 k
 Installed size: 24 k
 Is this ok [y/d/N]: y
 Downloading packages:
 epel-release-7-11.noarch.rpm                         |  15 kB  00:00:00
 Running transaction check
 Running transaction test
 Transaction test succeeded
 Running transaction
 Installing : epel-release-7-11.noarch                             1/1
 Verifying  : epel-release-7-11.noarch                             1/1
 Installed:
 epel-release.noarch 0:7-11
 Complete!

选择 ”是的”。 然后将添加 EPEL 存储库。 启用存储库后,我们可以安装 Ansible 百胜

root@test:~# yum install ansible
 Loaded plugins: fastestmirror, priorities, universal-hooks
 Loading mirror speeds from cached hostfile
 epel/x86_64/metalink                                  | 18 kB 00:00:00
 * EA4: 208.100.0.204
 * cpanel-addons-production-feed: 208.100.0.204
 * epel: mirrors.BYNSS.com
 epel                                                  | 3.2 kB 00:00:00
 (1/3): epel/x86_64/group_gz                           | 88 kB 00:00:00
 (2/3): epel/x86_64/updateinfo
 (3/3): epel/x86_64/primary                            | 3.6 MB 00:00:00
 epel                                                  12756/12756
 Resolving Dependencies
 … (dependencies check)
 Dependencies Resolved
 ========================================================================
 Package                     Arch Version            Repository Size
 ========================================================================
 Installing:
 ansible                     noarch 2.4.2.0-2.el7    system-extras 7.6 M
 Installing for dependencies:
 21 k
 Transaction Summary
 ========================================================================
 Install  1 Package (+17 Dependent packages)
 Total download size: 12 M
 Installed size: 58 M
 Is this ok [y/d/N]:


选择 ”是的” 开始安装 Ansible:

Is this ok [y/d/N]: y
 … Downloading 18 packages:
 ---------------------------------------------------------------
 Total                                  30 MB/s | 12 MB 00:00:00
 Running transaction check
 Running transaction test
 Transaction test succeeded
 Running transaction
 … (installing 18 python related software)
 ...
 Installed:
 ansible.noarch 0:2.4.2.0-2.el7
 Dependency Installed:
 ... (dependencies verified)
 Complete!

在 CentOS 7 上检查 Ansible 版本

现在,让我们验证安装的版本:

root@test ~]# ansible --version
 ansible 2.4.2.0
 config file = /etc/ansible/ansible.cfg
 configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
 ansible python module location = /usr/lib/python2.7/site-packages/ansible
 executable location = /usr/bin/ansible
 python version = 2.7.5 (default, Jul 13 2018, 13:06:57) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]

设置 Ansible 连接

最初,我们将添加服务器名称或 IP 到 /etc/ansible/主机 文件以识别哪个“未分组” 服务器和 “团体”我们将要连接的服务器。 我们提到按特定顺序取消分组和分组,因为这是 Ansible hosts 文件通常的排列方式。

我们可以为主机文件本身使用我们喜欢的任何名称,但通常它只是称为主机。 Ansible 还指出,hosts 文件也可以识别为 存货 文件,您可以拥有多个库存文件。

让我们首先打开主机文件 vim 并在文件中插入一些条目。

root@test:~# vim /etc/ansible/hosts

以下是默认主机文件的外观:

# This is the default ansible 'hosts' file.
 #
 # It should live in /etc/ansible/hosts
 #
 #   - Comments begin with the '#' character
 #   - Blank lines are ignored
 #   - Groups of hosts are delimited by [header] elements
 #   - You can enter hostnames or ip addresses
 #   - A hostname/ip can be a member of multiple groups
 # Example 1: Ungrouped hosts, specify before any group headers.
 #green.example.com
 #blue.example.com
 #192.168.100.1
 #192.168.100.10
 # Example 2: A collection of hosts belonging to the 'webservers' group
 #[webservers]
 #alpha.example.org
 #beta.example.org
 #192.168.1.100
 #192.168.1.110
 # If you have multiple hosts following a pattern you can specify
 # them like this:
 #www[001:006].example.com
 # Example 3: A collection of database servers in the 'dbservers' group
 #[dbservers]
 #
 #db01.intranet.mydomain.net
 #db02.intranet.mydomain.net
 #10.25.1.56
 #10.25.1.57
 # Here's another example of host ranges, this time there are no
 # leading 0s:
 #db-[99:101]-node.example.com


如您所见,有单独的服务器“#
绿色。example.com”,以及像 # 这样的组[webservers] 其中在组下有多个服务器,另一个部分列出了多个服务器,如 #D b-[99:101]-节点。example.com 它标识了 99-101 中的所有单个服务器; 例如。

  • db-99 节点。example.com
  • db-100 节点。example.com
  • db-101 节点。example.com

所以,让我们快速添加另一个服务器到#[webservers] 团体:

#[webserver1]
 #alpha.example.org
 #beta.example.org
 #192.168.1.100
 #192.168.1.110gamma.example.com

现在,只需保存文件使用克:wq。

注意:确保取消注释您放置在文件中的任何“#”条目,否则,该条目将被排除!

SSH 密钥

您可以设置 公共 SSH 密钥 从控制服务器登录到主机文件中记录的那些远程服务器。 在这种情况下,您只是想确保您的本地 SSH 密钥 位于远程系统上的 /root/.ssh/authorized_keys 文件中。 (根据您的设置,您可能希望使用 Ansible 的 –private-key 选项 改为指定 .pem 文件)

验证 Ansible 连接

ansible 库存文件 (/etc/ansible/主机) 包含您可以控制并可以运行任务的服务器名称。 要验证 Ansible 的连接性,请运行:

ansible remote -m ping

Ansible 剧本

Ansible playbook(也称为清单文件)定义了在远程服务器上运行的任务。 您可以拥有一本或多本剧本 剧本 在不同的服务器上完成不同的任务。 要轻松地将任务应用到池中的所有服务器,请使用 ‘团体’ 为该组应用任务的名称(使用 example 多于你会使用 [webserver1] 在命令中。

创建剧本

第1步: 为了创建剧本,让我们在 /etc/ansible/playbooks/ 文件夹中创建一个新文件:

mkdir -p /etc/ansible/playbooks/ && touch /etc/ansible/playbooks/playbook.yml && vim /etc/ansible/playbooks/playbook.yml

第2步: 让我们在 playbook 文件管理器中添加一个服务器和文件条目:

(点击插入键打开VIM对文件的编辑权限)

- hosts: gamma.example.com
   tasks:
       - name: Create file
         file:
             path: /tmp/test.txt
             state: touch


添加条目后,让我们保存文件
克:wq。

第 3 步: 现在,要在该文件上设置 0644 权限,我们可以重新打开它并添加另一行定义权限集.

- hosts: gamma.example.com
 tasks:
     - name: Create file
       file:
           path: /tmp/test.txt
           state: touch            mode: "u=rw,g=r,o=r"

同样,让我们​​使用:wq。

第4步: 接下来,让我们创建一个文件夹,然后使用 Ansible 在其中放置一个文本文件。 我们将添加另一个部分来定义所需的元素.

- hosts: gamma.example.com
   Tasks:       - name: Create folder
         path: /home/tmp/
             state: directory
             mode: 0755
       - name: Create file
         file:
             path: /home/tmp/test.txt
             state: touch            mode: "u=rw,g=r,o=r"

添加此条目后,使用:wq。

运行剧本

要启动剧本,只需运行:

ansible-playbook /etc/ansible/playbooks/playbook.yml

或者,如果您在一个文件夹中有多个 playbook,可以使用 -i <路径> 命令行选项:

ansible-playbook -i /etc/ansible/playbooks/playbook1.yml

除了 .yaml 文件,Ansible 还可以使用 .json 文件来控制 playbook。 它也很容易转换 bash 或者 贝壳 脚本也可以写入剧本!

使用 Cron 安排剧本

作为附加选项,您可以使用您的服务器安排剧本在特定时间运行 cron 命令! 为此,请以 root 身份登录到您的服务器并运行以下命令:

crontab -e

此命令在您的系统中打开一个临时 cron 文件 默认文本编辑器 然后像这样简单地添加一行:

0 4 * * * /usr/bin/ansible-playbook /etc/ansible/playbooks/playbook.yml

这将运行/etc/ansible/playbooks/playbook.yml 使用 ansible-playbook 命令在 0400 am 提交文件。

对剧本进行故障排除

有时,playbook 文件中的一组命令可能会失败。 如果是这样,您有多种选择来解决这个问题。 通常,剧本将简单地停止完成剧本中的命令。 如果发生这种情况,您可以在 playbook 中定义一个后续任务,以通过添加另一个部分来忽略错误,如下所示:

- name: ignore this error
   command: /bin/false
   ignore_errors: yes

无法访问的主机
此命令仅在任务运行时有效,但返回“失败”值。

如果 Ansible 无法连接到服务器,它会将主机设置为“无法访问”。 这有效地将服务器暂时从该任务的活动主机列表中删除。 为了纠正这个问题,我们可以使用一个条目来重新激活它们并拥有 之前指示为无法访问的所有当前主机都已清除,因此后续任务可以再次使用该剧本。

meta: clear_host_errors

处理程序和失败

一种 处理程序 只是一个特殊命名的任务,当另一个任务告诉它时运行。 默认情况下,处理程序在 playbook 的末尾执行,而不是在 playbook 中定义时立即执行的其他任务。 这种行为可以通过使用

--force-handlers

命令行选项,或通过包括

force_handlers: True

在剧本中,或添加

force_handlers = True

在里面 ansible.cfg 文件。

如果你想强制一个处理程序在两个单独的任务中间而不是在剧本的末尾运行,你需要在两个任务之间添加这个条目:

- meta: flush_handlers

当像这样“强制”处理程序时,即使该主机上的任务失败,它们也会在收到通知时运行。

注意:某些错误仍然会阻止处理程序运行,例如主机无​​法访问。

处理程序只有在实际执行时才会在输出中可见。 此外,仅当任务进行更改时才会触发处理程序。 为了 example,一个任务可能会更新一个特定的配置文件,然后 通知处理程序重新启动服务。 如果稍后同一 playbook 中的任务失败,尽管先前的配置更改,服务将不会重新启动。

总体而言,Ansible 是管理和管理单个服务器或整个地理位置不同的服务器组的不可或缺的工具。