标签 Ansible 下的文章

让 DevOps 少一点,OpsDev 多一点。

在这个 DevOps 世界中,看起来开发(Dev)这一半成为了关注的焦点,而运维(Ops)则是这个关系中被遗忘的另一半。这几乎就好像是领头的开发告诉尾随的运维做什么,几乎所有的“运维”都是开发说要做的。因此,运维被抛到后面,降级到了替补席上。

我想看到更多的 OpsDev。因此,让我们来看看 Ansible 在日常的运维中可以帮助你什么。

 title=

我选择在 Ansible Tower 中展示这些方案,因为我认为用户界面 (UI) 可以增色大多数的任务。如果你想模拟测试,你可以在 Tower 的上游开源版本 AWX 中测试它。

管理用户

在大规模环境中,你的用户将集中在活动目录或 LDAP 等系统中。但我敢打赌,仍然存在许多包含大量的静态用户的全负荷环境。Ansible 可以帮助你将这些分散的环境集中到一起。社区已为我们解决了这个问题。看看 Ansible Galaxy 中的 users 角色。

这个角色的聪明之处在于它允许我们通过数据管理用户,而无需更改运行逻辑。

 title=

通过简单的数据结构,我们可以在系统上添加、删除和修改静态用户。这很有用。

管理 sudo

提权有多种形式,但最流行的是 sudo。通过每个 usergroup 等离散文件来管理 sudo 相对容易。但一些人对给予特权感到紧张,并倾向于有时限地给予提权。因此下面是一种方案,它使用简单的 at 命令对授权访问设置时间限制。

 title=

管理服务

给入门级运维团队提供菜单以便他们可以重启某些服务不是很好吗?看下面!

 title=

管理磁盘空间

这有一个简单的角色,可在特定目录中查找字节大于某个大小的文件。在 Tower 中这么做时,启用回调有额外的好处。想象一下,你的监控方案发现文件系统已超过 X% 并触发 Tower 中的任务以找出是什么文件导致的。

 title=

调试系统性能问题

这个角色相当简单:它运行一些命令并打印输出。细节在最后输出,让你 —— 系统管理员快速浏览一眼。另外可以使用 正则表达式 在输出中找到某些条件(比如说 CPU 占用率超过 80%)。

 title=

总结

我已经录制了这五个任务的简短视频。你也可以在 Github 上找到所有代码


via: https://opensource.com/article/19/8/ops-tasks-ansible

作者:Mark Phillips 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在如今的 IT 领域,自动化一个是热门话题,每个组织都开始采用自动化工具,像 Puppet、Ansible、Chef、CFEngine、Foreman 和 Katello。在这些工具中,Ansible 是几乎所有 IT 组织中管理 UNIX 和 Linux 系统的首选。在本文中,我们将演示如何在 Debian 10 Sever 上安装和使用 Ansible。

我的实验室环境:

  • Debian 10 – Ansible 服务器/ 控制节点 – 192.168.1.14
  • CentOS 7 – Ansible 主机 (Web 服务器)– 192.168.1.15
  • CentOS 7 – Ansible 主机(DB 服务器)– 192.169.1.17

我们还将演示如何使用 Ansible 服务器管理 Linux 服务器

在 Debian 10 Server 上安装 Ansible

我假设你的 Debian 10 中有一个拥有 root 或 sudo 权限的用户。在我这里,我有一个名为 pkumar 的本地用户,它拥有 sudo 权限。

Ansible 2.7 包存在于 Debian 10 的默认仓库中,在命令行中运行以下命令安装 Ansible,

root@linuxtechi:~$ sudo apt update
root@linuxtechi:~$ sudo apt install ansible -y

运行以下命令验证 Ansible 版本,

root@linuxtechi:~$ sudo ansible --version

ansible-version

要安装最新版本的 Ansible 2.8,首先我们必须设置 Ansible 仓库。

一个接一个地执行以下命令,

root@linuxtechi:~$ echo "deb http://ppa.launchpad.net/ansible/ansible/ubuntu bionic main" | sudo tee -a /etc/apt/sources.list
root@linuxtechi:~$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 93C4A3FD7BB9C367
root@linuxtechi:~$ sudo apt update
root@linuxtechi:~$ sudo apt install ansible -y
root@linuxtechi:~$ sudo ansible --version

