标签 Ansible 下的文章

使用 Ansible 剧本自动安装和更新设备上的软件。

Ansible 是系统管理员和开发人员用来保持计算机系统处于最佳状态的一种流行的自动化工具。与可扩展框架一样,Ansible 本身功能有限,它真正的功能体现在许多模块中。在某种程度上,Ansible 模块就是 Linux 系统的命令。它们针对特定问题提供解决方案,而维护计算机时的一项常见任务是使所有计算机的更新和一致。

我曾经使用软件包的文本列表来保持系统或多或少的同步:我会列出笔记本电脑上安装的软件包,然后将其与台式机或另一台服务器之间进行交叉参考,手动弥补差异。当然,在 Linux 机器上安装和维护应用程序是 Ansible 的一项基本功能,这意味着你可以在自己关心的计算机上列出所需的内容。

寻找正确的 Ansible 模块

Ansible 模块的数量非常庞大,如何找到能完成你任务的模块?在 Linux 中,你可以在应用程序菜单或 /usr/bin 中查找要运行的应用程序。使用 Ansible 时,你可以参考 Ansible 模块索引

这个索引按照类别列出。稍加搜索,你就很可能找到所需的模块。对于包管理,Packaging 模块几乎适用于所有带包管理器的系统。

动手写一个 Ansible 剧本

首先,选择本地计算机上的包管理器。例如,如果你打算在运行 Fedora 的笔记本电脑上编写 Ansible 指令(在 Ansible 中称为“ 剧本 playbook ”),那么从 dnf 模块开始。如果你在 Elementary OS 上编写,使用 apt 模块,以此类推。这样你就可以开始进行测试和验证,并可以在以后扩展到其它计算机。

第一步是创建一个代表你的剧本的目录。这不是绝对必要的,但这是一个好习惯。Ansible 只需要一个配置文件就可以运行在 YAML 中,但是如果你以后想要扩展剧本,你就可以通过改变目录和文件的方式来控制 Ansible。现在,只需创建一个名为 install_packages 或类似的目录:

$ mkdir ~/install_packages

你可以根据自己的喜好来命名 Ansible 的剧本,但通常将其命名为 site.yml

$ touch ~/install_packages/site.yml

在你最喜欢的文本编辑器中打开 site.yml,添加以下内容:

---
- hosts: localhost
  tasks:
    - name: install packages
      become: true
      become_user: root
      dnf:
        state: present
        name:
         - tcsh
         - htop

你必须调整使用的模块名称以匹配你使用的发行版。在此示例中,我使用 dnf 是因为我在 Fedora Linux 上编写剧本。

就像 Linux 终端中的命令一样,知道 如何 来调用 Ansible 模块就已经成功了一半。这个示例剧本遵循标准剧本格式:

  • hosts 是一台或多台计算机。在本示例中,目标计算机是 localhost,即你当前正在使用的计算机(而不是你希望 Ansible 连接的远程系统)。
  • tasks 是你要在主机上执行的任务列表。

    • name 是任务的人性化名称。在这种情况下,我使用 install packages,因为这就是该任务正在做的事情。
    • become 允许 Ansible 更改运行此任务的用户。
    • become_user 允许 Ansible 成为 root 用户来运行此任务。这是必须的,因为只有 root 用户才能使用 dnf 安装应用程序。
    • dnf 是模块名称,你可以在 Ansible 网站上的模块索引中找到。

dnf 下的节点是 dnf 模块专用的。这是模块文档的关键所在。就像 Linux 命令的手册页一样,模块文档会告诉你可用的选项和所需的参数。

 title=

安装软件包是一个相对简单的任务,仅需要两个元素。state 选项指示 Ansible 检查系统上是否存在 软件包,而 name 选项列出要查找的软件包。Ansible 会针对机器的 状态 进行调整,因此模块指令始终意味着更改。假如 Ansible 扫描了系统状态,发现剧本里描述的系统(在本例中,tcshhtop 存在)与实际状态存在冲突,那么 Ansible 的任务是进行必要的更改来使系统与剧本匹配。Ansible 可以通过 dnf(或 apt 或者其它任何包管理器)模块进行更改。

每个模块可能都有一组不同的选项,所以在编写剧本时,要经常参考模块文档。除非你对模块非常熟悉,否则这是期望模块完成工作的唯一合理方法。

验证 YAML

剧本是用 YAML 编写的。因为 YAML 遵循严格的语法,所以安装 yamllint 来检查剧本是很有帮助的。更妙的是,有一个专门针对 Ansible 的检查工具称为 ansible-lint,它专门为剧本而生。在继续之前,安装它。

