二维码

Ansible:使事情发生

1288 人阅读 | 时间:2020年01月03日 14:05

最后,一个像sysadmin一样的自动化框架。Ansible,您已被录用。

上一篇文章中,我描述了如何配置服务器和客户端,以便可以从服务器连接到每个客户端。Ansible是基于推送的自动化工具,因此连接是从“服务器”启动的,“服务器”通常只是工作站或ssh从工作站连接到的服务器。在本文中,我将说明模块的工作方式以及如何从命令行在临时模式下使用Ansible。

Ansible可以简化您的工作,因此您需要学习的第一件事是如何完成熟悉的任务。对于大多数系统管理员来说,这意味着一些简单的命令行工作。在命令行实用程序方面,Ansible有一些怪癖,但是值得学习细微差别,因为它构成了功能强大的系统。

命令模块

这是在客户端计算机上执行远程命令的最安全的模块。与大多数Ansible模块一样,它要求在客户端上安装Python,仅此而已。当Ansible使用命令模块执行命令时,它不会通过用户的外壳处理这些命令。这意味着某些变量$HOME不可用。这也意味着流功能(重定向,管道)不起作用。如果您不需要重定向输出或将用户的主目录引用为shell变量,则可以使用命令模块。要在临时模式下调用命令模块,请执行以下操作:

ansible host_or_groupname -m command -a "whoami"

您的输出应SUCCESS针对所引用的每个主机显示,然后返回该用户用于登录的用户名。您会注意到该用户不是root用户,除非您是用于连接到客户端计算机的用户。

如果要查看提升权限的用户,则可以在ansible命令中添加另一个参数 您可以添加 -b以“成为”提升的用户(或sudo用户)。因此,如果要使用“ -b”标志运行与上述相同的命令:

ansible host_or_groupname -b -m command -a "whoami"

您应该会看到类似的结果,但是whoami 结果应该显示root 而不是您用来连接的用户。使用该标志很重要,尤其是在您尝试运行需要root用户访问权限的远程命令时!

外壳模块

使用Shell模块执行远程命令没有错。重要的是要知道,由于它使用了远程用户的环境,因此如果用户的帐户有点麻烦,它可能会导致命令模块避免的问题。但是,如果您使用Shell模块,则可以使用重定向和管道。您可以使用该whoami示例来查看差异。该命令:

ansible host_or_groupname -m command -a "whoami > myname.txt"

应该导致关于>不是有效参数的错误由于命令模块不在任何外壳程序中运行,因此它将大于字符解释为您要传递给 whoami 命令的内容。但是,如果您使用命令行管理程序模块,则不会出现问题:

ansible host_or_groupname -m shell -a "whom > myname.txt"

这应该执行并SUCCESS为每个主机提供一条消息,但是应该不返回任何输出。但是,在远程计算机上,用户的主目录中应该有一个名为myname.txt的文件,其中包含用户名。我的个人政策是尽可能使用命令模块,并在需要时使用外壳模块。

原始模块

在功能上,原始模块的工作方式类似于外壳模块。关键的区别是,Ansible没有做任何错误检查,并且 STDERR, STDOUTReturn Code返回。除此之外,Ansible不知道会发生什么,因为它只是直接通过SSH执行命令。因此,尽管Shell模块默认情况下将使用/ bin / sh,但是Raw模块仅使用用户个人默认外壳程序可能使用的任何内容。

为什么人会决定使用Raw模块?它根本不需要远程计算机上的Python。尽管大多数服务器默认都安装了Python,或者很容易安装了Python,但是许多嵌入式设备都没有也不能安装Python。对于大多数配置管理工具,未安装代理程序意味着无法管理远程设备。使用Ansible,如果仅使用SSH,您仍然可以使用Raw模块执行远程命令。我使用Raw模块来管理嵌入式环境非常少的比特币矿工。它是一个强大的工具,当您需要时,它是无价的!

复制模块

尽管当然可以使用命令和命令行管理模块进行文件和文件夹操作,但是Ansible包括一个专门用于将文件复制到服务器的模块。即使需要学习用于复制文件的新语法,我还是喜欢使用它,因为Ansible会检查文件是否存在以及是否相同。这意味着它仅在需要时才复制文件,从而节省了时间和带宽。它甚至可以备份现有文件!我无法告诉您我已经使用了几次,scp并且sshpass在Bash FOR循环中使用了多少次,即使它们不需要它们也已将文件转储到服务器上。Ansible使它变得容易,并且不需要FOR循环和IP迭代。

语法比Command,Shell或Raw复杂。值得庆幸的是,与Ansible世界中的大多数事物一样,它很容易理解-例如:

ansible host_or_groupname -b -m copy \
    -a "src=./updated.conf dest=/etc/ntp.conf \
        owner=root group=root mode=0644 backup=yes"

这将在当前目录(在Ansible服务器/工作站上)中查找名为updated.conf的文件,然后将其复制到每个主机。在远程系统上,该文件将放置在/etc/ntp.conf中,并且如果文件已经存在且不同,则将使用日期扩展名备份原始文件。如果文件相同,则Ansible不会进行任何更改。

更新配置文件时,我倾向于使用复制模块。这对于在比特币矿工上更新配置文件是完美的,但是不幸的是,复制模块确实要求远程计算机已安装Python。但是,这是一种通过一个简单的命令在许多远程计算机上更新公用文件的好方法。还必须注意,复制模块支持使用remote_src=true指令将远程文件复制到远程文件系统上的其他位置 