latest-ansible-version

使用 Ansible 管理 Linux 服务器

请参考以下步骤,使用 Ansible 控制器节点管理 Linux 类的服务器,

步骤 1:在 Ansible 服务器及其主机之间交换 SSH 密钥

在 Ansible 服务器生成 ssh 密钥并在 Ansible 主机之间共享密钥。

root@linuxtechi:~$ sudo -i
root@linuxtechi:~# ssh-keygen
root@linuxtechi:~# ssh-copy-id root@linuxtechi
root@linuxtechi:~# ssh-copy-id root@linuxtechi

步骤 2:创建 Ansible 主机清单

安装 Ansible 后会自动创建 /etc/ansible/hosts,在此文件中我们可以编辑 Ansible 主机或其客户端。我们还可以在家目录中创建自己的 Ansible 主机清单,

运行以下命令在我们的家目录中创建 Ansible 主机清单。

root@linuxtechi:~$ vi $HOME/hosts
[Web]
192.168.1.15

[DB]
192.168.1.17

保存并退出文件。

注意:在上面的主机文件中,我们也可以使用主机名或 FQDN,但为此我们必须确保 Ansible 主机可以通过主机名或者 FQDN 访问。

步骤 3:测试和使用默认的 Ansible 模块

Ansible 附带了许多可在 ansible 命令中使用的默认模块,示例如下所示。

语法:

# ansible -i <host_file> -m <module> <host>

这里:

  • -i ~/hosts:包含 Ansible 主机列表
  • -m:在之后指定 Ansible 模块,如 ping 和 shell
  • <host>:我们要运行 Ansible 模块的 Ansible 主机

使用 Ansible ping 模块验证 ping 连接,

root@linuxtechi:~$ sudo ansible -i ~/hosts -m ping all
root@linuxtechi:~$ sudo ansible -i ~/hosts -m ping Web
root@linuxtechi:~$ sudo ansible -i ~/hosts -m ping DB

命令输出如下所示:

Ansible-ping-module-examples

使用 shell 模块在 Ansible 主机上运行 shell 命令

语法:

ansible -i <hosts_file> -m shell -a <shell_commands>  <host>

例子:

root@linuxtechi:~$ sudo ansible -i ~/hosts -m shell -a "uptime" all
192.168.1.17 | CHANGED | rc=0 >>
 01:48:34 up  1:07,  3 users,  load average: 0.00, 0.01, 0.05

192.168.1.15 | CHANGED | rc=0 >>
 01:48:39 up  1:07,  3 users,  load average: 0.00, 0.01, 0.04

root@linuxtechi:~$
root@linuxtechi:~$ sudo ansible -i ~/hosts -m shell -a "uptime ; df -Th / ; uname -r" Web
192.168.1.15 | CHANGED | rc=0 >>
 01:52:03 up  1:11,  3 users,  load average: 0.12, 0.07, 0.06
Filesystem              Type  Size  Used Avail Use% Mounted on
/dev/mapper/centos-root xfs    13G 1017M   12G   8% /
3.10.0-327.el7.x86_64

root@linuxtechi:~$

上面的命令输出表明我们已成功设置 Ansible 控制器节点。

让我们创建一个安装 nginx 的示例剧本,下面的剧本将在所有服务器上安装 nginx,这些服务器是 Web 主机组的一部分,但在这里,我的主机组下只有一台 centos 7 机器。

root@linuxtechi:~$ vi nginx.yaml
---
- hosts: Web
  tasks:
    - name: Install latest version of nginx on CentOS 7 Server
      yum: name=nginx state=latest
    - name: start nginx
      service:
          name: nginx
          state: started

现在使用以下命令执行剧本。

root@linuxtechi:~$ sudo ansible-playbook -i ~/hosts  nginx.yaml

上面命令的输出类似下面这样,

nginx-installation-playbook-debian10

这表明 Ansible 剧本成功执行了。

本文就是这些了,请分享你的反馈和评论。


via: https://www.linuxtechi.com/install-ansible-automation-tool-debian10/