在 Fedora 或 CentOs 上:

$ sudo dnf ins tall yamllint python3-ansible-lint

在 Debian、Elementary 或 Ubuntu 上,同样的:

$ sudo apt install yamllint ansible-lint

使用 ansible-link 来验证你的剧本。如果你无法使用 ansible-lint,你可以使用 yamllint

$ ansible-lint ~/install_packages/site.yml

成功则不返回任何内容,但如果文件中有错误,则必须先修复它们,然后再继续。复制和粘贴过程中的常见错误包括在最后一行的末尾省略换行符、使用制表符而不是空格来缩进。在文本编辑器中修复它们,重新运行 ansible-llint,重复这个过程,直到 ansible-lintyamllint 没有返回为止。

使用 Ansible 安装一个应用

现在你有了一个可验证的有效剧本,你终于可以在本地计算机上运行它了,因为你碰巧知道该剧本定义的任务需要 root 权限,所以在调用 Ansible 时必须使用 --ask-become-pass 选项,因此系统会提示你输入管理员密码。

开始安装:

$ ansible-playbook --ask-become-pass ~/install_packages/site.yml
BECOME password:
PLAY [localhost] ******************************

TASK [Gathering Facts] ******************************
ok: [localhost]

TASK [install packages] ******************************
ok: [localhost]

PLAY RECAP ******************************
localhost: ok=0 changed=2 unreachable=0 failed=0 [...]

这些命令被执行后,目标系统将处于与剧本中描述的相同的状态。

在远程系统上安装应用程序

通过这么多操作来替换一个简单的命令可能会适得其反,但是 Ansible 的优势是它可以在你的所有系统中实现自动化。你可以使用条件语句使 Ansible 在不同的系统上使用特定的模块,但是现在,假定所有计算机都使用相同的包管理器。

要连接到远程系统,你必须在 /etc/ansible/hosts 文件中定义远程系统,该文件与 Ansible 是一起安装的,所以它已经存在了,但它可能是空的,除了一些解释性注释之外。使用 sudo 在你喜欢的文本编辑器中打开它。

你可以通过其 IP 地址或主机名(只要主机名可以解析)定义主机。例如,如果你已经在 /etc/hosts 中定义了 liavara 并可以成功 ping 通,那么你可以在 /etc/ansible/hosts 中将 liavara 设置为主机。或者,如果你正在运行一个域名服务器或 Avahi 服务器并且可以 pingliavara,那么你就可以在 /etc/ansible/hosts 中定义它。否则,你必须使用它的 IP 地址。

你还必须成功地建立与目标主机的安全 shell(SSH)连接。最简单的方法是使用 ssh-copy-id 命令,但是如果你以前从未与主机建立 SSH 连接,阅读我关于如何创建自动 SSH 连接的文章

一旦你在 /etc/ansible/hosts 文件中输入了主机名或 IP 地址后,你就可以在剧本中更改 hosts 定义:

---
- hosts: all
  tasks:
    - name: install packages
      become: true
      become_user: root
      dnf:
        state: present
        name:
         - tcsh
         - htop

再次运行 ansible-playbook

$ ansible-playbook --ask-become-pass ~/install_packages/site.yml

这次,剧本会在你的远程系统上运行。

如果你添加更多主机,则有许多方法可以过滤哪个主机执行哪个任务。例如,你可以创建主机组(服务器的 webserves,台式机的 workstations等)。

适用于混合环境的 Ansible

到目前为止,我们一直假定 Ansible 配置的所有主机都运行相同的操作系统(都是是使用 dnf 命令进行程序包管理的操作系统)。那么,如果你要管理不同发行版的主机,例如 Ubuntu(使用 apt)或 Arch(使用 pacman),或者其它的操作系统时,该怎么办?

只要目标操作系统具有程序包管理器(MacOs 有 HomebrewWindows 有 Chocolatey),Ansible 就能派上用场。

这就是 Ansible 优势最明显的地方。在 shell 脚本中,你必须检查目标主机上有哪些可用的包管理器,即使使用纯 Python,也必须检查操作系统。Ansible 不仅内置了这些功能,而且还具有在剧本中使用命令结果的机制。你可以使用 action 关键字来执行由 Ansible 事实收集子系统提供的变量定义的任务,而不是使用 dnf 模块。

---
- hosts: all
  tasks:
    - name: install packages
      become: true
      become_user: root
      action: >
       {{ ansible_pkg_mgr }} name=htop,transmission state=present update_cache=yes

