企業(yè)網(wǎng)站推廣的收獲與啟示軟件開發(fā)培訓(xùn)學(xué)校
在運(yùn)行Windows操作系統(tǒng)的主機(jī)LAPTOP-OUR52V78上安裝有VMware Workstation Player軟件。因?yàn)閃indows自帶的虛擬機(jī)平臺軟件"Hyper-V"使用難度較大,而且關(guān)于在"Hyper-V"上運(yùn)行虛擬機(jī),修改虛擬機(jī)錯誤的相關(guān)技術(shù)博客和文章的數(shù)量稀少,不利于順利進(jìn)行Ansible實(shí)戰(zhàn),所以使用"VMware Workstation Player"軟件,并通過"VMware Workstation Player"軟件,創(chuàng)建用來進(jìn)行Ansible實(shí)戰(zhàn)的虛擬機(jī)。同時(shí)只需要采用VMware Workstation Player來進(jìn)行Ansible實(shí)戰(zhàn),不需要使用VMware Workstation,因?yàn)閂Mware Workstation過于豐富的界面設(shè)置選項(xiàng)會將本應(yīng)用于Ansible實(shí)戰(zhàn)的注意力轉(zhuǎn)移到虛擬機(jī)管理上去,而虛擬機(jī)管理是紅帽RHCSA(紅帽認(rèn)證系統(tǒng)管理員)認(rèn)證的主要內(nèi)容,并不是將Ansible作為主要考察內(nèi)容的RHCE(紅帽認(rèn)證工程師)認(rèn)證的主要內(nèi)容,所以為了集中注意力,屏蔽掉虛擬機(jī)管理的細(xì)節(jié),只使用VMware Workstation Player來進(jìn)行Ansible實(shí)戰(zhàn)的做法是合理的。另外,"VMware Workstation"軟件的版本是17,而不是16,也是為了避免軟件版本對Ansible實(shí)戰(zhàn)產(chǎn)生可能的Bug,進(jìn)而影響Ansible實(shí)戰(zhàn)的進(jìn)度。
因?yàn)锳nsible是一款開源的軟件,所以我們能夠通過軟件包管理工具,免費(fèi)下載到ansible軟件。同時(shí)Ansible是一款自動化運(yùn)維工具,在傳統(tǒng)的運(yùn)維工作中,假如一位運(yùn)維人員負(fù)責(zé)生產(chǎn)環(huán)境下的20臺服務(wù)器,那么對于這一個運(yùn)維人員來說,一臺接一臺的在生產(chǎn)環(huán)境的20臺服務(wù)器上,進(jìn)行相同的日志查看、網(wǎng)卡管理、軟件更新、用戶管理等工作就成為無法避免的事情,也是影響運(yùn)維效率的一大因素。而Ansible自動化運(yùn)維工具的使用,使得下面的場景成為可能:在生產(chǎn)環(huán)境中,新引入1臺服務(wù)器,一共21臺服務(wù)器。其中新引入的1臺服務(wù)器作為控制節(jié)點(diǎn),安裝Ansible軟件包,控制其余的20臺服務(wù)器。原有的20臺服務(wù)器作為被管理節(jié)點(diǎn),不需要安裝Ansible軟件包,仍照常執(zhí)行生產(chǎn)任務(wù)。所以Ansible是一款開源的自動化運(yùn)維工具。
Ansible的底層是Python和SSH這兩款同時(shí)被在安裝Linux系統(tǒng)時(shí)自動安裝的軟件。因?yàn)锳nsible基于Python和SSH軟件,作為控制節(jié)點(diǎn)的服務(wù)器通過使用Ansible軟件對作為被管理節(jié)點(diǎn)的服務(wù)器發(fā)出的所有命令,最終都會轉(zhuǎn)化為經(jīng)由SSH傳輸并且在作為被管理節(jié)點(diǎn)的主機(jī)上執(zhí)行的Python代碼,而生產(chǎn)環(huán)境中的服務(wù)器在被安裝Linux系統(tǒng)時(shí)就已經(jīng)自動安裝了Python和SSH。所以在上面的例子中,作為被管理節(jié)點(diǎn)的服務(wù)器不需要安裝Ansible軟件包,只有作為控制節(jié)點(diǎn)的主機(jī)才需要安裝Ansible軟件包。
基于Ansible的特性,為了進(jìn)行Ansible實(shí)戰(zhàn),"VMware Workstation Player"上至少需要三臺虛擬機(jī),因?yàn)槿绻挥袃膳_虛擬機(jī),那么將不利于學(xué)習(xí)在作為控制節(jié)點(diǎn)的主機(jī)上進(jìn)行作為被控制節(jié)點(diǎn)的服務(wù)器的分組。因?yàn)锳nsible軟件對于支持它運(yùn)行的操作系統(tǒng)的要求是,CentOS8和RHEL9這兩款Linux發(fā)行版的優(yōu)于CentOS7這款Linux發(fā)行版,而我們僅需要一臺虛擬機(jī),讓它作為控制節(jié)點(diǎn)的主機(jī),并且RHEL9這款Linux發(fā)行版只有在紅帽官網(wǎng)上注冊賬號后才能下載到,且來自中國區(qū)的下載請求會被紅帽官方列入管控行為,所以CentOS8被選擇作為運(yùn)行Ansible軟件的操作系統(tǒng),安裝在一臺虛擬機(jī)上。另外的兩臺虛擬機(jī)可以選擇安裝曾經(jīng)同樣由紅帽推出的CentOS7操作系統(tǒng)。值得注意的一點(diǎn)是,三臺虛擬機(jī)的虛擬網(wǎng)絡(luò)適配器應(yīng)該連接在同一個虛擬網(wǎng)絡(luò)上,即如果安裝有CentOS8操作系統(tǒng)的作為控制節(jié)點(diǎn)的主機(jī)的虛擬網(wǎng)絡(luò)適配器連接到了VMnet8這個默認(rèn)采用NAT模式的虛擬網(wǎng)絡(luò)上時(shí),安裝有CentOS7操作系統(tǒng)的作為被控制節(jié)點(diǎn)的主機(jī)的虛擬網(wǎng)絡(luò)適配器也應(yīng)該同時(shí)連接到VMnet8這個默認(rèn)采用NAT模式的虛擬網(wǎng)絡(luò)。當(dāng)然考慮到作為控制節(jié)點(diǎn)的主機(jī)需要使用yum軟件包管理工具進(jìn)行ansible軟件包的安裝,使用默認(rèn)采用NAT模式的VMnet8虛擬網(wǎng)絡(luò)來連接三臺虛擬機(jī)的做法是更合理的。
操作系統(tǒng)名稱 | IP地址 | 角色 |
CentOS8 Stream | 192.168.133.148 | 控制節(jié)點(diǎn) |
CentOS7 | 192.168.133.147 | 被控制節(jié)點(diǎn) |
CentOS7 | 192.168.133.146 | 被控制節(jié)點(diǎn) |
當(dāng)在"VMware Workstation Player"上創(chuàng)建三臺虛擬機(jī)并安裝好對應(yīng)的操作系統(tǒng)、配置好對應(yīng)的虛擬網(wǎng)絡(luò)適配器之后,我們需要對作為控制節(jié)點(diǎn)的主機(jī)進(jìn)行Ansible軟件的安裝。雖然當(dāng)初在安裝有CentOS8 Stream操作系統(tǒng)的主機(jī)上作為root用戶使用"yum install ansible"命令安裝"ansible"時(shí),并沒有提前下載epel源,但是在文心一言關(guān)于“如何在Linux系統(tǒng)上安裝Ansible軟件”的回答中,在安裝"ansible"之前應(yīng)該先下載epel源被提到,我猜測,是因?yàn)镃entOS8 Stream操作系統(tǒng)默認(rèn)的軟件源中已包含可供下載的"ansible"軟件,所以在作為控制節(jié)點(diǎn)的安裝有CentOS8 Stream操作系統(tǒng)的主機(jī)中,直接使用"yum install ansible"命令安裝"ansible"軟件是合理的。下圖顯示已被安裝好的ansible軟件:
[root@localhost ~]# rpm -qa | grep ansible
ansible-core-2.15.3-1.el8.x86_64
[root@localhost ~]#
"rpm -qa | grep ansible" ,"rpm -qa"命令表示列出已經(jīng)安裝在CentOS8 Stream操作系統(tǒng)中的所有rpm軟件包,"-q"參數(shù)表示"query"查詢,"-a"參數(shù)表示所有,"-qa"即表示查詢所有軟件包,"grep ansible"表示在列出的已經(jīng)安裝在CentOS8 Stream操作系統(tǒng)中的所有rpm軟件包中,過濾出包含有"ansible"的軟件包。"ansible-core-2.15.3-1.el8.x86_64"即表示ansible軟件包已經(jīng)被安裝在作為控制節(jié)點(diǎn)的主機(jī)中。
[root@localhost ~]# ansible --version
ansible [core 2.15.3]
? config file = /etc/ansible/ansible.cfg
? configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
? ansible python module location = /usr/lib/python3.11/site-packages/ansible
? ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
? executable location = /usr/bin/ansible
? python version = 3.11.4 (main, Aug 11 2023, 13:46:19) [GCC 8.5.0 20210514 (Red Hat 8.5.0-20)] (/usr/bin/python3.11)
? jinja version = 3.1.2
? libyaml = True
[root@localhost ~]#?
運(yùn)行"ansible --version"命令,當(dāng)出現(xiàn)圖中所示的包含"ansible"的版本信息在內(nèi)的"ansible"軟件配置信息時(shí),即表示"ansible"已被正確下載并安裝在作為管理節(jié)點(diǎn)的主機(jī)中。
在作為控制節(jié)點(diǎn)的主機(jī)成功安裝Ansible軟件之后,作為一般用戶user,需要創(chuàng)建一個文件夾專門用于存放Ansible相關(guān)文件,可以通過"mkdir?~/ansible"命令,在當(dāng)前用戶user的家目錄下,創(chuàng)建名為"ansible"的文件夾。在該文件夾下有兩個基本的配置文件,一個是"inventory"文件,作用是列出作為被管理節(jié)點(diǎn)的所有主機(jī);另一個是"ansible.cfg"文件,作用是確定被使用的inventory文件、確定作為管理節(jié)點(diǎn)的主機(jī)在通過SSH連接到作為被管理節(jié)點(diǎn)的服務(wù)器上時(shí)使用被管理節(jié)點(diǎn)服務(wù)器上的哪個用戶來執(zhí)行Python命令、確定管理節(jié)點(diǎn)主機(jī)在通過SSH連接到被管理節(jié)點(diǎn)服務(wù)器上時(shí)需不需要提示輸入SSH連接的密碼、確定在被管理節(jié)點(diǎn)服務(wù)器上是否需要提權(quán)到另一個用戶、確定在被管理節(jié)點(diǎn)服務(wù)器上提權(quán)到另一個用戶的方法、確定在被管理節(jié)點(diǎn)服務(wù)器上提權(quán)到哪個用戶、確定在被管理節(jié)點(diǎn)服務(wù)器上進(jìn)行提權(quán)操作時(shí)是否需要提示輸入密碼。在作為管理節(jié)點(diǎn)的服務(wù)器上的"inventory"和"ansible.cfg"文件內(nèi)容如下所示:
[dqx@localhost ansible]$ pwd
/home/dqx/Desktop/ansible
[dqx@localhost ansible]$ ls -alh
total 8.0K
drwxrwxr-x. 2 dqx dqx ?42 Oct 31 06:22 .
drwxr-xr-x. 3 dqx dqx ?21 Oct 31 05:41 ..
-rw-rw-r--. 1 dqx dqx 157 Oct 31 06:22 ansible.cfg
-rw-rw-r--. 1 dqx dqx ?42 Oct 31 05:44 inventory
[dqx@localhost ansible]$ cat ansible.cfg
[defaults]
inventory=./inventory
remote_user=dqx
ask_pass=false
[privilege_escalation]
become=false
become_method=sudo
become_user=root
becom_ask_pass=false[dqx@localhost ansible]$ cat inventory
192.168.133.147192.168.133.146
[centos]
192.168.133.147
[dqx@localhost ansible]$?
操作系統(tǒng)名稱 | IP地址 | 角色 | 非root用戶 | root用戶 |
CentOS8 Stream | 192.168.133.148 | 控制節(jié)點(diǎn) | dqx | root |
CentOS7 | 192.168.133.147 | 被控制節(jié)點(diǎn) | dqx | root |
CentOS7 | 192.168.133.146 | 被控制節(jié)點(diǎn) | dqx | root |
三臺虛擬機(jī)中的用戶情況如上表所示?;氐絪hell的輸出結(jié)果當(dāng)中,"pwd"表示列出當(dāng)前的工作目錄, "/home/dqx/Desktop/ansible"是"pwd"命令在shell中的執(zhí)行結(jié)果,表示當(dāng)前工作目錄是"/home/dqx/Desktop/ansible","ls -alh"命令表示列出當(dāng)前工作目錄下包括以"."開頭作為文件名稱的隱藏文件在內(nèi)的所有文件的詳細(xì)信息,并且將文件的大小的單位轉(zhuǎn)換為合適的單位使得更加易讀。在"ls -alh"的返回結(jié)果中,"ansible.cfg"與"inventory"即為兩個ansible配置文件。通過使用cat命令將"ansible.cfg"文件的內(nèi)容輸出到shell中,從"[defaults]"到"ask_pass=true"之間的所有行都屬于"[default]"塊的配置內(nèi)容,從"[privilege_escalation]"到"becom_ask_pass=false"之間的所有行都屬于"[privilege_escalation]"塊的配置內(nèi)容。"inventory=./inventory"表示"ansible.cfg"配置文件使用的"inventory"文件是和"ansible.cfg"文件在同一目錄下并且同層級的"inventory"文件,"remote_user=dqx"表示作為管理節(jié)點(diǎn)的主機(jī)在通過SSH連接到作為被管理節(jié)點(diǎn)的服務(wù)器上時(shí)使用被管理節(jié)點(diǎn)服務(wù)器上的dqx用戶來執(zhí)行Python命令。"ask_pass=false"表示管理節(jié)點(diǎn)主機(jī)在通過SSH連接到被管理節(jié)點(diǎn)服務(wù)器上時(shí)不需要提示輸入SSH連接的密碼,但是考慮到?jīng)]有在管理節(jié)點(diǎn)主機(jī)上設(shè)置為采用基于密鑰的認(rèn)證方法,而仍然采用的是基于密碼的認(rèn)證方法,所以我們在正式通過Ansible管理被管理節(jié)點(diǎn)服務(wù)器之前,需要設(shè)置免密SSH登錄。暫時(shí)忽略"[privilege_escalation]"塊的配置內(nèi)容。
要設(shè)置免密SSH登錄,需要在作為管理節(jié)點(diǎn)的主機(jī)上,通過"ssh-keygen"命令生成一組公鑰與私鑰,之所以要通過該命令生成一組公鑰與私鑰,是因?yàn)橹盀榱俗尡还芾砉?jié)點(diǎn)服務(wù)器允許來自管理節(jié)點(diǎn)主機(jī)的SSH連接時(shí)采用的認(rèn)證方式是基于密碼的認(rèn)證方式,而基于密碼的認(rèn)證方式并不會使得管理節(jié)點(diǎn)主機(jī)自動生成一組公鑰與私鑰,所以需要通過"ssh-keygen"命令生成一組公鑰與私鑰。通過"ls -alh ~/.ssh/"命令可以查看到在管理節(jié)點(diǎn)主機(jī)上的公鑰與私鑰:
[dqx@localhost ~]$ ls -alh ~/.ssh
total 16K
drwx------. ?2 dqx dqx ? 57 Nov ?1 06:55 .
drwx------. 19 dqx dqx 4.0K Nov ?1 06:40 ..
-rw-------. ?1 dqx dqx 2.6K Oct 31 05:58 id_rsa
-rw-r--r--. ?1 dqx dqx ?579 Oct 31 05:58 id_rsa.pub
-rw-r--r--. ?1 dqx dqx ?177 Oct 31 05:58 known_hosts
[dqx@localhost ~]$ cat ./.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQD+iR5IYRa8M8PSWhwZHyFLCb8pwnsiNyKWyw6SLWRZ48ghJW++oeCqH9EqukR/dEc0O11L1CH0+cjeq9H9824PlN1MXMXA7rCV7XX5Cu8fWH2a/q+ezluEtXOvjUWWAk251Zi5traCFzQRPUUJOV9Rqa8Sqo+knV07AFOnzsTY/YP3Tq16qa9ZAI+UBVG2N8axgnshyA4oRGL+vE1zodxqWZY+QC7egJKw8bB3IyiYGYQbPxzqWaqmsv6op0oFmGOtPmuPMLXuKhzDsUnMPFh7W++RWveBWbm40HzUTu7PtpsThEsRpXp33Bt3Ulkj6AXqHD5tQl296hKCiB/r/bo+LIcSAben3l0wGl5tNFTbDaVgyext8qTA5kb5ruvX4Jf6oT+ngBpk9hDLSu7XBFQBcWS06D8Gatgt3JNZah4j5BbXcV9dHZ2vtIoDy2iYtIB5Q2DChetLkmee1I+UOMJWM4N+4n5kGki9Zw3UoBwB2iCp80Lhrlb28gr1WzF60+s= dqx@localhost.localdomain
[dqx@localhost ~]$ cat ./.ssh/known_hosts?
[dqx@localhost ~]$ cat .ssh/known_hosts
192.168.133.147 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBHb17ZDiFBmpoRrdFAQce1pEbzyLtcGNrXWmWpCxsTcCaeAnLQTzKqAbaq48ZSbxIIzgj4dlpp8Cuy4hb9vWtY8=
192.168.133.146 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBDjg1FIrArIYhNXHPfzttOH1UTZEWYIfvbCBnOsO0jf4DTyQ0A6ps3NrwgxWR20whcfTn3LEd6CxvgFxFoDzt6U=
[dqx@localhost ~]$
"id_rsa"即為通過"ssh-keygen"命令生成的私鑰,"id_rsa.pub"即為通過"ssh-keygen"命令生成的與"id_rsa"私鑰為一對的公鑰。因?yàn)楣€可以公布,私鑰不可以公布,所以只通過"cat ./.ssh/id_rsa.pub"命令顯示公鑰的內(nèi)容。在"ls -alh ~/.ssh"的結(jié)果中的"known_hosts"文件表示已被確認(rèn)身份且不會被冒充的主機(jī),在這里已經(jīng)確定IP地址為"192.168.133.147"和"192.168.133.146"的主機(jī),也就是作為被管理節(jié)點(diǎn)的服務(wù)器的身份。
接著將作為管理節(jié)點(diǎn)的主機(jī)生成的一對公私鑰中的公鑰傳給作為被管理節(jié)點(diǎn)的服務(wù)器。使用命令"ssh-copy-id dqx@192.168.133.147", "ssh-copy-id root@192.168.133.147", "ssh-copy-id dqx@192.168.133.146", "ssh-copy-id root@192.168.133.146"。
[dqx@localhost ~]$ ssh-copy-id dqx@192.168.133.147
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/dqx/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.
? ? ? ? ? ? ? ? (if you think this is a mistake, you may want to use -f option)[dqx@localhost ~]$ ssh-copy-id root@192.168.133.147
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/dqx/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.
? ? ? ? ? ? ? ? (if you think this is a mistake, you may want to use -f option)[dqx@localhost ~]$ ssh-copy-id dqx@192.168.133.146
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/dqx/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.
? ? ? ? ? ? ? ? (if you think this is a mistake, you may want to use -f option)[dqx@localhost ~]$ ssh-copy-id root@192.168.133.146
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/dqx/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.
? ? ? ? ? ? ? ? (if you think this is a mistake, you may want to use -f option)[dqx@localhost ~]$
四條命令的結(jié)果均為"All keys were skipped because they already exist on the remote system.",說明已經(jīng)將作為管理節(jié)點(diǎn)的主機(jī)的公鑰傳遞給了作為被管理節(jié)點(diǎn)的兩臺服務(wù)器中,進(jìn)而SSH免密登錄設(shè)置完成。這時(shí)在作為管理節(jié)點(diǎn)的主機(jī)中包含"inventory"文件的"ansible"目錄下,使用命令"ansible all -m ping"命令:
[dqx@localhost ansible]$ ansible all -m ping
192.168.133.146 | SUCCESS => {
? ? "ansible_facts": {
? ? ? ? "discovered_interpreter_python": "/usr/bin/python"
? ? },
? ? "changed": false,
? ? "ping": "pong"
}
192.168.133.147 | SUCCESS => {
? ? "ansible_facts": {
? ? ? ? "discovered_interpreter_python": "/usr/bin/python"
? ? },
? ? "changed": false,
? ? "ping": "pong"
}
[dqx@localhost ansible]$
這就表明"Ansible"已配置成功。?