作者:Pradeep Kumar 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在本系列第三篇(也是最后一篇)文章中,我们将使用 Ansible 自动化配置 GNOME 桌面设置。

在本系列关于使用 Ansible 配置工作站的第一篇文章中,我们设置了一个仓库并配置了一些基本的东西。在第二篇文章中,我们配置了 Ansible 以使其在对仓库进行更改时自动应用设置。在第三篇(也是最后一篇)文章中,我们将使用 Ansible 配置 GNOME 桌面设置。

此配置只适用于较新的发行版(例如我将在示例中使用的 Ubuntu 18.04)。较旧版本的 Ubuntu 将无法运行,因为它们附带了一个老版本的 python-psutils,对于 Ansible 的 dconf 模块无法正常工作。如果你使用的是较新版本的 Linux 发行版,则应该没有问题。

在开始之前,确保你已经完成了本系列的第一部分和第二部分,因为第三部分建立在此基础之上的。如果还没有,下载前两篇文章中一直使用的 GitHub 仓库,我们将为其添加更多功能。

设置壁纸和锁屏

首先,我们将创建一个任务手册来保存我们的 GNOME 设置。在仓库的根目录中,应该有一个名为 local.yml 的文件,添加以下行:

- include: tasks/gnome.yml

整个文件应如下所示:

- hosts: localhost
  become: true
  pre_tasks:
    - name: update repositories
      apt: update_cache=yes
      changed_when: False

  tasks:
    - include: tasks/users.yml
    - include: tasks/cron.yml
    - include: tasks/packages.yml
    - include: tasks/gnome.yml

基本上,这添加了对名为 gnome.yml 文件的引用,它将存储在仓库内的 tasks 目录中。我们还没有创建这个文件,现在就来创建它。在 tasks 目录中创建 gnome.yml 文件,并将以下内容放入:

- name: Install python-psutil package
  apt: name=python-psutil

- name: Copy wallpaper file
  copy: src=files/wallpaper.jpg dest=/home/jay/.wallpaper.jpg owner=jay group=jay mode=600

- name: Set GNOME Wallpaper
  become_user: jay
  dconf: key="/org/gnome/desktop/background/picture-uri" value="'file:///home/jay/.wallpaper.jpg'"

注意,此代码多次引用我的用户名(jay),因此确保使用你机器上的用户名替换每次出现的 jay。另外,如果你没有像我一样使用 Ubuntu 18.04,你将必须更改 apt 一行来匹配你所选择的发行版的包管理器,并确认 python-psutil 包的名称,因为它可能有所不同。

在示例任务中,我引用了 file 目录下的 wallpaper.jpg 文件,此文件必须存在,否则 Ansible 配置将失败。在 tasks 目录中,创建一个名为 files 的子目录。找到你喜欢的壁纸图片,将其命名为 wallpaper.jpg,然后把它放在 files 目录中。如果文件是 PNG 图像而不是 JPG,在代码和仓库中更改文件扩展名。如果你觉得没有创意,我在 GitHub 仓库 中有一个示例壁纸文件,你可以使用它。

完成所有这些更改后,将内容提交到 GitHub 仓库,并推送这些更改。总结一下,你应该完成以下工作:

  • 修改 local.yml 文件以引用 tasks/gnome.yml
  • 使用上面提到的内容创建 tasks/gnome.yml
  • tasks 目录中创建一个 files 目录,其中有一个名为 wallpaper.jpg 的图像文件(或者你选择的任何名称)。

完成这些步骤并将更改推送到仓库后,配置应该在下次计划运行期间自动应用。(你可能还记得我们在上一篇文章中对此进行了自动化。)如果你想节省时间,可以使用以下命令立即应用配置:

sudo ansible-pull -U https://github.com/<github_user>/ansible.git

如果一切正常,你应该可以看到你的新壁纸。