action 关键字会加载目标插件。在本例中,它使用了 ansible_pkg_mgr 变量,该变量由 Ansible 在初始 收集信息 期间填充。你不需要告诉 Ansible 收集有关其运行操作系统的事实,所以很容易忽略这一点,但是当你运行一个剧本时,你会在默认输出中看到它:

TASK [Gathering Facts] *****************************************
ok: [localhost]

action 插件使用来自这个探针的信息,使用相关的包管理器命令填充 ansible_pkg_mgr,以安装在 name 参数之后列出的程序包。使用 8 行代码,你可以克服在其它脚本选项中很少允许的复杂跨平台难题。

使用 Ansible

现在是 21 世纪,我们都希望我们的计算机设备能够互联并且相对一致。无论你维护的是两台还是 200 台计算机,你都不必一次又一次地执行相同的维护任务。使用 Ansible 来同步生活中的计算机设备,看看 Ansible 还能为你做些什么。


via: https://opensource.com/article/20/9/install-packages-ansible

作者:Seth Kenlon 选题:lujun9972 译者:MjSeven 校对:wxy

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

了解如何通过这些 Ansible 模块实现几乎任何事情。

在我成长的时候,我爷爷在他的花园里有一个棚子。他经常会花几个小时在那里制作和修复东西。这是在我们有互联网之前的事情,所以我花了很多时间看他在那个棚子里创造东西。虽然棚子里有很多工具,从钻头到车床到电器配件,还有很多东西我至今都无法辨认,但他使用的只是他手头的一小部分。然而,他能做到的事情似乎永远没有极限。

我之所以告诉你这个故事,是因为我觉得我的职业生涯是在一个隐喻的棚子里度过的。计算机也是如此多的工具,都在一个狭小(虚拟?)的空间里。而工具棚中又有工具棚 —— 我最喜欢的是 Ansible。最近的 2.9 版本有 3,681 个模块! **3,681 个啊!**当我在 2013 年夏天第一次开始使用 Ansible 时,1.2.1 版本只有 113 个模块,然而,正如我当时写的,我仍然可以实现任何我想象到的东西。

模块是 Ansible 的支柱,是让重任轻装上阵的齿轮。它们被设计为做好一项工作,从而实现了 Unix 哲学。我们就是这样来把这么多的模块捆绑在一起,作为乐团的指挥,Ansible 现在有很多乐器可以听从它的指挥。

回顾一下我多年来的 Ansible 剧本和角色的 Git 仓库,我发现我只用了 35 个模块。这个小的子集被用来构建大型基础设施。不过,我想知道如果用一个更小的子集可以实现什么?当我回顾这 35 个模块时,我在思考,我能否只用 5 个模块就能达到同样的效果。因此,以下是我最喜欢的五个模块,顺序无关。

5. authorized\_key

SSH 是 Ansible 的核心,至少对于除了 Windows 以外的几乎所有其他功能都是如此。在 Ansible 中高效使用 SSH 的关键(没有双关语)是……密钥!顺便提一下,你可以用 SSH 密钥为安全性做很多非常酷的事情。值得仔细阅读 sshd 手册页中的 “authorized\_keys” 部分。如果你需要精细的用户访问控制,管理 SSH 密钥可能会变得很费力,尽管我可以用接下来的两个我最爱的模块中的任何一个,但我更喜欢使用 authorized\_key 这个模块,因为它可以通过变量轻松管理

4. file

除了显而易见的将文件放置在某个地方的功能外,file 模块还可以设置所有权和权限。我想说的是,这样一个模块就能带来很多的好处。很大一部分安全问题也与设置权限有关,所以 file 模块和 authorized\_key 可以很好地配合在一起使用。

3. template

操作文件内容的方法太多了,我看到很多人都在使用 lineinfile。我自己也用它做过小任务。但是,template 模块就清晰多了,因为你维护了整个文件的上下文。我更喜欢以任何人都可以轻松理解的方式编写 Ansible 的内容 —— 对我而言,这意味着容易理解正在发生的事情。template 的使用意味着能够看到你正在放置内容的整个文件、全部你正在改变的变量。

2. uri

当前发布版中的许多模块利用 Ansible 作为编排工具。它们与另一个服务对话,而不是做一些具体的事情,比如把一个文件放到一个地方。通常,这种对话也是通过 HTTP 进行的。在许多这样的模块出现之前,你可以直接使用 uri 模块对 API 进行编程。它是一个强大的访问工具,可以使你能够做很多事情。在我的 Ansible 虚拟棚子里,我不会少了它。

1. shell

