20 分鐘建立一個(gè) Ansible 實(shí)驗(yàn)室
建立一個(gè)支持學(xué)習(xí)和實(shí)驗(yàn)新軟件的環(huán)境。
能夠構(gòu)建和拆解公有云環(huán)境是非常有用的,但我們大多數(shù)人都不能輕松訪問公有云。退而求其次的最好辦法就是在本地機(jī)器上建立一個(gè)實(shí)驗(yàn)室,但即使在本地機(jī)器上運(yùn)行也會帶來性能、靈活性和其他挑戰(zhàn)。大多數(shù)時(shí)候,本地機(jī)器上額外的工作負(fù)載會干擾我們?nèi)粘5墓ぷ?,它們?dāng)然也會影響你提供一個(gè)現(xiàn)成的環(huán)境來玩耍和實(shí)驗(yàn)新軟件。
幾年前,當(dāng)我和我的團(tuán)隊(duì)開始學(xué)習(xí) Ansible 時(shí),我們就遇到了這個(gè)挑戰(zhàn)。我們找不到一個(gè)可以單獨(dú)使用的環(huán)境,我們對這種情況的失望導(dǎo)致我們中的一些人停止了實(shí)驗(yàn)。我們知道需要找到一個(gè)解決方案。
我們花了很多時(shí)間研究各種方案,得出了一套工具,使我們的好奇心能夠在我們完全控制的環(huán)境中學(xué)習(xí)。我們可以在本地機(jī)器上輪換和拆解實(shí)驗(yàn)室環(huán)境,而不需要訪問內(nèi)部實(shí)驗(yàn)室或公共云。
本文將解釋如何在 20 分鐘內(nèi)以完全自動化的方式在本地機(jī)器上部署自己的實(shí)驗(yàn)室環(huán)境。
你可以在我的 GitHub 倉庫中找到這個(gè)練習(xí)的所有代碼。
工具和軟件
本方案使用以下工具和軟件:
- Ansible 是我們選擇的自動化工具,因?yàn)樗子谑褂茫易銐蜢`活,可以滿足實(shí)驗(yàn)室的要求。
 - Vagrant 易于使用,用于構(gòu)建和維護(hù)虛擬機(jī)。
 - VirtualBox 是一個(gè)托管管理程序,可以在 Windows 和 Linux 環(huán)境中使用。
 - Fedora v30+ 是我本地機(jī)器上的操作系統(tǒng)。
 
你必須進(jìn)行以下設(shè)置才能建立環(huán)境:
- 一個(gè)互聯(lián)網(wǎng)連接
 - 在 BIOS 中啟用虛擬化技術(shù)支持(以下是在我的聯(lián)想筆記本上的過程)
 - Vagrant v2.2.9
 - 最新版本的 Ansible
 - 最新版本的 VirtualBox
 - Fedora v30+ 宿主機(jī)操作系統(tǒng)
 
這個(gè)實(shí)驗(yàn)室環(huán)境有什么?
這個(gè)項(xiàng)目旨在部署一個(gè)帶有 Ansible 引擎和多個(gè) Linux 節(jié)點(diǎn)的 Ansible 主機(jī),以及一些預(yù)加載和預(yù)配置的應(yīng)用程序(httpd 和 MySQL)。它還啟用了 Cockpit,這樣你就可以在測試過程中監(jiān)控虛擬機(jī)(VM)的狀態(tài)。使用預(yù)部署的應(yīng)用程序的原因是為了提高效率(所以你不必花時(shí)間安裝這些組件)。這樣你就可以專注于創(chuàng)建角色和劇本,并針對上述工具部署的環(huán)境進(jìn)行測試。
我們確定,對于我們的用例來說,最好的方案是多機(jī) Vagrant 環(huán)境。Vagrant 文件創(chuàng)建了三個(gè) CentOS 虛擬機(jī),以模擬兩個(gè)目標(biāo)主機(jī)和一個(gè) Ansible 控制機(jī)。
- Host1: 沒有圖形用戶界面(GUI),安裝 httpd 和 MySQL
 - Host2: 沒有 GUI,安裝了 httpd 和 MySQL
 - Ansible-host:沒有 GUI,安裝了 Ansible 引擎
 
啟用多個(gè)管理程序
如果使用了多個(gè)管理程序,一些管理程序可能不允許你拉起虛擬機(jī)。要解決這個(gè)問題,請遵循以下步驟(基于 Vagrant 的安裝說明)。
首先,找出管理程序的名稱:
$ lsmod | grep kvmkvm_intel 204800 6kvm 593920 1 kvm_intelirqbypass 16384 1 kvm
我感興趣的是 kvm_intel,但你可能需要另一個(gè)(比如 kvm_amd)。
以 root 身份運(yùn)行以下內(nèi)容,將該管理程序列入黑名單:
$ echo 'blacklist kvm-intel' >> /etc/modprobe.d/blacklist.conf
重新啟動你的機(jī)器并嘗試再次運(yùn)行 Vagrant。
Vagrant 文件
cat Vagrantfile
# -*- mode: ruby -*-# vi: set ft=ruby :Vagrant.configure("2") do |config|# Define VMs with static private IP addresses, vcpu, memory and vagrant-box.boxes = [{:name => "web1.demo.com", ⇒ Host1 this is one of the target nodes:box => "centos/8", ⇒ OS version:ram => 1024, ⇒ Allocated memory:vcpu => 1, ⇒ Allocated CPU:ip => "192.168.29.2" ⇒ Allocated IP address of the node},{:name => "web2.demo.com", ⇒ Host2 this is one of the target nodes:box => "centos/8",:ram => 1024,:vcpu => 1,:ip => "192.168.29.3"},{:name => "ansible-host", ⇒ Ansible Host with Ansible Engine:box => "centos/8",:ram => 8048,:vcpu => 1,:ip => "192.168.29.4"}]# Provision each of the VMs.boxes.each do |opts|config.vm.define opts[:name] do |config|# Only Enable this if you are connecting to Proxy server# config.proxy.http = "http://usernam:password@x.y:80"⇒ Needed if you have a proxy# 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", disabled: trueconfig.ssh.insert_key = falseconfig.vm.box = opts[:box]config.vm.hostname = opts[:name]config.vm.provider :virtualbox do |v| ⇒ Defines the vagrant providerv.memory = opts[:ram]v.cpus = opts[:vcpu]endconfig.vm.network :private_network, ip: opts[:ip]config.vm.provision :file do |file|file.source = './keys/vagrant' ⇒ vagrant keys to allow access to the nodesfile.destination = '/tmp/vagrant' ⇒ the location to copy the vagrant keyendconfig.vm.provision :shell, path: "bootstrap-node.sh" ⇒ script that copy hosts entryconfig.vm.provision :ansible do |ansible| ⇒ declaration to run ansible playbookansible.verbose = "v"ansible.playbook = "playbook.yml" ⇒ the playbook used to configure the hostsendendendend
這些是你需要注意的重要文件。
inventory-test.yaml:連接到節(jié)點(diǎn)的清單文件playbook.yaml:Vagrant 供應(yīng)者調(diào)用的用于配置節(jié)點(diǎn)的劇本文件- `Vagrantfile':Vagrant 用來部署環(huán)境的文件
 - Vagrant 密鑰文件:連接實(shí)驗(yàn)室環(huán)境中各節(jié)點(diǎn)的 Vagrant 密鑰
 