让我们花一点时间来了解新的 GNOME 任务手册的功能。首先,我们添加了一个计划来安装 python-psutil 包。如果不添加它,我们就不能使用 dconf 模块,因为它需要在修改 GNOME 设置之前安装这个包。接下来,我们使用 copy 模块将壁纸文件复制到我们的 home 目录,并将生成的文件命名为以点开头的隐藏文件。如果你不希望此文件放在 home 目录的根目录中,你可以随时指示此部分将其复制到其它位置 —— 只要你在正确的位置引用它,它仍然可以工作。在下一个计划中,我们使用 dconf 模块来更改 GNOME 设置。在这种情况下,我们调整了 /org/gnome/desktop/background/picture-uri 键并将其设置为 file:///home/jay/.wallpaper.jpg。注意本节中的引号 —— 你必须在 dconf 值中使用两个单引号,如果值是一个字符串,还必须包含在双引号内。

现在,让我们进一步进行配置,并将背景应用于锁屏。这是现在的 GNOME 任务手册,但增加了两个额外的计划:

- name: Install python-psutil package
  apt: name=python-psutil

- name: Copy wallpaper file
  copy: src=files/wallpaper.jpg dest=/home/jay/.wallpaper.jpg owner=jay group=jay mode=600

- name: Set GNOME wallpaper
  dconf: key="/org/gnome/desktop/background/picture-uri" value="'file:///home/jay/.wallpaper.jpg'"

- name: Copy lockscreenfile
  copy: src=files/lockscreen.jpg dest=/home/jay/.lockscreen.jpg owner=jay group=jay mode=600

- name: Set lock screen background
  become_user: jay
  dconf: key="/org/gnome/desktop/screensaver/picture-uri" value="'file:///home/jay/.lockscreen.jpg'"

正如你所看到的,我们做的事情和设置壁纸时差不多。我们添加了两个额外的任务,一个是复制锁屏图像并将其放在我们的 home 目录中,另一个是将设置应用于 GNOME 以便使用它。同样,确保将 jay 更改为你的用户名,并命名你想要的锁屏图片 lockscreen.jpg,并将其复制到 files 目录。将这些更改提交到仓库后,在下一次计划的 Ansible 运行期间就会应用新的锁屏。

应用新的桌面主题

设置壁纸和锁屏背景很酷,但是让我们更进一步来应用桌面主题。首先,让我们在我们的任务手册中添加一条指令来安装 arc 主题的包。将以下代码添加到 GNOME 任务手册的开头:

- name: Install arc theme
  apt: name=arc-theme

然后,在底部,添加以下动作:

- name: Set GTK theme
  become_user: jay
  dconf: key="/org/gnome/desktop/interface/gtk-theme" value="'Arc'"

你看到 GNOME 的 GTK 主题在你眼前变化了吗?我们添加了一个动作来通过 apt 模块安装 arc-theme 包,另一个动作将这个主题应用到 GNOME。

进行其它定制

既然你已经更改了一些 GNOME 设置,你可以随意添加其它定制。你在 GNOME 中调整的任何设置都可以通过这种方式自动完成,设置壁纸和主题只是几个例子。你可能想知道如何找到要更改的设置,以下是一个我用的技巧。

首先,通过在你管理的计算机上运行以下命令,获取所有当前 dconf 设置的快照:

dconf dump / > before.txt

此命令将所有当前更改导出到名为 before.txt 的文件中。接下来,手动更改要自动化的设置,并再次获取 dconf 设置:

dconf dump / > after.txt

现在,你可以使用 diff 命令查看两个文件之间的不同之处:

diff before.txt after.txt

这应该会给你一个已更改键值的列表。虽然手动更改设置确实违背了自动化的目的,但你实际上正在做的是获取更新首选设置时更改的键,这允许你创建 Ansible 任务以修改这些设置,这样你就再也不需要碰这些设置了。如果你需要还原机器,Ansible 仓库会处理好你的每个定制。如果你有多台计算机,甚至是一组工作站,则只需手动进行一次更改,所有其他工作站都将应用新设置并完全同步。

最后

如果你已经阅读完本系列文章,你应该知道如何设置 Ansible 来自动化工作站。这些示例提供了一个有用的基础,你可以使用这些语法和示例进行其他定制。随着你的进展,你可以继续添加新的修改,这将使你的 Ansible 配置一直增长。

我已经用 Ansible 以这种方式自动化了一切,包括我的用户帐户和密码、Vim、tmux 等配置文件、桌面包、SSH 设置、SSH 密钥,基本上我想要自定义的一切都使用了。以本系列文章作为起点,将为你实现工作站的完全自动化铺平道路。