这是我们工具包里的王牌、瑞士军刀。如果你为如何控制其他东西而非常苦恼,别说,说就是 shell。有人会说,我们这样说是让 Ansible 成为了 Bash 脚本 —— 但是,我想说的是,这还是有点好处的,因为可以在你的剧本和角色中使用 name 参数记录下每一步。对我来说,这就像一个很大的奖励一样。早在我还在做咨询的时候,我曾经帮助一个数据库管理员(DBA)迁移到 Ansible。这位 DBA 并不喜欢改变,对改变工作方法也是推三阻四。于是,为了简化迁移到 Ansible 方式,我们在 Ansible 中使用 shell 模块调用了一些现有的数据库管理脚本。并在任务中附带了翔实的 name 声明。

通过这五个模块,你可以实现很多事情。是的,为完成特定任务而设计的模块会让你的生活更加轻松。但是,借助简单的工程设计,你几乎可以事半功倍。Ansible 开发者 Brian Coca 是这方面的大师,他的技巧和窍门讲座总是值得一看。


你觉得我喜欢的五大模块怎么样?如果你也必须限制在这么多模块,你会选择哪五个,为什么?在下面的评论中告诉我吧!


via: https://opensource.com/article/19/11/ansible-modules

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

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

今年,准备好,用出色的 Ansible 自动化技能装备自己的技能包吧。

今年我关注了大量关于 Ansible 的文章,以下这些内容都值得每个人学习,无论是否是 Ansible 的新手。

这些文章值得大家标记为书签,或者设置个计划任务(亦或者是设置一个 Tower/AWX 任务),用来提醒自己常读常新。

如果你是 Ansible 的新手,那么就从这些文章开始着手吧:

剩余的这些文章包含了更多高级的话题,比如 Windows 管理、测试、硬件、云和容器,甚至包括了一个案例研究,如何管理那些对技术有兴趣的孩子的需求。

我希望你能像我一样好好享受 Ansible 带来的乐趣。不要停止学习哦!

  1. Ansible 如何为我的家庭带来和平》这个异想天开的案例,你能看到如何利用 Ansible 为孩子们快速部署一个新的笔记本(或者重装旧笔记本)
  2. Taz Brown 和 Abner Malivert 的《适用于 Windows 管理员的 Ansible》:你知道 Ansible 也可以管理 Windows 的节点吗?这篇文章以部署一个 IIS 为案例,阐述了基础的 Ansible 服务器和 Windows 客户端的安装。
  3. Shashank Hegde 的《你需要知道的 10 个 Ansible 模块》是个学习你最应该知道的那些最常见、最基础的 Ansible 模块的好文章。运行命令、安装软件包和操作文件是许多有用的自动化工作的基础。
  4. Marco Bravo 的《如何使用 Ansible 记录流程》:Ansible 的 YAML 文件易于阅读,因此它们可以被用于记录完成任务所需的手动步骤。这一特性可以帮助你调试与扩展,这令工作变得异常轻松。同时,这篇文章还包含关于测试和分析等 Ansible 相关主题的指导。
  5. Clement Verna 的《使用 Testinfra 和 Ansible 验证服务器状态》(译文):测试环节是任何一个 CI/CD DevOps 流程不可或缺的一部分。所以为什么不把测试 Ansible 的运行结果也纳入其中呢?这个测试架构 Testinfra 的入门级文章可以帮助你检查配置结果。
  6. Mark Phillips 的《Ansible 硬件起步》:这个世界并不是完全已经被容器和虚拟机所占据。许多系统管理员仍然需要管理众多硬件资源。通过 Ansible 与一点 PXE、DHCP 以及其他技巧的结合,你可以创建一个方便的管理框架使硬件易于启动和运行。
  7. Jairo da Silva Junior 的《你需要了解的关于 Ansible 模块的知识》:模块给 Ansible 带来了巨大的潜力,已经有许多模块可以拿来利用。但如果没有你所需的模块,那你可以尝试给自己打造一个。看看这篇文章吧,它能让你了解如何从零开始打造自己所需的模块。
  8. Mark Phillips 的《5 个 Ansible 运维任务》(译文):这是另一个有关于如何使用 Ansible 来管理常见的系统操作任务的文章。这里描述了一系列可以取代命令行操作的 Tower(或 AWX)的案例。
  9. Chris Short 的《Ansible 快速入门指南》是个可以下载的 PDF 文档。它可以作为一本随时拿来翻阅的手册。这篇文章的开头有助于初学者入门。同时,还包括了一些其他的研究领域,比如模块测试、系统管理任务和针对 K8S 对象的管理。
  10. Mark Phillips 的《Ansible 参考指南,带有 Ansible Tower 和 GitHub 的 CI/CD,等等》:这是一篇每月进行总结更新的文章,充满了有趣的链接。话题包括了 Ansible 的基础内容、管理 Netapp 的 E 系列存储产品、调试、打补丁包和其他一些相关内容。文章中还包括了一些视频以及一些聚会的链接。请查看详情。