文件模块

文件模块与复制模块有很多共同点,但是如果您尝试使用文件模块来复制文件,则无法正常工作。文件模块在远程计算机上执行其所有操作,因此 srcdest 都是对远程文件系统的引用。文件模块通常用于创建目录,创建链接或删除远程文件和文件夹。下面将仅在远程服务器上创建一个名为/ etc / newfolder的文件夹并设置模式:

ansible host_or_groupname -b -m file \
       -a "path=/etc/newfolder state=directory mode=0755"

当然,您可以设置所有者和组,以及其他一些选项,您可以在Ansible文档站点上进行了解。我发现我经常会使用文件模块创建文件夹或符号链接文件。要创建符号链接:

sensible host_or_groupname -b -m file \
         -a "src=/etc/ntp.conf dest=/home/user/ntp.conf \
             owner=user group=user state=link"

注意,该state指令是您如何通知Ansible您实际要做什么的。有几种状态选项:

  • link -创建符号链接。

  • directory —创建目录。

  • hard -创建硬链接。

  • touch —创建空文件。

  • absent —递归删除文件或目录。

这似乎有点复杂,尤其是当您可以轻松地使用Command或Shell Module命令执行相同的操作时,但是使用适当的模块的明确性使得出错更加困难。另外,以即席模式学习这些命令将使包含许多命令的剧本更容易理解(我计划在下一篇文章中介绍)。

文件管理

任何管理多个发行版的人都知道,处理各种程序包管理器可能很棘手。Ansible通过多种方式处理此问题。有一些针对apt和yum的特定模块,但是还有一个称为“程序包”的通用模块,无论它是基于Red Hat还是基于Debian / Ubuntu的,它都将安装在远程计算机上。

不幸的是,尽管Ansible通常可以检测到它需要使用的程序包管理器的类型,但是它没有办法修复具有不同名称的程序包。一个典型的例子是Apache。在基于Red Hat的系统上,软件包是“ httpd”,而在Debian / Ubuntu系统上,它是“ apache2”。这意味着需要进行一些更复杂的事情才能自动安装正确的软件包。但是,各个模块非常易于使用。我发现自己只是在适当时使用apt或yum,就像手动管理服务器时一样。这是一个合适的例子:

ansible host_or_groupname -b -m apt \
          -a "update_cache=yes name=apache2 state=latest"

通过这一简单的代码行,所有主机将运行 apt-get update (这是update_cache工作中指令),然后安装apache2的最新版本,包括所需的任何依赖项。state指令与文件模块非常相似,它具有以下几种选择:

  • latest —获取最新版本,如有需要,升级现有版本。

  • absent —如果已安装,请删除软件包。

  • present -确保已安装软件包,但不升级现有软件包。

Yum模块的工作方式类似于Apt模块,但是我通常不用理会该update_cache指令,因为yum自动更新。尽管非常相似,但是在基于Red Hat的系统上安装Apache看起来像这样:

ansible host_or_groupname -b -m yum \
      -a "name=httpd state=present"

此示例的区别在于,如果已经安装了Apache,则即使有可用更新也不会更新。有时您不希望更新到最新版本,因此这可以防止意外发生。

夫人,事实真相

在临时模式下使用Ansible的一件令人沮丧的事情是您无权访问有关远程系统的“事实”。在下一篇文章中,我计划探索创建包含各种任务的剧本,您将看到如何引用Ansible从系统中学到的事实。它使Ansible功能更加强大,但同样,它只能在剧本模式下使用。但是,可以使用临时模式查看Ansible收集的排序信息。如果运行该setup模块,它将向您显示远程系统的所有详细信息:

ansible host_or_groupname -b -m setup

该命令将在屏幕上喷出大量变量。您可以滚动浏览所有这些信息,以查看Ansible从主机提取的大量信息。实际上,它显示了太多的信息,可能会让人不知所措。您可以过滤结果:

ansible host_or_groupname -b -m setup -a "filter=*family*"

那应该只返回一个变量, ansible_os_family可能是Debian或Red Hat。当您开始使用剧本构建更复杂的Ansible设置时,可以插入一些逻辑和条件,以便在适当的情况下使用yum并在基于Debian的系统中使用apt。实际上,事实变量非常有用,这使构建剧本更加令人兴奋。

但是,这是另一篇文章,因为您已经到了第二部分的结尾。现在的任务是让您在临时模式下舒适地使用Ansible,一次只做一件事。大多数人认为临时模式只是更复杂的Ansible设置的垫脚石,但我不同意。只需一个命令就可以一致且可靠地配置数百台服务器,这简直是无可厚非。我喜欢编写精巧的剧本,但经常会在需要我进入ssh一堆服务器来执行简单任务的情况下使用临时命令与Ansible一起玩乐;从这里变得更加有趣!


©著作权归作者所有:来自ZhiKuGroup博客作者没文化的原创作品,如需转载,请注明出处,否则将追究法律责任 来源:ZhiKuGroup博客,欢迎分享。

评论专区
  • 昵 称必填
  • 邮 箱选填
  • 网 址选填
◎已有 1 人评论
  • 访客  发表于 2个月前
    1楼

    关注一下!http://3bi.net/post/2559.html/

搜索
作者介绍
30天热门
×
×
本站会员尊享VIP特权,现在就加入我们吧!登录注册×
»
会员登录
新用户注册
×
会员注册
已有账号登录
×