via: https://opensource.com/article/18/5/manage-your-workstation-ansible-part-3

作者:Jay LaCroix 选题:lujun9972 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Ansible 是世界上最受欢迎的自动化引擎之一。它能让你自动化几乎任何事情,从本地系统的设置到大量的平台和应用。它是跨平台的,因此你可以将其用于各种操作系统。请继续阅读以获取有关如何在 Fedora 中获取最新 Ansible,以及它的一些更改和改进,以及如何使用它。

发布版本和功能

Ansible 2.8 最近发布了,其中包含许多修复、功能和增强。仅仅几天之后,它就可在 Fedora 29 和 30 以及 EPEL 中获取。两周前发布了后续版本 2.8.1。同样,新版本在几天内就可以在 Fedora 中获取。

使用 sudo 能够非常容易地从官方仓库安装:

$ sudo dnf -y install ansible

2.8 版本有很长的更新列表,你可以在 2.8 的迁移指南中阅读查看。但其中包含了一些好东西,比如 Python 解释器发现功能 。Ansible 2.8 现在会试图找出哪个 Python 是它所运行的平台的首选版本。如果失败,Ansible 会使用后备列表。但是,你仍然可以使用变量 ansible_python_interpreter 来设置 Python 解释器。

另一个变化使 Ansible 在各个平台上更加一致。由于 sudo 专用于 UNIX/Linux,而其他平台并没有,因此现在在更多地方使用 become。这包括了命令行开关。例如,-ask-sudo-pass 已变成了 -ask-become-pass,提示符也变成了 BECOME password:

2.8 和 2.8.1 版本中还有许多其他功能。有关所有细节,请查看 GitHub 上的官方更新日志

使用 Ansible

也许你不确定 Ansible 是否可以实际使用。别担心,你并不是唯一一个这样想的,因为它太强大了。但事实证明,它并不难以使用,在一个家庭内的几台电脑(甚至一台电脑)上设置都可以。

我们之前在 Fedora Magazine 中也讨论过这个话题:

试试看 Ansible,说下你的想法。很重要的一部分是让 Fedora 保持最新版本。自动化快乐!


via: https://fedoramagazine.org/get-the-latest-ansible-2-8-in-fedora/

作者:Paul W. Frields 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Testinfra 是一个功能强大的库,可用于编写测试来验证基础设施的状态。另外它与 Ansible 和 Nagios 相结合,提供了一个用于架构即代码 (IaC) 的简单解决方案。

 title=

根据设计,Ansible 传递机器的期望状态,以确保 Ansible 剧本或角色的内容部署到目标机器上。但是,如果你需要确保所有基础架构更改都在 Ansible 中,该怎么办?或者想随时验证服务器的状态?

Testinfra 是一个基础架构测试框架,它可以轻松编写单元测试来验证服务器的状态。它是一个 Python 库,使用强大的 pytest 测试引擎。

开始使用 Testinfra

可以使用 Python 包管理器(pip)和 Python 虚拟环境轻松安装 Testinfra。

$ python3 -m venv venv
$ source venv/bin/activate
(venv) $ pip install testinfra

Testinfra 也可以通过 Fedora 和 CentOS 的 EPEL 仓库中使用。例如,在 CentOS 7 上,你可以使用以下命令安装它:

$ yum install -y epel-release
$ yum install -y python-testinfra

一个简单的测试脚本

在 Testinfra 中编写测试很容易。使用你选择的代码编辑器,将以下内容添加到名为 test_simple.py 的文件中:

import testinfra

def test_os_release(host):
    assert host.file("/etc/os-release").contains("Fedora")

def test_sshd_inactive(host):
    assert host.service("sshd").is_running is False

默认情况下,Testinfra 为测试用例提供了一个 host 对象,该对象能访问不同的辅助模块。例如,第一个测试使用 file 模块来验证主机上文件的内容,第二个测试用例使用 service 模块来检查 systemd 服务的状态。

要在本机运行这些测试,请执行以下命令:

(venv)$ pytest test_simple.py
================================ test session starts ================================
platform linux -- Python 3.7.3, pytest-4.4.1, py-1.8.0, pluggy-0.9.0
rootdir: /home/cverna/Documents/Python/testinfra
plugins: testinfra-3.0.0
collected 2 items
test_simple.py ..

================================ 2 passed in 0.05 seconds ================================

有关 Testinfra API 的完整列表,你可以参考文档

Testinfra 和 Ansible

Testinfra 支持的后端之一是 Ansible,这意味着 Testinfra 可以直接使用 Ansible 的清单文件和清单中定义的一组机器来对它们进行测试。

我们使用以下清单文件作为示例:

[web]
app-frontend01
app-frontend02

[database]
db-backend01

我们希望确保我们的 Apache Web 服务器在 app-frontend01app-frontend02 上运行。让我们在名为 test_web.py 的文件中编写测试:

def check_httpd_service(host):
    """Check that the httpd service is running on the host"""
    assert host.service("httpd").is_running

要使用 Testinfra 和 Ansible 运行此测试,请使用以下命令:

(venv) $ pip install ansible
(venv) $ py.test --hosts=web --ansible-inventory=inventory --connection=ansible test_web.py

在调用测试时,我们使用 Ansible 清单文件的 [web] 组作为目标计算机,并指定我们要使用 Ansible 作为连接后端。

使用 Ansible 模块

Testinfra 还为 Ansible 提供了一个很好的可用于测试的 API。该 Ansible 模块能够在测试中运行 Ansible 动作,并且能够轻松检查动作的状态。

def check_ansible_play(host):
    """ 
    Verify that a package is installed using Ansible
    package module
    """
    assert not host.ansible("package", "name=httpd state=present")["changed"]

默认情况下,Ansible 的检查模式已启用,这意味着 Ansible 将报告在远程主机上执行动作时会发生的变化。

Testinfra 和 Nagios

现在我们可以轻松地运行测试来验证机器的状态,我们可以使用这些测试来触发监控系统上的警报。这是捕获意外的更改的好方法。

Testinfra 提供了与 Nagios 的集成,它是一种流行的监控解决方案。默认情况下,Nagios 使用 NRPE 插件对远程主机进行检查,但使用 Testinfra 可以直接从 Nagios 主控节点上运行测试。

要使 Testinfra 输出与 Nagios 兼容,我们必须在触发测试时使用 --nagios 标志。我们还使用 -qq 这个 pytest 标志来启用 pytest 的静默模式,这样就不会显示所有测试细节。

(venv) $ py.test --hosts=web --ansible-inventory=inventory --connection=ansible --nagios -qq line test.py
TESTINFRA OK - 1 passed, 0 failed, 0 skipped in 2.55 seconds

Testinfra 是一个功能强大的库,可用于编写测试以验证基础架构的状态。 另外与 Ansible 和 Nagios 相结合,提供了一个用于架构即代码 (IaC) 的简单解决方案。 它也是使用 Molecule 开发 Ansible 角色过程中添加测试的关键组件。


via: https://opensource.com/article/19/5/using-testinfra-ansible-verify-server-state

作者:Clement Verna 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

用 Ansible 自动化你的数据中心的关键点。

Ansible 是一个开源自动化工具,可以从中央控制节点统一配置服务器、安装软件或执行各种 IT 任务。它采用一对多、 无客户端 agentless 的机制,从控制节点上通过 SSH 发送指令给远端的客户机来完成任务(当然除了 SSH 外也可以用别的协议)。

Ansible 的主要使用群体是系统管理员,他们经常会周期性地执行一些安装、配置应用的工作。尽管如此,一些非特权用户也可以使用 Ansible,例如数据库管理员就可以通过 Ansible 用 mysql 这个用户来创建数据库、添加数据库用户、定义访问权限等。

让我们来看一个简单的使用场景,一位系统管理员每天要配置 100 台服务器,并且必须在每台机器上执行一系列 Bash 命令,然后交付给用户。

这是个简单的例子,但应该能够证明:在 yaml 文件里写好命令然后在远程服务器上运行,是一件非常轻松的事。而且如果运行环境不同,就可以加入判断条件,指明某些命令只能在特定的服务器上运行(如:只在那些不是 Ubuntu 或 Debian 的系统上运行 yum 命令)。