如果你也有一些你喜爱的 Ansible 文章,那请留言告诉我们吧。


via: https://opensource.com/article/19/12/ansible-resources

作者:James Farrell 选题:lujun9972 译者:BrunoJu 校对:wxy

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

Ansible 是给 Linux 系统管理员使用的出色自动化工具。它是一种开源配置工具,能让系统管理员可以从一个中心节点(即 Ansible 服务器)管理数百台服务器。将 Ansible 与 Puppet、Chef 和 Salt 等类似工具进行比较时,它是首选的配置工具,因为它不需要任何代理,并且可以工作在 SSH 和 python 上。

在本教程中,我们将学习如何在 CentOS 8 和 RHEL 8 系统上安装和使用 Ansble。

Ansible 实验环境信息:

  • 最小化安装的 CentOS 8 / RHEL 8 服务器(192.168.1.10),且有互联网连接
  • 两个 Ansible 节点 - Ubuntu 18.04 LTS (192.168.1.20) 和 CentOS 7 (192.168.1.30)

CentOS 8 上的 Ansible 安装步骤

Ansible 包不在 CentOS 8 默认的软件包仓库中。因此,我们需要执行以下命令启用 EPEL 仓库

[root@linuxtechi ~]$ sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -y

启用 epel 仓库后,执行以下 dnf 命令安装 Ansible:

[root@linuxtechi ~]$ sudo dnf install ansible

上面命令的输出:

dnf-install-ansible-centos8

成功安装 Ansible 后,运行以下命令验证它的版本:

[root@linuxtechi ~]$ sudo ansible --version

Ansible-version-CentOS8

上面的输出确认在 CentOS 8 上安装完成。

让我们看下 RHEL 8 系统。

RHEL 8 上的 Ansible 安装步骤

如果你有有效的 RHEL 8 订阅,请使用以下订阅管理器命令启用 Ansble 仓库:

[root@linuxtechi ~]$ sudo subscription-manager repos --enable ansible-2.8-for-rhel-8-x86_64-rpms

启用仓库后,执行以下 dnf 命令安装 Ansible:

[root@linuxtechi ~]$ sudo dnf install ansible -y

安装 Ansible 及其依赖包后,执行以下命令来验证它的版本:

[root@linuxtechi ~]$ sudo ansible --version

在 CentOS 8 / RHEL 8 上通过 pip3 安装 Ansible 的可选方法

如果你希望使用 pip(Python 的包管理器)安装 Ansible,请首先使用以下命令安装 pyhton3 和 python3-pip 包:

[root@linuxtechi ~]$ sudo dnf install python3 python3-pip -y

安装 python3 后,运行以下命令来验证它的版本:

[root@linuxtechi ~]$ python3 -V
Python 3.6.8
[root@linuxtechi ~]$

用下面的 pip3 命令安装 Ansible:

[root@linuxtechi ~]$ pip3 install ansible --user

输出:

Ansible-Install-pip3-centos8

上面的输出确认 Ansible 已成功使用 pip3 安装。让我们看下如何使用 Ansible。

如何使用 Ansible 自动化工具?

当我们使用 yumdnf 命令安装 Ansible 时,它的配置文件、清单文件和角色目录会自动在 /etc/ansible 文件夹下创建。

让我们添加一个名称为 labservers 的组,并在 /etc/ansible/hosts 文件中给该组添加上述的 Ubuntu 18.04 和 CentOS 7 系统的 IP 地址:

[root@linuxtechi ~]$ sudo vi /etc/ansible/hosts
…
[labservers]
192.168.1.20
192.168.1.30
…

保存并退出文件。

更新清单文件(/etc/ansible/hosts)后,将用户的 ssh 公钥放到属于 labservers 组的远程系统。

让我们首先使用 ssh-keygen 命令生成本地用户的公钥和私钥:

[root@linuxtechi ~]$ ssh-keygen

现在使用以下命令在 Ansible 服务器及其客户端之间交换公钥:

[root@linuxtechi ~]$ ssh-copy-id root@linuxtechi
[root@linuxtechi ~]$ ssh-copy-id root@linuxtechi

现在,让我们尝试几个 Ansible 命令,首先使用 ping 模块验证 Ansible 服务器与客户端的连接:

[root@linuxtechi ~]$ ansible -m ping "labservers"

注意: 如果我们没有在上面的命令中指定清单文件,那么它将引用默认主机文件(即 /etc/ansible/hosts)。

输出:

