2021年2月

树莓派已经从主要为黑客和业余爱好者服务,成为了小型生产力工作站的可靠选择。

 title=

在前几年,这个年度系列涵盖了单个的应用。今年,我们除了关注 2021 年的策略外,还将关注一体化解决方案。欢迎来到 2021 年 21 天生产力的第十六天。

树莓派是一台相当棒的小电脑。它体积小,功能却出奇的强大,而且非常容易设置和使用。我曾将它们用于家庭自动化项目、面板和专用媒体播放器。但它也能成为生产力的动力源泉么?

答案相当简单:是的。

Geary and Calendar apps on the Raspberry Pi

Geary 和 Calendar 应用 (Kevin Sonney, CC BY-SA 4.0

基本的 Raspbian 安装包括 Claw Mail,这是一个轻量级的邮件客户端。它的用户界面有点过时了,而且非常的简陋。如果你是一个 Mutt 用户,它可能会满足你的需求。

我更喜欢安装 Geary,因为它也是轻量级的,而且有一个现代化的界面。另外,与 Claws 不同的是,Geary 默认支持富文本 (HTML) 邮件。我不喜欢富文本电子邮件,但它已经成为必要的,所以对它有良好的支持是至关重要的。

默认的 Raspbian 安装不包含日历,所以我添加了 GNOME 日历 ,因为它可以与远程服务通信(因为我的几乎所有日历都在云提供商那里)。

GTG and GNote open on Raspberry Pi

GTG 和 GNote(Kevin Sonney, CC BY-SA 4.0

那笔记和待办事项清单呢?有很多选择,但我喜欢用 GNote 来做笔记,用 Getting-Things-GNOME! 来做待办事项。两者都相当轻量级,并且可以相互同步,也可以同步到其他服务。

你会注意到,我在这里使用了不少 GNOME 应用。为什么不直接安装完整的 GNOME 桌面呢?在内存为 4Gb(或 8Gb)的树莓派 4 上,GNOME 工作得很好。你需要采取一些额外的步骤来禁用 Raspbian 上的默认 wifi 设置,并用 Network Manager 来代替它,但这个在网上有很好的文档,而且真的很简单。

GNOME 中包含了 Evolution,它将邮件、日历、笔记、待办事项和联系人管理整合到一个应用中。与 Geary 和 GNOME Calendar 相比,它有点重,但在树莓派 4 上却很稳定。这让我很惊讶,因为我习惯了 Evolution 有点消耗资源,但树莓派 4 却和我的品牌笔记本一样运行良好,而且资源充足。

Evolution on Raspbian

Raspbian 上的 Evolution (Kevin Sonney, CC BY-SA 4.0

树莓派在过去的几年里进步很快,已经从主要为黑客和业余爱好者服务,成为了小型生产力工作站的可靠选择。


via: https://opensource.com/article/21/1/raspberry-pi-productivity

作者:Kevin Sonney 选题:lujun9972 译者:geekpi 校对:wxy

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

保留简略的版权声明即可,无需投入过多资源维护。

版权声明 Copyright Notice 在源代码中的应用并不一致且维护不善,结果导致它无法成为良好的信息来源。那是否应该投入更多资源来维护版权声明呢?答案是不需要。

版权声明是单行字符串,通常包括单词“版权”(或某些替代词,如 ©)、名称(通常是个人或公司)和年份。

在本文中,我不关注许可证或许可证声明(有时可能包括版权声明)。我关于版权声明维护的资源投入应该保持低优先级的建议不适用于许可证信息。许可证信息应清晰呈现并保持准确。如果你邀请其他人使用你的软件并对其进行操作,请通过提供并维护清晰的许可证信息来明确其授予的权限。

再说回版权声明:它们的法律意义是什么呢?如果你认为版权声明符合法律要求或至少提供了重要的法律权益,请三思。此类声明在开源软件中的法律意义是如此之小,以至于人们可以轻易地找到超出其法律意义的实际做法。

尽管此类声明可能看起来很重要,但它们在当今源代码中的存在很大程度上是过去美国版权法的残余影响。曾经有一段时间,如果未在已出版的材料中包含版权声明,依据美国版权法,版权人可能会完全丧失权利;当美国最终加入《伯尔尼公约》并成为缔约国时,情况发生了变化(美国于 1988 年 11 月 16 日加入该条约,并于 1989 年 3 月 1 日在美国生效)。

如果开源软件中的此类声明要想具备实效,则一个项目可以采用能够以更少的投入来维护并且仍然获得一些实用价值的约定,不必为了满足美国对“版权声明”的法定要求而去维护版权声明。

由于美国版权法一直是推动版权声明使用的重要因素,因此我将在此进行更深入的探讨。美国版权局发布了名为《通函-3号-版权声明》的指导文件,包括:

“在 1989 3 1 日之前首次出版的所有作品都必须放置版权声明,但下面讨论的某些情况例外。如果省略了该声明或在使用该声明时出现了错误,则通常该作品在美国将失去版权保护。版权声明对于 1989 3 1 日或之后出版的作品、未出版的作品和外国作品是可选的;但是,将版权声明包括在你的作品中将享有法律权益。”

上面我加粗强调的那句话清楚地表明,在 1988 年的美国,版权声明就非常重要。但是,当美国与其他许多国家一起加入《伯尔尼公约》时,美国法律对版权声明的关键作用被消除了。公约规定:“享有和行使这些权利不需经过任何手续……”

麻省理工学院的软件项目(The X Window System)和加州大学伯克利分校的软件项目(Berkeley Software Distribution)中诞生了早期的开源许可证文本,彼时严格的“放置版权声明否则丧失权利”要求仍然有效(或至少在为这些许可证文本做出贡献的人们心中是明确的)。诞生于这种时机的结果是,许可证文本中仍存在有关复制版权声明的明确描述。

随着基于早期文本的许可证的继续广泛使用,大多数开源软件开发人员已经看到,版权声明似乎在许可证中显得很重要。但是这些文本是在考虑较早的法律制度的情况下创建的。现在,距《伯尔尼公约》(大多数其他国家已经接受)的“无需手续性要求”规定首次适用于美国的时间已经过去 30 年了。要了解《伯尔尼公约》的通过程度,请参阅管理该公约的世界知识产权组织维护的缔约方清单

你可能想知道上面引用中提到的那些“法律权益”具体指什么,答案在 3 号通函的末尾:

尽管对于未出版的作品、外国作品或于1989年3月1日或之后出版的作品,版权声明是可选的,但使用版权声明具有以下好处:

  • 版权声明使潜在用户意识到该作品拥有版权。
  • 对于已发表的作品,版权声明可能会阻止版权侵权诉讼中的被告试图减轻其基于无辜侵权辩护的损害赔偿或禁令救济的责任。
  • 版权声明标识了在首次发布作品时版权所有者的权利,供寻求使用该作品的许可方使用。
  • 版权声明标识首次出版的年份,对于匿名作品、假名作品或出租作品而言,可用于确定版权保护期限。
  • 版权声明可能会通过标识版权所有者并设定版权期限来防止其成为孤儿作品。

上面就是所谓的那些“法律权益”。

我引用了美国版权局第 3 号通函,因为与基本法规相比,它对要求的措辞更具可读性。美国联邦一级的成文法被编入所谓的《美国法典》,该法典被组织为一组 “卷” Title 。第 17 卷是版权。版权声明的详细信息位于该卷的第 401-406 部分。可以从 17 USC 401 开始。在版权声明中需包含三个要素描述的有关法规要求,请参见 17 USC 401(b)。如果要查看“疏忽对无辜侵权者的影响”的详细信息,请参见 17 USC 405(b)

为了提供更准确的信息,为什么不清理代码库中的版权声明?尴尬的是,17 USC 506(c)(欺诈性版权声明)17 USC 506(d)(欺诈性删除版权声明)17 USC 1202(a)(虚假版权管理信息)提供了一些不利因素(即使仅限于不良意图)。由于价值较低且存在一定风险(如果在进行更改时出错),因此难怪没有更多资源用于维护版权声明。

有些人和一些公司强调将详细的版权声明放入根据开源许可证提供的代码中。其他人则没有。随着开源项目的发展,某些贡献中可能包含版权声明,而其他贡献则没有。即使文件的内容与原始版本相比发生了很大的变化,文件也可以包含原始版权声明,而不包含其他版权声明。或者以后的贡献者可以向以前没有版权声明的文件中添加一个版权声明。那作为版权声明要素的“该作品的首次出版年份”呢?这意味着什么?不同的人有不同的做法。已更新?那其他贡献提交之后呢?

至于从挖掘版权声明数据中得出结论,要谨慎。期望值不要那么高。

那开源项目应该怎么做呢?

请提供并维护清晰、准确的许可证信息。

对于版权声明来说,很难证明为维护版权声明的详细信息而进行的投入是合理的。但是有些人可能希望会出现版权声明。至于“软件的起源”,也许仅仅参考项目本身而不是尝试捕获更细粒度的内容可能会更有用和更准确。公开年份?手动维护源文件中的麻烦程度导致其不大值得;源管理工具以较低的资源成本提供了更准确的信息。

有关实用方法的更多详细信息,我建议你将注意力集中在对版权声明实践的重新思考上,可以参考 Steve Winslow 于 2020 年 1 月 10 日发布的《开源软件项目中的版权声明》。


作者简介:Scott Peterson 是红帽公司(Red Hat)法律团队成员。很久以前,一位工程师就一个叫做 GPL 的奇怪文件向 Scott 征询法律建议,这个致命的问题让 Scott 走上了探索包括技术标准和开源软件在内的协同开发法律问题的纠结之路。

译者简介:薛亮,集慧智佳知识产权咨询公司互联网事业部总监,擅长专利检索、专利分析、竞争对手跟踪、FTO 分析、开源软件知识产权风险分析,致力于为互联网企业、高科技公司提供知识产权咨询服务。

本文是 Python 之禅特殊系列的一部分,重点是第十二、十三和十四原则:模糊性和明确性的作用。

 title=

最小惊喜原则是设计用户界面时的一个 准则。它是说,当用户执行某项操作时,程序执行的事情应该使用户尽量少地感到意外。这和孩子们喜欢一遍又一遍地读同一本书的原因是一样的:没有什么比能够预测并让预测成真更让人欣慰的了。

在开发 ABC 语言)(Python 的灵感来源)的过程中,一个重要的见解是,编程设计是用户界面,需要使用与 UI 设计者相同的工具来设计。值得庆幸的是,从那以后,越来越多的语言采用了 UI 设计中的 可承受性 affordance 人体工程学 ergonomics 的概念,即使它们的应用并不严格。

这就引出了 Python 之禅 中的三个原则。

面对歧义,要拒绝猜测的诱惑 In the face of ambiguity, refuse the temptation to guess

1 + "1" 的结果应该是什么? "11"2 都是猜测。这种表达方式是歧义的:无论如何做都会让一些人感到惊讶。

一些语言选择猜测。在 JavaScript 中,结果为 "11"。在 Perl 中,结果为 2。在 C 语言中,结果自然是空字符串。面对歧义,JavaScript、Perl 和 C 都在猜测。

在 Python 中,这会引发 TypeError:这不是能忽略的错误。捕获 TypeError 是非典型的:它通常将终止程序或至少终止当前任务(例如,在大多数 Web 框架中,它将终止对当前请求的处理)。

Python 拒绝猜测 1 + "1" 的含义。程序员必须以明确的意图编写代码:1 + int("1"),即 2;或者 str(1) + "1",即 "11";或 "1"[1:],这将是一个空字符串。通过拒绝猜测,Python 使程序更具可预测性。

尽量找一种,最好是唯一一种明显的解决方案 There should be one—and preferably only one—obvious way to do it

预测也会出现偏差。给定一个任务,你能预知要实现该任务的代码吗?当然,不可能完美地预测。毕竟,编程是一项具有创造性的任务。

但是,不必有意提供多种冗余方式来实现同一目标。从某种意义上说,某些解决方案或许 “更好” 或 “更 Python 化 Pythonic ”。

对 Python 美学欣赏部分是因为,可以就哪种解决方案更好进行健康的辩论。甚至可以持不同观点而继续编程。甚至为使其达成一致,接受不同意的观点也是可以的。但在这一切之下,必须有一种这样的认识,即正确的解决方案终将会出现。我们必须希望,通过商定实现目标的最佳方法,而最终达成真正的一致。

虽然这种方式一开始可能并不明显(除非你是荷兰人) Although that way may not be obvious at first (unless you're Dutch)

这是一个重要的警告:首先,实现任务的最佳方法往往明显。观念在不断发展。Python 也在进化。逐块读取文件的最好方法,可能要等到 Python 3.8 时使用 walrus 运算符:=)。

逐块读取文件这样常见的任务,在 Python 存在近 30年 的历史中并没有 “唯一的最佳方法”。

当我在 1998 年从 Python 1.5.2 开始使用 Python 时,没有一种逐行读取文件的最佳方法。多年来,知道字典中是否有某个键的最佳方法是使用关键字 .haskey,直到 in 操作符出现才发生改变。

只是要意识到找到实现目标的一种(也是唯一一种)方法可能需要 30 年的时间来尝试其它方法,Python 才可以不断寻找这些方法。这种历史观认为,为了做一件事用上 30 年是可以接受的,但对于美国这个存在仅 200 多年的国家来说,人们常常会感到不习惯。

从 Python 之禅的这一部分来看,荷兰人,无论是 Python 的创造者 Guido van Rossum 还是著名的计算机科学家 Edsger W. Dijkstra,他们的世界观是不同的。要理解这一部分,某种程度的欧洲人对时间的感受是必不可少的。


via: https://opensource.com/article/19/12/zen-python-consistency

作者:Moshe Zadka 选题:lujun9972 译者:stevenzdg988 校对:wxy

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

阿里云成立十一年来首次盈利

报道,2 月 2 日晚间,阿里巴巴发布了 2021 财年第三季度(也就是自然年 2020 年第四季度)财报,云计算业务收入同比增长 50% 至人民币 161.15 亿元,调整后息税折旧摊销前利润为 2400 万元人民币。这是阿里云首次实现了盈利。而 2019 年同期亏损 3.56 亿元人民币。

作为国内最早投入的云服务商,阿里云曾连续多年在阿里内部拿到低绩效。但在阿里的大力支持下,阿里云成为国内乃至亚洲市场份额第一的云服务商。终于在 11 年之后,守得云开日出,实现了盈亏平衡!阿里云加油!

互联网安全研究小组准备用 Rust 重写 Apache 的 SSL/TLS 模块

作为 Let's Encrypt 加密倡议的发起者之一,互联网安全研究小组(ISRG)刚刚宣布,他们将使用 Rustles 库取代 OpenSSL,为 httpd 重写一个新的 TLS 模块(mod-tls),并希望在将来可以取代 Apache httpd 默认使用的 mod\_ssl。

经历了十年的发展,Rust 编程语言已经变得相当成熟,默认情况下仅允许编译内存安全型的应用程序。这一宣布得到了 Apache httpd 联合创始人的支持:“我意识到这项重大改进可对许多人提供保护,并且能够让 httpd 在不久的将来继续发光发热。”

在关键性的基础设施方面,Rust 已经展现出了取代 C 语言的潜力。有志于从事基础软件开发的同学,可以考虑尽快学习和使用 Rust 进行开发了。

Linux 恶意软件 Kobalos 可利用 OpenSSH 软件后门窃取证书

ESET警告称,一款被挂有木马的 OpenSSH 软件,被用于从 HPC 高性能计算集群中窃取 SSH 证书。它渗透了一些主要目标,包括美国政府、欧洲大学、以及亚洲某些大型 ISP 的系统,受害者主要集中在大型系统和超级计算机领域。除了 Linux、FreeBSD 和 Solaris,安全专家还发现了能够在 AIX、甚至 Windows 平台上运行的恶意软件变种的蛛丝马迹。

无论是否是因为这个恶意软件,都建议为 SSH 服务器连接同时启用双因素身份验证。

在多个手写和数字平台上整理笔记是一个严峻的挑战。这里有一个小技巧,可以更好地组织你的笔记,并快速找到你需要的东西。

 title=

在前几年,这个年度系列涵盖了单个的应用。今年,我们除了关注 2021 年的策略外,还将关注一体化解决方案。欢迎来到 2021 年 21 天生产力的第十五天。

保持生产力也意味着(在某种程度上)要有足够的组织能力,以便找到笔记并在需要时参考它们。这不仅是对我自己的挑战,也是与我交谈的很多人的挑战。

多年来,我在应用中单独或使用数字笔记、纸质笔记、便签、数字便签、Word 文档、纯文本文件以及一堆我忘记的其他格式的组合。这不仅让寻找笔记变得困难,而且知道把它们放在哪里是一个更大的挑战。

Stacks of paper notes on a desk

一堆笔记 (Jessica Cherry, CC BY-SA 4.0

还有就是做笔记最重要的一点:如果你以后找不到它,笔记就没有任何价值。知道含有你所需信息的笔记存在于你保存笔记的某处,根本没有任何帮助。

我是如何为自己解决这个问题的呢?正如他们所说,这是一个过程,我希望这也是一个对其他人有效的过程。

我首先看了看自己所做的笔记种类。不同的主题需要用不同的方式保存吗?由于我为我的播客手写笔记,而几乎所有其他的东西都使用纯文本笔记,我需要两种不同的方式来维护它们。对于手写的笔记,我把它们都放在一个文件夹里,方便我参考。

Man holding a binder full of notes

三年多的笔记 (Kevin Sonney, CC BY-SA 4.0

为了保存我的数字笔记,我需要将它们全部集中到一个地方。这个工具需要能够从多种设备上访问,具有有用的搜索功能,并且能够导出或共享我的笔记。在尝试了很多很多不同的选项之后,我选择了 Joplin。Joplin 可以让我用 Markdown 写笔记,有一个相当不错的搜索功能,有适用于所有操作系统(包括手机)的应用,并支持几种不同的设备同步方式。另外,它还有文件夹标签,因此我可以按照对我有意义的方式将笔记分组。

Organized Joplin notes management page

我的 Joplin

我花了一些时间才把所有的东西都放在我想要的地方,但最后,这真的是值得的。现在,我可以找到我所做的笔记,而不是让它们散落在我的办公室、不同的机器和各种服务中。


via: https://opensource.com/article/21/1/notes-joplin

作者:Kevin Sonney 选题:lujun9972 译者:geekpi 校对:wxy

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

一名系统管理员分享了如何使用 Ansible 在网络中配置计算机并把其带入实际工作的信息和建议。

 title=

无论是第一次还是第五十次,启动并运行一台新的物理或虚拟计算机都非常耗时,而且需要大量的工作。多年来,我一直使用我创建的一系列脚本和 RPM 来安装所需的软件包,并为我喜欢的工具配置各种选项。这种方法效果很好,简化了我的工作,而且还减少了在键盘上输入命令的时间。

我一直在寻找更好的工作方式。近几年来,我一直在听到并且读到有关 Ansible 的信息,它是一个自动配置和管理系统的强大工具。Ansible 允许系统管理员在一个或多个 剧本 playbook 中为每个主机指定一个特定状态,然后执行各种必要的任务,使主机进入该状态。这包括安装或删除各种资源,例如 RPM 或 Apt 软件包、配置文件和其它文件、用户、组等等。

因为一些琐事,我推迟了很长一段时间学习如何使用它。直到最近,我遇到了一个我认为 Ansible 可以轻松解决的问题。

这篇文章并不会完整地告诉你如何入门 Ansible,相反,它只是对我遇到的问题和我在一些隐秘的地方发现的信息的做了一些记录。我在各种在线讨论和问答小组中找到的有关 Ansible 的许多信息都是错误的。错误范围包括明显的老旧信息(没有任何日期或来源的迹象),还有一些是完全错误的信息。

本文所介绍的内容是有用的,尽管可能还有其它方法可以完成相同的事情,但我使用的是 Ansible 2.9.13 和 Python 3.8.5。

我的问题

我所有的最佳学习经历都始于我需要解决的问题,这次也不例外。

我一直在做一个小项目,修改 Midnight Commander 文件管理器的配置文件,并将它们推送到我网络上的各种系统中进行测试。尽管我有一个脚本可以自动执行这个操作,但它仍然需要使用命令行循环来提供我想要推送新代码的系统名称。我对配置文件进行了大量的更改,这使我必须频繁推送新的配置文件。但是,就在我以为我的新配置刚刚好时,我发现了一个问题,所以我需要在修复后再进行一次推送。

这种环境使得很难跟踪哪些系统有新文件,哪些没有。我还有几个主机需要区别对待。我对 Ansible 的一点了解表明,它可能能够满足我的全部或大部分工作。

开始

我读过许多有关 Ansible 的好文章和书籍,但从来没有在“我必须现在就把这个做好!”的情况下读过。而现在 —— 好吧,就是现在!

在重读这些文档时,我发现它们主要是在讨论如何从 GitHub 开始安装并使用 Ansible,这很酷。但是我真的只是想尽快开始,所以我使用 DNF 和 Fedora 仓库中的版本在我的 Fedora 工作站上安装了它,非常简单。

但是后来我开始寻找文件位置,并尝试确定需要修改哪些配置文件、将我的剧本保存在什么位置,甚至一个剧本怎么写以及它的作用,我脑海中有一大堆(到目前为止)悬而未决的问题。

因此,不不需要进一步描述我的困难的情况下,以下是我发现的东西以及促使我继续前进的东西。

配置

Ansible 的配置文件保存在 /etc/ansible 中,这很有道理,因为 /etc/ 是系统程序应该保存配置文件的地方。我需要使用的两个文件是 ansible.cfghosts

ansible.cfg

在进行了从文档和线上找到的一些实践练习之后,我遇到了一些有关弃用某些较旧的 Python 文件的警告信息。因此,我在 ansible.cfg 中将 deprecation_warnings 设置为 false,这样那些愤怒的红色警告消息就不会出现了:

deprecation_warnings = False

这些警告很重要,所以我稍后将重新回顾它们,并弄清楚我需要做什么。但是现在,它们不会再扰乱屏幕,也不会让我混淆实际上需要关注的错误。

hosts 文件

/etc/hosts 文件不同,hosts 文件也被称为 清单 inventory 文件,它列出了网络上的主机。此文件允许将主机分组到相关集合中,例如“servers”、“workstations”和任何你所需的名称。这个文件包含帮助和大量示例,所以我在这里就不详细介绍了。但是,有些事情你必须知道。

主机也可以列在组之外,但是组对于识别具有一个或多个共同特征的主机很有帮助。组使用 INI 格式,所以服务器组看起来像这样:

[servers]
server1
server2
......

这个文件中必须有一个主机名,这样 Ansible 才能对它进行操作。即使有些子命令允许指定主机名,但除非主机名在 hosts 文件中,否则命令会失败。一个主机也可以放在多个组中。因此,除了 [servers] 组之外,server1 也可能是 [webservers] 组的成员,还可以是 [ubuntu] 组的成员,这样以区别于 Fedora 服务器。

Ansible 很智能。如果 all 参数用作主机名,Ansible 会扫描 hosts 文件并在它列出的所有主机上执行定义的任务。Ansible 只会尝试在每个主机上工作一次,不管它出现在多少个组中。这也意味着不需要定义 all 组,因为 Ansible 可以确定文件中的所有主机名,并创建自己唯一的主机名列表。

另一件需要注意的事情是单个主机的多个条目。我在 DNS 文件中使用 CNAME 记录来创建别名,这些别名指向某些主机的 A 记录,这样,我可以将一个主机称为 host1h1myhost。如果你在 hosts 文件中为同一主机指定多个主机名,则 Ansible 将尝试在所有这些主机名上执行其任务,它无法知道它们指向同一主机。好消息是,这并不会影响整体结果;它只是多花了一点时间,因为 Ansible 会在次要主机名上工作,它会确定所有操作均已执行。

Ansible 实情

我阅读过 Ansible 的大多数材料都谈到了 Ansible 实情 facts ,它是与远程系统相关的数据,包括操作系统、IP 地址、文件系统等等。这些信息可以通过其它方式获得,如 lshwdmidecode/proc 文件系统等。但是 Ansible 会生成一个包含此信息的 JSON 文件。每次 Ansible 运行时,它都会生成这些实情数据。在这个数据流中,有大量的信息,都是以键值对形式出现的:<"variable-name": "value">。所有这些变量都可以在 Ansible 剧本中使用,理解大量可用信息的最好方法是实际显示一下:

# ansible -m setup <hostname> | less

明白了吗?你想知道的有关主机硬件和 Linux 发行版的所有内容都在这里,它们都可以在剧本中使用。我还没有达到需要使用这些变量的地步,但是我相信在接下来的几天中会用到。

模块

上面的 ansible 命令使用 -m 选项来指定 setup 模块。Ansible 已经内置了许多模块,所以你对这些模块不需要使用 -m。也可以安装许多下载的模块,但是内置模块可以完成我目前项目所需的一切。

剧本

剧本 playbook 几乎可以放在任何地方。因为我需要以 root 身份运行,所以我将它放在了 /root/ansible 下。当我运行 Ansible 时,只要这个目录是当前的工作目录(PWD),它就可以找到我的剧本。Ansible 还有一个选项,用于在运行时指定不同的剧本和位置。

剧本可以包含注释,但是我看到的文章或书籍很少提及此。但作为一个相信记录一切的系统管理员,我发现使用注释很有帮助。这并不是说在注释中做和任务名称同样的事情,而是要确定任务组的目的,并确保我以某种方式或顺序记录我做这些事情的原因。当我可能忘记最初的想法时,这可以帮助以后解决调试问题。

剧本只是定义主机所需状态的任务集合。在剧本的开头指定主机名或清单组,并定义 Ansible 将在其上运行剧本的主机。

以下是我的一个剧本示例:

################################################################################
# This Ansible playbook updates Midnight commander configuration files.        #
################################################################################
- name: Update midnight commander configuration files
  hosts: all
 
  tasks:
  - name: ensure midnight commander is the latest version
    dnf:
      name: mc
      state: present

  - name: create ~/.config/mc directory for root
    file:
      path: /root/.config/mc
      state: directory
      mode: 0755
      owner: root
      group: root

  - name: create ~/.config/mc directory for dboth
    file:
      path: /home/dboth/.config/mc
      state: directory
      mode: 0755
      owner: dboth
      group: dboth

  - name: copy latest personal skin
    copy:
      src: /root/ansible/UpdateMC/files/MidnightCommander/DavidsGoTar.ini
      dest: /usr/share/mc/skins/DavidsGoTar.ini
      mode: 0644
      owner: root
      group: root

  - name: copy latest mc ini file
    copy:
      src: /root/ansible/UpdateMC/files/MidnightCommander/ini
      dest: /root/.config/mc/ini
      mode: 0644
      owner: root
      group: root

  - name: copy latest mc panels.ini file
    copy:
      src: /root/ansible/UpdateMC/files/MidnightCommander/panels.ini
      dest: /root/.config/mc/panels.ini
      mode: 0644
      owner: root
      group: root
<截断>

剧本从它自己的名字和它将要操作的主机开始,在本文中,所有主机都在我的 hosts 文件中。tasks 部分列出了使主机达到所需状态的特定任务。这个剧本从使用 DNF 更新 Midnight Commander 开始(如果它不是最新的版本的话)。下一个任务确保创建所需的目录(如果它们不存在),其余任务将文件复制到合适的位置,这些 filecopy 任务还可以为目录和文件设置所有权和文件模式。

剧本细节超出了本文的范围,但是我对这个问题使用了一点蛮力。还有其它方法可以确定哪些用户需要更新文件,而不是对每个用户的每个文件使用一个任务。我的下一个目标是简化这个剧本,使用一些更先进的技术。

运行剧本很容易,只需要使用 ansible-playbook 命令。.yml 扩展名代表 YAML,我看到过它的几种不同含义,但我认为它是“ 另一种标记语言 Yet Another Markup Language ”,尽管有些人声称 YAML 不是这种语言。

这个命令将会运行剧本,它会更新 Midnight Commander 文件:

# ansible-playbook -f 10 UpdateMC.yml

-f 选项指定 Ansible 使用 10 个线程来执行操作。这可以大大加快整个任务的完成速度,特别是在多台主机上工作时。

输出

剧本运行时会列出每个任务和执行结果。ok 代表任务管理的机器状态已经完成,因为在任务中定义的状态已经为真,所以 Ansible 不需要执行任何操作。

changed 表示 Ansible 已经执行了指定的任务。在这种情况下,任务中定义的机器状态不为真,所以执行指定的操作使其为真。在彩色终端上,TASK 行会以彩色显示。我的终端配色为“amber-on-black”,TASK 行显示为琥珀色,changed 是棕色,ok 为绿色,错误是红色。

下面的输出是我最终用于在新主机执行安装后配置的剧本:

PLAY [Post-installation updates, package installation, and configuration]

TASK [Gathering Facts]
ok: [testvm2]

TASK [Ensure we have connectivity]
ok: [testvm2]

TASK [Install all current updates]
changed: [testvm2]

TASK [Install a few command line tools]
changed: [testvm2]

TASK [copy latest personal Midnight Commander skin to /usr/share]
changed: [testvm2]

TASK [create ~/.config/mc directory for root]
changed: [testvm2]

TASK [Copy the most current Midnight Commander configuration files to /root/.config/mc]
changed: [testvm2] =&gt; (item=/root/ansible/PostInstallMain/files/MidnightCommander/DavidsGoTar.ini)
changed: [testvm2] =&gt; (item=/root/ansible/PostInstallMain/files/MidnightCommander/ini)
changed: [testvm2] =&gt; (item=/root/ansible/PostInstallMain/files/MidnightCommander/panels.ini)

TASK [create ~/.config/mc directory in /etc/skel]
changed: [testvm2]

<截断>

cowsay

如果你的计算机上安装了 cowsay 程序,你会发现 TASK 的名字出现在奶牛的语音泡泡中:

 ____________________________________
< TASK [Ensure we have connectivity] >
 ------------------------------------
        \   ^__^
         \  (oo)\\_______
            (__)\       )\/\
                ||----w |
                ||     ||

如果你没有这个有趣的程序,你可以使用发行版的包管理器安装 Cowsay 程序。如果你有这个程序但不想要它,可以通过在 /etc/ansible/ansible.cfg 文件中设置 nocows=1 将其禁用。

我喜欢这头奶牛,它很有趣,但是它会占用我的一部分屏幕。因此,在它开始妨碍我使用时,我就把它禁用了。

目录

与我的 Midnight Commander 任务一样,经常需要安装和维护各种类型的文件。创建用于存储剧本的目录树的“最佳实践”和系统管理员一样多,至少与编写有关 Ansible 书和文章的作者数量一样多。

我选择了一个对我有意义的简单结构:

/root/ansible
└── UpdateMC
    ├── files
    │   └── MidnightCommander
    │       ├── DavidsGoTar.ini
    │       ├── ini
    │       └── panels.ini
    └── UpdateMC.yml

你可以使用任何结构。但是请注意,其它系统管理员可能需要使用你设置的剧本来工作,所以目录应该具有一定程度的逻辑。当我使用 RPM 和 Bash 脚本执行安装任务后,我的文件仓库有点分散,绝对没有任何逻辑结构。当我为许多管理任务创建剧本时,我将介绍一个更有逻辑的结构来管理我的目录。

多次运行剧本

根据需要或期望多次运行剧本是安全的。只有当主机状态与任务中指定的状态不匹配时,才会执行每个任务。这使得很容易从先前的剧本运行中遇到的错误中恢复。因为当剧本遇到错误时,它将停止运行。

在测试我的第一个剧本时,我犯了很多错误并改正了它们。假设我的修正正确,那么剧本每次运行,都会跳过那些状态已与指定状态匹配的任务,执行不匹配状态的任务。当我的修复程序起作用时,之前失败的任务就会成功完成,并且会执行此任务之后的任务 —— 直到遇到另一个错误。

这使得测试变得容易。我可以添加新任务,并且在运行剧本时,只有新任务会被执行,因为它们是唯一与测试主机期望状态不匹配的任务。

一些思考

有些任务不适合用 Ansible,因为有更好的方法可以实现特定的计算机状态。我想到的场景是使 VM 返回到初始状态,以便可以多次使用它来执行从已知状态开始的测试。让 VM 进入特定状态,然后对此时的计算机状态进行快照要容易得多。还原到该快照与 Ansible 将主机返回到之前状态相比,通常还原到快照通常会更容易且更快。在研究文章或测试新代码时,我每天都会做几次这样的事情。

在完成用于更新 Midnight Commander 的剧本之后,我创建了一个新的剧本,用于在新安装的 Fedora 主机上执行安装任务。我已经取得了不错的进步,剧本比我第一个的更加复杂,但没有那么粗暴。

在使用 Ansible 的第一天,我创建了一个解决问题的剧本,我还开始编写第二个剧本,它将解决安装后配置的大问题,在这个过程中我学到了很多东西。

尽管我真的很喜欢使用 Bash 脚本来管理任务,但是我发现 Ansible 可以完成我想要的一切,并且可以使系统保持在我所需的状态。只用了一天,我就成为了 Ansible 的粉丝。

资源

我找到的最完整、最有用的参考文档是 Ansible 网站上的用户指南。本文仅供参考,不作为入门文档。

多年来,我们已经发布了许多有关 Ansible 的文章,我发现其中大多数对我的需求很有帮助。Enable Sysadmin 网站上也有很多对我有帮助 Ansible 文章。你可以通过查看本周(2020 年 10 月 13 日至 14 日)的 AnsibleFest 了解更多信息。该活动完全是线上的,可以免费注册。


via: https://opensource.com/article/20/10/first-day-ansible

作者:David Both 选题:lujun9972 译者:MjSeven 校对:wxy

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