Ansible 的一个重要特性是用 剧本 playbook 来描述一个计算机系统的最终状态,所以一个剧本可以在服务器上反复执行而不影响其最终状态(LCTT 译注:即是幂等的)。如果某个任务已经被实施过了(如,“用户 sysman 已经存在”),那么 Ansible 就会忽略它继续执行后续的任务。

定义

  • 任务 task :是工作的最小单位,它可以是个动作,比如“安装一个数据库服务”、“安装一个 web 服务器”、“创建一条防火墙规则”或者“把这个配置文件拷贝到那个服务器上去”。
  • 动作 play : 由任务组成,例如,一个动作的内容是要“设置一个数据库,给 web 服务用”,这就包含了如下任务:1)安装数据库包;2)设置数据库管理员密码;3)创建数据库实例;4)为该实例分配权限。
  • 剧本 playbook :(LCTT 译注:playbook 原指美式橄榄球队的战术手册,也常指“剧本”,此处惯例采用“剧本”译名) 由动作组成,一个剧本可能像这样:“设置我的网站,包含后端数据库”,其中的动作包括:1)设置数据库服务器;2)设置 web 服务器。
  • 角色 role :用来保存和组织剧本,以便分享和再次使用它们。还拿上个例子来说,如果你需要一个全新的 web 服务器,就可以用别人已经写好并分享出来的角色来设置。因为角色是高度可配置的(如果编写正确的话),可以根据部署需求轻松地复用它们。
  • Ansible 星系 Ansible Galaxy :是一个在线仓库,里面保存的是由社区成员上传的角色,方便彼此分享。它与 GitHub 紧密集成,因此这些角色可以先在 Git 仓库里组织好,然后通过 Ansible 星系分享出来。

这些定义以及它们之间的关系可以用下图来描述:

请注意上面的例子只是组织任务的方式之一,我们当然也可以把安装数据库和安装 web 服务器的剧本拆开,放到不同的角色里。Ansible 星系上最常见的角色是独立安装、配置每个应用服务,你可以参考这些安装 mysqlhttpd 的例子。

编写剧本的小技巧

学习 Ansible 最好的资源是其官方文档。另外,像学习其他东西一样,搜索引擎是你的好朋友。我推荐你从一些简单的任务开始,比如安装应用或创建用户。下面是一些有用的指南:

  • 在测试的时候少选几台服务器,这样你的动作可以执行的更快一些。如果它们在一台机器上执行成功,在其他机器上也没问题。
  • 总是在真正运行前做一次 测试 dry run ,以确保所有的命令都能正确执行(要运行测试,加上 --check-mode 参数 )。
  • 尽可能多做测试,别担心搞砸。任务里描述的是所需的状态,如果系统已经达到预期状态,任务会被简单地忽略掉。
  • 确保在 /etc/ansible/hosts 里定义的主机名都可以被正确解析。
  • 因为是用 SSH 与远程主机通信,主控节点必须要能接受密钥,所以你面临如下选择:1)要么在正式使用之前就做好与远程主机的密钥交换工作;2)要么在开始管理某台新的远程主机时做好准备输入 “Yes”,因为你要接受对方的 SSH 密钥交换请求(LCTT 译注:还有另一个不那么安全的选择,修改主控节点的 ssh 配置文件,将 StrictHostKeyChecking 设置成 “no”)。
  • 尽管你可以在同一个剧本内把不同 Linux 发行版的任务整合到一起,但为每个发行版单独编写剧本会更明晰一些。

总结一下

Ansible 是你在数据中心里实施运维自动化的好选择,因为它:

  • 无需客户端,所以比其他自动化工具更易安装。
  • 将指令保存在 YAML 文件中(虽然也支持 JSON),比写 shell 脚本更简单。
  • 开源,因此你也可以做出自己的贡献,让它更加强大!

你是怎样使用 Ansible 让数据中心更加自动化的呢?请在评论中分享您的经验。


via: https://opensource.com/article/18/2/tips-success-when-getting-started-ansible

作者:Jose Delarosa 译者:jdh8383 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出