ansible-ping-module-centos8

让我们使用 Ansible shell 命令检查每个客户端的内核版本:

[root@linuxtechi ~]$ ansible -m command -a "uname -r" "labservers"
192.168.1.30 | CHANGED | rc=0 >>
4.15.0-20-generic
192.168.1.20 | CHANGED | rc=0 >>
3.10.0-327.el7.x86_64
[root@linuxtechi ~]$

使用以下命令列出清单文件中的所有主机:

[root@linuxtechi ~]$ ansible all -i /etc/ansible/hosts --list-hosts
  hosts (4):
    192.168.100.1
    192.168.100.10
    192.168.1.20
    192.168.1.30
[root@linuxtechi ~]$

使用以下 Ansible 命令仅列出 labservers 组中的主机:

root@linuxtechi ~]$ ansible labservers -i /etc/ansible/hosts --list-hosts
  hosts (2):
    192.168.1.20
    192.168.1.30
[root@linuxtechi ~]$

本文就是这些了,我们成功演示了如何在 CentOS 8 和 RHEL 8 系统中安装和使用 Ansible。请分享你的反馈和意见。


via: https://www.linuxtechi.com/install-ansible-centos-8-rhel-8/

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

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

了解如何使用 Ansible 在容器中执行命令。

容器和 Ansible 可以很好地融合在一起:从管理和编排到供应和构建。在本文中,我们将重点介绍构建部分。

如果你熟悉 Ansible,就会知道你可以编写一系列任务,ansible-playbook 命令将为你执行这些任务。你知道吗,如果你编写 Dockerfile 并运行 podman build,你还可以在容器环境中执行此类命令,并获得相同​​的结果。

这是一个例子:

- name: Serve our file using httpd
  hosts: all
  tasks:
  - name: Install httpd
    package:
      name: httpd
      state: installed
  - name: Copy our file to httpd’s webroot
    copy:
      src: our-file.txt
      dest: /var/www/html/

你可以在 Web 服务器本地或容器中执行这个剧本,并且只要你记得先创建 our-file.txt,它就可以工作。

但是这里缺少了一些东西。你需要启动(并配置)httpd 以便提供文件。这是容器构建和基础架构供应之间的区别:构建镜像时,你只需准备内容;而运行容器是另一项任务。另一方面,你可以将元数据附加到容器镜像,它会默认运行命令。

这有个工具可以帮助。试试看 ansible-bender 怎么样?

$ ansible-bender build the-playbook.yaml fedora:30 our-httpd

该脚本使用 ansible-bender 对 Fedora 30 容器镜像执行该剧本,并将生成的容器镜像命名为 our-httpd

但是,当你运行该容器时,它不会启动 httpd,因为它不知道如何操作。你可以通过向该剧本添加一些元数据来解决此问题:

- name: Serve our file using httpd
  hosts: all
  vars:
    ansible_bender:
      base_image: fedora:30
      target_image:
        name: our-httpd
        cmd: httpd -DFOREGROUND
  tasks:
  - name: Install httpd
    package:
      name: httpd
      state: installed
  - name: Listen on all network interfaces.
    lineinfile:    
      path: /etc/httpd/conf/httpd.conf  
      regexp: '^Listen '
      line: Listen 0.0.0.0:80  
  - name: Copy our file to httpd’s webroot
    copy:
      src: our-file.txt
      dest: /var/www/html

现在你可以构建镜像(从这里开始,请以 root 用户身份运行所有命令。目前,Buildah 和 Podman 不会为无 root 容器创建专用网络):

# ansible-bender build the-playbook.yaml
PLAY [Serve our file using httpd] ****************************************************
                                                                                                                                                                             
TASK [Gathering Facts] ***************************************************************    
ok: [our-httpd-20191004-131941266141-cont]

TASK [Install httpd] *****************************************************************
loaded from cache: 'f053578ed2d47581307e9ba3f64f4b4da945579a082c6f99bd797635e62befd0'
skipping: [our-httpd-20191004-131941266141-cont]

TASK [Listen on all network interfaces.] *********************************************
changed: [our-httpd-20191004-131941266141-cont]

TASK [Copy our file to httpd’s webroot] **********************************************
changed: [our-httpd-20191004-131941266141-cont]

PLAY RECAP ***************************************************************************
our-httpd-20191004-131941266141-cont : ok=3    changed=2    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

