当前位置: 首页 > 科技观察

使用Ansible实现系统管理自动化_0

时间:2023-03-19 18:08:27 科技观察

提高您的系统管理和Linux技能,并学习如何设置工具以简化对多台机器的管理。您是否希望提高您的系统管理和Linux技能?也许您的本地LAN上正在运行某些程序,您想让生活更轻松一些-那又怎样?在本文中,我将向您展示如何设置工具来简化对多台机器的管理。远程管理工具有很多,SaltStack、Puppet、Chef和A??nsible是比较受欢迎的选择。在本文中,我将重点介绍Ansible并解释它如何为您提供帮助,无论您拥有5台还是1,000台虚拟机。让我们从多台机器的基本管理开始,无论它们是虚拟的还是物理的。我假设您知道该做什么并且具备基本的Linux管理技能(至少能够找出执行每项任务的确切步骤)。我将向您展示如何使用此工具,使用它取决于您。什么是Ansible?Ansible的网站将其解释为“一个超简单的IT自动化引擎,可自动执行云供应、配置管理、应用程序部署、服务内部编排和许多其他IT需求。”通过在一个集中位置定义一组服务器,Ansible可以在多个服务器上执行相同的任务。如果您熟悉Bash的for循环,您会发现Ansible的操作类似。不同的是Ansible是Avatar的幂等。通俗地说,Ansible通常只在实际发生更改时才执行请求的操作。例如,假设您执行Bashfor循环来为多台机器创建用户,如下所示:forserverinserverAserverBserverC;执行ssh${server}"useraddmyuser";完成这将在serverA、serverB和serverC上创建用户在上创建myuser用户;但是,无论用户是否存在,每次运行for循环时都会执行useradd命令。异步系统会首先检查用户是否存在,只有在不存在时才创建它。当然,这个例子很简单,但是随着时间的推移,朋友圈等工具的好处会越来越明显。Ansible是如何工作的?Ansible将Ansibleplaybook转换为通过SSH运行的命令,这在管理类UNIX环境时具有许多优势:大多数类UNIX机器默认启用SSH。依赖SSH意味着远程主机不需要有代理。在大多数情况下,不需要安装额外的软件,Ansible需要Python2.6或更新版本。大多数Linux发行版默认安装此版本(或更新版本)的Python。Ansible不需要主节点。它可以在任何安装了Ansible的主机上运行,??并且可以通过SSH访问。虽然可以在cron中运行Ansible,但默认情况下Ansible只会在您明确要求时运行。使用Ansible配置SSH密钥身份验证的常见方法是配置无密码SSH密钥登录,以便于管理。(AnsibleVault可用于为密码等敏感信息提供保护,但这不在本文讨论范围之内)。现在只需使用下面的命令生成一个SSH密钥,如示例1所示。[09:44user~]$ssh-keygen生成公共/私人rsa密钥对。输入保存密钥的文件(/home/user/.ssh/id_rsa):创建目录“/home/user/.ssh”。Enterpassphrase(emptyfornopassphrase):Entersamepassphraseagain:Youridentificationhasbeensavedin/home/user/.ssh/id_rsa.您的公钥已保存在/home/user/.ssh/id_rsa.pub中。密钥指纹为:SHA256:TpMyzf4qGqXmx3aqZijVv7vO9zGnVXsh6dPbXAZ+LUQuser@user-fedora密钥的随机图像为:+---[RSA2048]----+|||||E||哦。..||.+所以+。||..o*。.+哦||..+ooooo+。*||。.ooo*哦。*.*+||.o+*BO.o+.o|+----[SHA256]-----+示例1:生成SSH密钥在示例1中,只需按Enter接受默认值。任何非特权用户都可以生成SSH密钥并将它们安装在远程系统上任何用户的SSHauthorized_keys文件中。生成密钥后,还需要将其复制到远程主机,运行以下命令:ssh-copy-idroot@servera注意:Ansible本身不需要root权限;但是,如果您使用非root用户,则需要为执行任务配置适当的sudo权限。输入servera的root密码,此命令会将您的SSH密钥安装到远程主机。安装SSHkey后,通过SSH登录远程主机不再需要输入root密码。安装Ansible只需要在示例1中生成SSH密钥的主机上安装Ansible。如果您使用的是Fedora,请输入以下命令:sudodnfinstallansible-y如果您运行的是CentOS,则需要为EPEL存储库配置额外的包:sudoyuminstallepel-release-y然后使用yum安装Ansible:sudoyuminstallansible-y对于基于Ubuntu的系统,可以从PPA安装Ansible:sudoapt-getinstallsoftware-properties-common-ysudoapt-add-repositoryppa:ansible/ansiblesudoapt-getupdatesudoapt-getinstallansible-y如果你使用的是macOS,建议通过PythonPIP安装:sudopipinstallansible对于其他发行版,请参阅Ansible安装文档。AnsibleInventoryAnsible使用INI样式的文件来跟踪它管理的服务器,称为Inventory。默认情况下,此文件位于/etc/ansible/hosts。在本文中,我使用示例2中所示的Ansible清单在所需主机上运行(为简洁起见进行了裁剪):[arch]nextcloudprometheusdesktop1desktop2vm-host15[fedora]netflix[centos]conanconfluence7-repovm-server1gitlabtvmedia-centrenas[satellite]satellite[ocp]lb00ocp_dnsmaster01app01infra01示例2:Ansiblehosts文件每个组由方括号和组名标识(如[group1]),这是应用于一组服务器组名的任意组。服务器可以存在于多个组中,没有任何问题。在这种情况下,我有基于操作系统(arch、ubuntu、centos、fedora)的分组和基于服务器功能(ocp、satellite)的分组。Ansible主机文件可以处理比这复杂得多的情况。有关详细信息,请参阅库存文档。运行命令将SSH密钥复制到清单中的所有服务器后,您可以开始使用Ansible。Ansible的基本功能之一是运行特定的命令。语法为:ansible-a"somecommand"例如,假设你想升级所有的CentOS服务器,你可以运行:ansiblecentos-a'yumupdate-y'注意:不需要根据运行的服务器进行分组系统。正如我将在下面提到的,AnsibleFacts可用于收集这些信息;但是,使用Facts会使运行特定命令变得复杂,因此如果您正在管理异构环境,为了方便起见,我建议创建一些按操作系统划分的组。这将遍历centos组中的所有服务器并安装所有更新。一个更有用的命令是Ansible的ping模块,它可用于验证服务器是否准备好接受命令:ansibleall-mping这将使Ansible尝试通过SSH连接到清单中的所有服务器。示例3中可以看到ping命令的部分输出。nw|SUCCESS=>{"changed":false,"ping":"pong"}媒体中心|成功=>{“改变”:假,“平”:“乒乓球”}纳斯|成功=>{“改变了”:false,“ping”:“pong”}kids-tv|SUCCESS=>{"changed":false,"ping":"pong"}...示例3:Ansibleping命令输出运行指定命令的能力有有助于完成快速任务(LCTT译注:应该参考那种一次性任务),但是如果我以后想用同样的方式运行同一个任务怎么办?Ansible剧本就是用来做到这一点的。使用Ansible剧本的复杂任务Ansible剧本是包含Ansible指令的YAML格式文件。我不打算在这里解释更高级的内容,例如角色和模板。如果您有兴趣,请阅读Ansible文档。在上一章中,我建议您使用ssh-copy-id命令来传递您的SSH密钥;但是,本文重点介绍如何以一致、可重复的方式进行操作。示例4演示了一种实现,即使SSH密钥已经以一致的方式存在于目标主机上,也能保证正确性。----hosts:allgather_facts:falsevars:ssh_key:'/root/playbooks/files/laptop_ssh_key'任务:-name:copysshkeyauthorized_key:key:"{{lookup('file',ssh_key)}}"user:root示例4:Ansible剧本“pushsshkeys.yaml”-hosts:行标识应在哪些主机组上执行该剧本。在此示例中,它检查清单中的所有主机。gather_facts:行指定Ansible是否应该搜索每个主机的详细信息。稍后我会做更详细的检查。现在为了节省时间,我们将gather_facts设置为false。vars:部分,顾名思义,用于定义剧本中使用的变量。在示例4的这个简短脚本中,它并不是真正必需的,但我们仍然按照约定设置一个变量。***tasks:标记的部分是存放主要指令的地方。每个任务都有一个-name:。Ansbile将在运行playbook时显示此名称。authorized_key:是剧本使用的Ansible模块的名称。Ansible模块的信息可以通过命令ansible-doc-a查询;但是,通过Web浏览器查看文档可能更方便。authorized_key模块有很多很好的例子可以参考。要运行示例4中的剧本,只需运行ansible-playbook命令:ansible-playbookpush_ssh_keys.yaml如果您是第一次添加SSH密钥,SSH将提示您输入根用户的密码。现在SSH密钥已经传输到服务器,是时候做一些有趣的事情了。使用Ansible收集信息Ansible可以收集有关目标系统的各种信息。如果您有大量主机,这可能会特别耗时。根据我的经验,每个主机可能需要大约1-2秒或更长时间;然而,有时收集信息是有益的。考虑以下脚本,它禁止root用户使用密码远程登录系统:----hosts:allgather_facts:truevars:tasks:-name:Enablingssh-keyonlyrootaccesslineinfile:dest:/etc/ssh/sshd_configregexp:'^PermitRootLogin'line:'PermitRootLoginwithout-password'notify:-restart_sshd-restart_sshhandlers:-name:restart_sshdservice:name:sshdstate:restartedenabled:true当:ansible_distribution=='RedHat'-name:restart_sshservice:name:sshstate:restartedenabled:truewhen:ansible_distribution=='Debian'示例5:锁定root的SSH访问在示例5中,sshd_config文件的修改是有条件的,只有找到匹配的分发版才会执行.在这种情况下,基于RedHat的发行版对SSH服务的命名与基于Debian的发行版不同,这就是使用条件语句的原因。虽然还有其他方法可以达到相同的效果,但此示例很好地说明了Ansible消息的功能。如果想查看Ansible默认收集的所有信息,可以在本地运行setup模块:ansiblelocalhost-msetup|lessAnsible收集到的所有信息都可以用来做判断,如例4中vars:部分演示.不同之处在于Ansible消息被视为内置变量,不需要系统管理员定义。更近一步现在是时候开始探索Ansible并创建您自己的基础了。Ansible是一个具有深度、复杂性和灵活性的工具,不是一篇文章可以涵盖的。我希望本文能激起您的兴趣并鼓励您探索Ansible的功能。在下一篇文章中,我将讨论Copy、systemd、service、apt、yum、virt和用户模块。我们可以将这些模块组合成剧本,并创建一个简单的Git服务器来存储所有这些剧本。