你可以根據(jù)你的需要調(diào)整這些文件。Ansible 的靈活性使你有能力根據(jù)你的需要聲明性地改變你的環(huán)境。
部署你的實(shí)驗(yàn)室環(huán)境
首先,克隆這個(gè) GitHub 倉庫 中的代碼:
$ git clone https://github.com/mikecali/ansible-labs-101.gitCloning into 'ansible-labs-101'...remote: Enumerating objects: 15, done.remote: Counting objects: 100% (15/15), done.remote: Compressing objects: 100% (13/13), done.remote: Total 15 (delta 2), reused 10 (delta 0), pack-reused 0Unpacking objects: 100% (15/15), 6.82 KiB | 634.00 KiB/s, done.
接下來,將你的目錄改為 vagrant-session-2,并查看其內(nèi)容:
$ lsBootstrap-node.sh inventory keys playbook.yml README.md Vagrantfile
現(xiàn)在你已經(jīng)擁有了實(shí)驗(yàn)室環(huán)境所需的所有工件和配置文件。要部署環(huán)境,請運(yùn)行:
$ vagrant up
只要有一個(gè)像樣的網(wǎng)絡(luò)連接,只需要 20 分鐘左右就可以得到一個(gè)運(yùn)行環(huán)境:
$ vagrant upBringing machine 'web1.demo.com' up with 'virtualbox' provider...Bringing machine 'web2.demo.com' up with 'virtualbox' provider...Bringing machine 'ansible-host' up with 'virtualbox' provider...==> web1.demo.com: Importing base box 'centos/8'...==> web1.demo.com: Matching MAC address for NAT networking...==> web1.demo.com: Checking if box 'centos/8' version '1905.1' is up to date...==> web1.demo.com: Setting the name of the VM: ansible-labs_web1democom_1606434176593_70913==> web1.demo.com: Clearing any previously set network interfaces...==> web1.demo.com: Preparing network interfaces based on configuration...web1.demo.com: Adapter 1: natweb1.demo.com: Adapter 2: hostonly==> web1.demo.com: Forwarding ports...web1.demo.com: 22 (guest) => 2222 (host) (adapter 1)==> web1.demo.com: Running 'pre-boot' VM customizations...==> web1.demo.com: Booting VM...==> web1.demo.com: Waiting for machine to boot. This may take a few minutes...web1.demo.com: SSH address: 127.0.0.1:2222web1.demo.com: SSH username: vagrantweb1.demo.com: SSH auth method: private key[...]
一旦該劇本執(zhí)行完成,你會看到這樣的輸出:
PLAY RECAP *********************************Ansible-host : ok=20 changed=11 unreachable=0 failed=0 skipped=0 rescued=0 ignored=3Real 18m14.288sUser 2m26.978sSys 0m26.849s
確認(rèn)所有虛擬機(jī)都在運(yùn)行:
$ vagrant statusCurrent machine states:Web1.demo.com running (virtualbox)Web2.demo.com running (virtualbox)ansible-host running (virtualbox)[...]
你可以通過登錄其中一個(gè)虛擬機(jī)進(jìn)一步調(diào)查。訪問 ansible-host:
> vagrant ssh ansible-hostActivate the web console with: systemctl enable --now cockpit.socketLast login: Thu Nov 26 12:21:23 2020 from 10.0.2.2[vagrant@ansible-host ~] uptime16:46:42 up 1:24, 1 user, load average: 0.00, 0.01, 0.04
最后,你可以使用 Ansible 模塊來 ping 你創(chuàng)建的其他節(jié)點(diǎn):
[vagrant@ansible-host]$ ansible -i inventory-test.yaml \webservers -m ping -u vagrant192.168.29.2 | SUCCESS => {"Ansible-facts": {"Discovered_interpreter_python": "/usr/libexec/platform-python"},"Changed": false;"Ping": "pong"}[...]
清理
運(yùn)行如下命令來清理環(huán)境:
$ vagrant destroy [vagrant machine name]
你的輸出會像這樣:
Output from cleaning up environment
有創(chuàng)意的學(xué)習(xí)
在自己的實(shí)驗(yàn)室里利用自己的時(shí)間學(xué)習(xí) Ansible 這樣的軟件是一個(gè)好習(xí)慣,但由于受到無法控制的限制,可能會很困難。
有時(shí)候,你需要發(fā)揮創(chuàng)意,找到另一種方法。在開源社區(qū)中,你可以選擇很多方案;我們選擇這些工具的主要原因之一是,它們是許多人常用和熟悉的。
另外,請注意,這些劇本并沒有按照我的要求進(jìn)行優(yōu)化。
















 
 
 



 
 
 
 