Getting image source signatures
Copying blob sha256:4650c04b851c62897e9c02c6041a0e3127f8253fafa3a09642552a8e77c044c8
Copying blob sha256:87b740bba596291af8e9d6d91e30a01d5eba9dd815b55895b8705a2acc3a825e
Copying blob sha256:82c21252bd87532e93e77498e3767ac2617aa9e578e32e4de09e87156b9189a0
Copying config sha256:44c6dc6dda1afe28892400c825de1c987c4641fd44fa5919a44cf0a94f58949f
Writing manifest to image destination
Storing signatures
44c6dc6dda1afe28892400c825de1c987c4641fd44fa5919a44cf0a94f58949f
Image 'our-httpd' was built successfully \o/

镜像构建完毕,可以运行容器了:

# podman run our-httpd
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.88.2.106. Set the 'ServerName' directive globally to suppress this message

是否提供文件了?首先,找出你容器的 IP:

# podman inspect -f '{{ .NetworkSettings.IPAddress }}' 7418570ba5a0
10.88.2.106

你现在可以检查了:

$ curl http://10.88.2.106/our-file.txt
Ansible is ❤

你文件内容是什么?

这只是使用 Ansible 构建容器镜像的介绍。如果你想了解有关 ansible-bender 可以做什么的更多信息,请查看它的 GitHub 页面。构建快乐!


via: https://opensource.com/article/19/10/building-container-images-ansible

作者:Tomas Tomecek 选题:lujun9972 译者:geekpi 校对:wxy

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

Conda 将 Ansible 所需的一切都收集到虚拟环境中并将其与其他项目分开。

如果你是一名使用 MacOS 并涉及到 Ansible 管理的 Python 开发人员,你可能希望使用 Conda 包管理器将 Ansible 的工作内容与核心操作系统和其他本地项目分开。

Ansible 基于 Python。要让 Ansible 在 MacOS 上工作,Conda 并不是必须要的,但是它确实让你管理 Python 版本和包依赖变得更加容易。这允许你在 MacOS 上使用升级的 Python 版本,并在你的系统中、Ansible 和其他编程项目之间保持 Python 包的依赖性相互独立。

在 MacOS 上安装 Ansible 还有其他方法。你可以使用 Homebrew,但是如果你对 Python 开发(或 Ansible 开发)感兴趣,你可能会发现在一个独立 Python 虚拟环境中管理 Ansible 可以减少一些混乱。我觉得这更简单;与其试图将 Python 版本和依赖项加载到系统或 /usr/local 目录中 ,还不如使用 Conda 帮助我将 Ansible 所需的一切都收集到一个虚拟环境中,并将其与其他项目完全分开。

本文着重于使用 Conda 作为 Python 项目来管理 Ansible,以保持它的干净并与其他项目分开。请继续阅读,并了解如何安装 Conda、创建新的虚拟环境、安装 Ansible 并对其进行测试。

序幕

最近,我想学习 Ansible,所以我需要找到安装它的最佳方法。

我通常对在我的日常工作站上安装东西很谨慎。我尤其不喜欢对供应商的默认操作系统安装应用手动更新(这是我多年作为 Unix 系统管理的习惯)。我真的很想使用 Python 3.7,但是 MacOS 的 Python 包是旧的 2.7,我不会安装任何可能干扰核心 MacOS 系统的全局 Python 包。

所以,我使用本地 Ubuntu 18.04 虚拟机上开始了我的 Ansible 工作。这提供了真正意义上的的安全隔离,但我很快发现管理它是非常乏味的。所以我着手研究如何在本机 MacOS 上获得一个灵活但独立的 Ansible 系统。

由于 Ansible 基于 Python,Conda 似乎是理想的解决方案。

安装 Conda

Conda 是一个开源软件,它提供方便的包和环境管理功能。它可以帮助你管理多个版本的 Python、安装软件包依赖关系、执行升级和维护项目隔离。如果你手动管理 Python 虚拟环境,Conda 将有助于简化和管理你的工作。浏览 Conda 文档可以了解更多细节。

我选择了 Miniconda Python 3.7 安装在我的工作站中,因为我想要最新的 Python 版本。无论选择哪个版本,你都可以使用其他版本的 Python 安装新的虚拟环境。

要安装 Conda,请下载 PKG 格式的文件,进行通常的双击,并选择 “Install for me only” 选项。安装在我的系统上占用了大约 158 兆的空间。

安装完成后,调出一个终端来查看你有什么了。你应该看到:

  • 在你的家目录中的 miniconda3 目录
  • shell 提示符被修改为 (base)
  • .bash_profile 文件更新了一些 Conda 特有的设置内容

现在基础已经安装好了,你有了第一个 Python 虚拟环境。运行 Python 版本检查可以证明这一点,你的 PATH 将指向新的位置:

(base) $ which python
/Users/jfarrell/miniconda3/bin/python
(base) $ python --version
Python 3.7.1

