构建一个支持学习和试验新软件的环境。能够构建和拆除公共云环境非常有用,但我们大多数人都无法轻松访问公共云。最好的后备方案是在本地机器上建立一个实验室,但即使在本地机器上运行它也会带来性能、灵活性和其他挑战。大多数时候,本地机器上的额外工作负载会干扰我们的日常工作,而且它们肯定会影响您提供现成环境来试用和试验新软件的能力。几年前,当我和我的团队开始学习Ansible时,我们面临着这个挑战。我们找不到一个单独工作的环境,我们对这种情况的挫败感导致我们中的一些人停止了试验。我们知道我们需要找到解决方案。我们花了很多时间研究各种场景,并提出了一套工具,使我们的好奇心能够在我们完全控制的环境中学习。我们可以在本地机器上轮换和拆除实验室环境,而无需访问内部实验室或公共云。本文将介绍如何在20分钟内以完全自动化的方式在您的本地机器上部署您自己的实验室环境。您可以在我的GitHub存储库中找到本练习的所有代码。工具和软件此场景使用了以下工具和软件:Ansible是我们选择的自动化工具,因为它易于使用且足够灵活,可以满足实验室的要求。Vagrant易于用于构建和维护虚拟机。VirtualBox是一个托管的管理程序,可以在Windows和Linux环境中使用。Fedorav30+是我本地机器上的操作系统。您必须具有以下设置才能设置环境:Internet连接在BIOS中启用虚拟化支持(该过程在我的Lenovo笔记本电脑上进行)Vagrantv2.2.9最新版本的Ansible最新版本的VirtualBoxFedorav30+主机操作系统这是什么实验室环境?该项目旨在部署具有Ansible引擎和多个Linux节点的Ansible主机,以及一些预加载和预配置的应用程序(httpd和MySQL)。它还启用了Cockpit,因此您可以在测试期间监控虚拟机(VM)的状态。使用预部署应用程序的原因是为了提高效率(因此您不必花时间安装这些组件)。通过这种方式,您可以专注于创建角色和剧本,并根据部署上述工具的环境测试它们。我们确定我们用例的最佳解决方案是多机Vagrant环境。Vagrant文件创建了三个CentOS虚拟机来模拟两个目标主机和一个Ansible控制机。Host1:NoGUI,httpdandMySQLinstalledHost2:NoGUI,httpdandMySQLinstalledAnsible-host:NoGUI,AnsibleengineinstalledEnablemultiplehypervisor如果使用了多个hypervisor,有些管理程序可能不允许你拉起虚拟机机器。要解决此问题,请按照以下步骤操作(基于Vagrant的安装说明)。首先,找出管理程序的名称:$lsmod|grepkvmkvm_intel2048006kvm5939201kvm_intelirqbypass163841kvm我对kvm_intel很感兴趣,但你可能需要另一个(比如kvm_amd)。通过以root身份运行以下命令将管理程序列入黑名单:$echo'blacklistkvm-intel'>>/etc/modprobe.d/blacklist.conf重新启动您的机器并尝试再次运行Vagrant。Vagrant文件catVagrantfile#-*-mode:ruby??-*-#vi:setft=ruby:Vagrant.configure("2")do|config|#定义具有静态私有IP地址、vcpu、内存和vagrant-box的虚拟机.boxes=[{:name=>"web1.demo.com",?Host1这是目标节点之一:box=>"centos/8",?操作系统版本:ram=>1024,?分配内存:vcpu=>1,?分配的CPU:ip=>"192.168.29.2"?节点的分配IP地址},{:name=>"web2.demo.com",?Host2这是目标节点之一:box=>"centos/8",:ram=>1024,:vcpu=>1,:ip=>"192.168.29.3"},{:name=>"ansible-host",?带有Ansible引擎的Ansible主机:box=>"centos/8",:ram=>8048,:vcpu=>1,:ip=>"192.168.29.4"}]#配置每个虚拟机。boxes.each做|选择|config.vm.defineopts[:name]do|config|#OnlyEnablethisifyouareconnectingtoProxyserver#config.proxy.http="http://usernam:password@x.y:80"?如果你有代理#config.proxy.https="http://usernam:password@x.y:80"#config.proxy.no_proxy="localhost,127.0.0.1"config.vm.synced_folder".","/vagrant",id:“vagrant-root”,禁用:trueconfig.ssh.insert_key=falseconfig.vm.box=opts[:box]config.vm.hostname=opts[:name]config.vm.provider:virtualboxdo|v|?定义流浪提供者v.memory=opts[:ram]v.cpus=opts[:vcpu]endconfig.vm.network:private_network,ip:opts[:ip]config.vm.provision:filedo|file|file.source='./keys/vagrant'?流浪键到允许访问节点file.destination='/tmp/vagrant'?复制vagrant键的位置endconfig.vm.provision:shell,path:"bootstrap-node.sh"?复制主机条目config.vm的脚本.provision:ansibledo|ansible|?声明运行ansibleplaybookansible.verbose="v"ansible.playbook="playbook.yml"?用于配置hostsendendendend的playbook这些是你需要关注的清单-test.yaml中的重要文件:连接到节点的清单文件playbook.yaml:Vagrantprovider调用的用于配置节点的playbook文件`Vagrantfile':Vagrant用于部署环境的文件Vagrantkey文件:连接到实验室环境中的每个节点Vagrantkey您可以根据需要调整这些文件。Ansible的灵活性使您能够根据需要以声明方式更改环境。部署您的实验室环境首先,克隆此GitHub存储库中的代码:$gitclonehttps://github.com/mikecali/ansible-labs-101.gitCloninginto'ansible-labs-101'...remote:Enumeratingobjects:15、done.remote:Countingobjects:100%(15/15),done.remote:Compressingobjects:100%(13/13),done.remote:Total15(delta2),reused10(delta0),pack-reused0拆包对象:100%(15/15),6.82KiB|634.00KiB/s,完成。接下来,将您的目录更改为vagrant-session-2并查看其内容:$lsBootstrap-node.shinventorykeysplaybook.ymlREADME.mdVagrantfile现在您拥有实验室环境所需的所有工件和配置文件。要部署环境,请运行:$vagrantup只要您有良好的网络连接,只需大约20分钟即可获得运行环境:$vagrantupBringingmachine'web1.demo.com'with'virtualbox'provider...将机器'web2.demo.com'与'virtualbox'提供程序一起使用...将机器'ansible-host'与'virtualbox'提供程序一起使用...==>web1.demo.com:导入基本框'centos/8'...==>web1.demo.com:为NAT网络匹配MAC地址...==>web1.demo.com:检查框'centos/8'版本'1905.1'是否是最新的...==>web1.demo.com:设置VM的名称:ansible-labs_web1democom_1606434176593_70913==>web1.demo.com:清除任何先前设置的网络接口...==>web1.demo.com:准备基于配置的网络接口...web1.demo.com:Adapter1:natweb1.demo.com:Adapter2:hostonly==>web1.demo.com:Forwardingports...web1.demo.com:22(guest)=>2222(host)(adapter1)==>web1.demo.com:运行“预启动”VM自定义...==>web1.demo.com:B正在启动VM...==>web1.demo.com:等待机器启动。这可能需要几分钟...web1.demo.com:SSHaddress:127.0.0.1:2222web1.demo.com:SSHusername:vagrantweb1.demo.com:SSHauthmethod:privatekey[…]一旦剧本执行完毕,你会看到这样的输出:PLAYRECAP**********************************Ansible-host:ok=20changed=11unreachable=0failed=0skipped=0rescued=0ignored=3Real18m14.288sUser2m26.978sSys0m26.849s确认所有虚拟机都在运行:$vagrantstatusCurrentmachinestates:Web1.demo.comrunning(virtualbox)Web2.demo.comrunning(virtualbox)ansible-hostrunning(virtualbox)[...]您可以通过登录其中一台虚拟机来执行此操作以进一步调查访问ansible-host:>vagrantsshansible-host使用以下命令激活Web控制台:systemctlenable--nowcockpit.socketLastlogin:ThuNov2612:21:232020from10.0.2.2[vagrant@ansible-host~]uptime16:46:42up1:24,1user,loadaverage:0.00,0.01,0.04最后,你可以使用Ansible模块来ping你创建的其他节点:[vagrant@ansible-host]$ansible-iinventory-test.yaml\网络服务器-mping-uvagrant192.168.29.2|SUCCESS=>{"Ansible-facts":{"Discovered_interpreter_python":"/usr/libexec/platform-python"},"Changed":false;"Ping":"pong"}[...]Cleanup运行以下命令来清理环境:$vagrantdestroy[vagrantmachinename]你的输出将如下所示:使用自己的实验室花时间学习像Ansible这样的软件是一个好习惯,但由于您无法控制的限制,这可能会很困难。有时,您需要发挥创造力并找到另一种方法。在开源社区,你有很多选择;我们选择这些工具的主要原因之一是它们是许多人常用和熟悉的。另外,请注意这些脚本没有按照我的意愿进行优化。