现在安装了 Conda,下一步是建立一个虚拟环境,然后安装 Ansible 并运行。

为 Ansible 创建虚拟环境

我想将 Ansible 与我的其他 Python 项目分开,所以我创建了一个新的虚拟环境并切换到它:

(base) $ conda create --name ansible-env --clone base
(base) $ conda activate ansible-env
(ansible-env) $ conda env list

第一个命令将 Conda 库克隆到一个名为 ansible-env 的新虚拟环境中。克隆引入了 Python 3.7 版本和一系列默认的 Python 模块,你可以根据需要添加、删除或升级这些模块。

第二个命令将 shell 上下文更改为这个新的环境。它为 Python 及其包含的模块设置了正确的路径。请注意,在 conda activate ansible-env 命令后,你的 shell 提示符会发生变化。

第三个命令不是必须的;它列出了安装了哪些 Python 模块及其版本和其他数据。

你可以随时使用 Conda 的 activate 命令切换到另一个虚拟环境。这将带你回到基本环境:conda base

安装 Ansible

安装 Ansible 有多种方法,但是使用 Conda 可以将 Ansible 版本和所有需要的依赖项打包在一个地方。Conda 提供了灵活性,既可以将所有内容分开,又可以根据需要添加其他新环境(我将在后面演示)。

要安装 Ansible 的相对较新版本,请使用:

(base) $ conda activate ansible-env
(ansible-env) $ conda install -c conda-forge ansible

由于 Ansible 不是 Conda 默认通道的一部分,因此 -c 用于从备用通道搜索和安装。Ansible 现已安装到 ansible-env 虚拟环境中,可以使用了。

使用 Ansible

既然你已经安装了 Conda 虚拟环境,就可以使用它了。首先,确保要控制的节点已将工作站的 SSH 密钥安装到正确的用户帐户。

调出一个新的 shell 并运行一些基本的 Ansible 命令:

(base) $ conda activate ansible-env
(ansible-env) $ ansible --version
ansible 2.8.1
  config file = None
  configured module search path = ['/Users/jfarrell/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /Users/jfarrell/miniconda3/envs/ansibleTest/lib/python3.7/site-packages/ansible
  executable location = /Users/jfarrell/miniconda3/envs/ansibleTest/bin/ansible
  python version = 3.7.1 (default, Dec 14 2018, 13:28:58) [Clang 4.0.1 (tags/RELEASE_401/final)]
(ansible-env) $ ansible all -m ping -u ansible
192.168.99.200 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

现在 Ansible 工作了,你可以在控制台中抽身,并从你的 MacOS 工作站中使用它们。

克隆新的 Ansible 进行 Ansible 开发

这部分完全是可选的;只有当你想要额外的虚拟环境来修改 Ansible 或者安全地使用有问题的 Python 模块时,才需要它。你可以通过以下方式将主 Ansible 环境克隆到开发副本中:

(ansible-env) $ conda create --name ansible-dev --clone ansible-env
(ansible-env) $ conda activte ansible-dev
(ansible-dev) $

需要注意的问题

偶尔你可能遇到使用 Conda 的麻烦。你通常可以通过以下方式删除不良环境:

$ conda activate base
$ conda remove --name ansible-dev --all

如果出现无法解决的错误,通常可以通过在 ~/miniconda3/envs 中找到该环境并删除整个目录来直接删除环境。如果基础环境损坏了,你可以删除整个 ~/miniconda3,然后从 PKG 文件中重新安装。只要确保保留 ~/miniconda3/envs ,或使用 Conda 工具导出环境配置并在以后重新创建即可。

MacOS 上不包括 sshpass 程序。只有当你的 Ansible 工作要求你向 Ansible 提供 SSH 登录密码时,才需要它。你可以在 SourceForge 上找到当前的 sshpass 源代码

最后,基础的 Conda Python 模块列表可能缺少你工作所需的一些 Python 模块。如果你需要安装一个模块,首选命令是 conda install package,但是需要的话也可以使用 pip,Conda 会识别安装的模块。

结论

Ansible 是一个强大的自动化工具,值得我们去学习。Conda 是一个简单有效的 Python 虚拟环境管理工具。

在你的 MacOS 环境中保持软件安装分离是保持日常工作环境的稳定性和健全性的谨慎方法。Conda 尤其有助于升级你的 Python 版本,将 Ansible 从其他项目中分离出来,并安全地使用 Ansible。


via: https://opensource.com/article/19/8/using-conda-ansible-administration-macos

作者:James Farrell 选题:lujun9972 译者:heguangzhi 校对:wxy

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