<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一文詳解 Ansible 的自動化運維

          共 32898字,需瀏覽 66分鐘

           ·

          2021-03-14 20:21

          公眾號關注“杰哥的IT之旅”,

          選擇“星標”,重磅干貨,第一時間送達!



          一、Ansible 概述

          Ansible 是近年來越來越火的一款開源運維自動化工具,通過Ansible可以實現(xiàn)運維自動化,提高運維工程師的工作效率,減少人為失誤。

          Ansible 通過本身集成的非常豐富的模塊可以實現(xiàn)各種管理任務,其自帶模塊超過上千個。更為重要的是,它操作非常簡單,即使小白也可以輕松上手,但它提供的功能又非常豐富,在運維領域,幾乎可以做任何事。

          1、Ansible 特點

          Ansible 自 2012 年發(fā)布以來,很快在全球流行,其特點如下:

          • Ansible 基于 Python 開發(fā),運維工程師對其二次開發(fā)相對比較容易;

          • Ansible 豐富的內置模塊,幾乎可以滿足一切要求;

          • 管理模式非常簡單,一條命令可以影響上千臺主機;

          • 無客戶端模式,底層通過 SSH 通信;

          • Ansible發(fā)布后,也陸續(xù)被 AWS、Google Cloud Platform、Microsoft Azure、Cisco、HP、VMware、Twitter 等大公司接納并投入使用;

          二、Ansible的角色

          • 使用者:如何使用 Ansible 實現(xiàn)自動化運維?

          • Ansible 工具集:Ansible 可以實現(xiàn)的功能?

          • 作用對象:Ansible 可以影響哪些主機?

          1、使用者

          如下圖所示:Ansible 使用者可以采用多種方式和 Ansible 交互,圖中展示了四種方式:

          • CMDB:CMDB 存儲和管理者企業(yè)IT架構中的各項配置信息,是構建 ITIL 項目的核心工具,運維人員可以組合 CMDB 和 Ansible,通過 CMDB 直接下發(fā)指令調用Ansible 工具集完成操作者所希望達到的目標;

          • PUBLIC/PRIVATE 方式:Ansible 除了豐富的內置模塊外,同時還提供豐富的 API語言接口,如PHP、Python、PERL 等多種流行語言,基于 PUBLIC/PRIVATE,Ansible 以 API 調用的方式運行;

          • Ad-Hoc 命令集:Users直接通過Ad-Hoc命令集調用Ansible工具集來完成任務;

          • Playbooks:Users 預先編寫好 Ansible Playbooks,通過執(zhí)行

          • Playbooks 中預先編排好的任務集,按序執(zhí)行任務;

          2、Ansible 工具集

          Ansible 工具集包含 Inventory、Modules、Plugins 和 API。

          其中:Inventory:用來管理設備列表,可以通過分組實現(xiàn),對組的調用直接影響組內的所有主機;Modules:是各種執(zhí)行模塊,幾乎所有的管理任務都是通過模塊執(zhí)行的;Plugins:提供了各種附加功能;API:為編程人員提供一個接口,可以基于此做 Ansible的二次開發(fā);具體表現(xiàn)如下:

          • Ansible Playbooks:任務腳本,編排定義Ansible任務及的配置文件,由Ansible按序依次執(zhí)行,通常是JSON格式的YML文件;

          • Inventory:Ansible 管理主機清單;

          • Modules:Ansible 執(zhí)行命令功能模塊,多數(shù)為內置的核心模塊,也可自定義;

          • Plugins:模塊功能的補充,如連接類型插件、循環(huán)插件、變量插件、過濾插件等,該功能不太常用;

          • API:供第三方程序調用的應用程序編程接口;

          • Ansible:該部分圖中表現(xiàn)得不太明顯,組合 Inventory、API、Modules、Plugins可以理解為是 Ansible 命令工具,其為核心執(zhí)行工具;

          3、作用對象

          Ansible 的作用對象不僅僅是 Linux 和非 Linux 操作系統(tǒng)的主機,也可以作用于各類PUBLIC/PRIVATE、商業(yè)和非商業(yè)設備的網(wǎng)絡設施。

          使用者使用 Ansible 或 Ansible-Playbooks 時,在服務器終端輸入 Ansible 的 Ad-Hoc命令集或 Playbooks 后,Ansible 會遵循預選安排的規(guī)則將 Playbooks 逐步拆解為Play,再將 Play 組織成 Ansible 可以識別的任務,隨后調用任務涉及的所有模塊和插件,根據(jù) Inventory 中定義的主機列表通過 SSH 將任務集以臨時文件或命令的形式傳輸?shù)竭h程客戶端執(zhí)行并返回執(zhí)行結果,如果是臨時文件則執(zhí)行完畢后自動刪除。

          三、Ansible的配置

          1、Ansible安裝

          Ansible的安裝部署非常簡單,以RPM安裝為例,其依賴軟件只有Python和SSH,且系統(tǒng)默認均已安裝。Ansible的管理端只能是Linux,如Redhat、Debian、Centos。

          1)通過YUM安裝Ansible

          可以自行從互聯(lián)網(wǎng)上直接下載Ansible所需軟件包,本篇博客提供安裝Ansible自動化運維工具所需的依賴軟件包

          [root@centos01 ~]# cd /mnt/ansiblerepo/ansiblerepo/repodata/
          [root@centos01 ansiblerepo]# vim /etc/yum.repos.d/local.repo
          [local]
          name=centos
          baseurl=file:///mnt/ansiblerepo/ansiblerepo  <!--修改yum路徑-->
          enabled=1
          gpgcheck=0
          [root@centos01 ~]# yum -y install ansible
                          <!--安裝Ansible自動化運維工具-->

          2)驗證安裝結果

          [root@centos01 ~]# ansible --version
              <!--如果命令可以正常執(zhí)行,則表示Ansible工具安裝成功-->
          ansible 2.3.1.0
            config file = /etc/ansible/ansible.cfg
            configured module search path = Default w/o overrides
            python version = 2.7.5 (default, Nov  6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]

          3)創(chuàng)建 SSH 免交互登錄

          Ansible 通過 SSH 對設備進行管理,而 SSH 包含兩種認證方式:一種是通過密碼認證,另一種是通過密鑰對驗證。前者必須和系統(tǒng)交互,而后者是免交互登錄。如果希望通過 Ansible 自動管理設備,應該配置為免交互登錄被管理設備。

          [root@centos01 ~]# ssh-keygen -t rsa  <!--生成密鑰對-->
          Generating public/private rsa key pair.
          Enter file in which to save the key (/root/.ssh/id_rsa):<!--密鑰對存放路徑-->
          Created directory '/root/.ssh'.
          Enter passphrase (empty for no passphrase):
                 <!--輸入私鑰保護密碼,直接按Enter鍵表示無密碼-->
          Enter same passphrase again:    <!--再次輸入-->
          Your identification has been saved in /root/.ssh/id_rsa.
          Your public key has been saved in /root/.ssh/id_rsa.pub.
          The key fingerprint is:
          SHA256:cJz6NRTrvMDxX+Jpce6LRnWI3vVEl/zvARL7D10q9WY root@centos01
          The key's randomart image is:
          +---[RSA 2048]----+
          |          .   . .|
          |       . . +   oo|
          |      . = o o. oo|
          |       = * o..+ *|
          |      . S *.=+=*+|
          |       . o =+XooE|
          |        . ..=.++.|
          |           ..o ..|
          |           .. o. |
          +----[SHA256]-----+
          [root@centos01 ~]# ssh-copy-id -i .ssh/id_rsa.pub  [email protected]   <!--復制公鑰到遠端192.168.100.20-->
          [root@centos01 ~]# ssh-copy-id -i .ssh/id_rsa.pub  [email protected]    <!--復制公鑰到遠端192.168.100.30-->

          至此,已經(jīng)完成 Ansible 的部署,接下來就可以通過 Ansible 對設備進行管理了。

          2、Ansible 配置

          Inventory 是 Ansible 管理主機信息的配置文件,相當于系統(tǒng) Hosts 文件的功能,默認存放在 /etc/ansible/hosts。

          在 hosts 文件中,通過分組來組織設備,Ansible 通過 Inventory 來定義主機和分組,通過在 ansible 命令中使用選項-i或—inventory-file來指定 Inventory。

          [root@centos01 ~]# ansible -i /etc/ansible/hosts web -m ping

          如果使用默認的 Inventory文件(/etc/ansible/hosts),也可以不指定 Inventory 文件,例如:

          [root@centos01 ~]# ansible web -m ping

          Ansible 通過設備列表以分組的方式添加到 /etc/ansible/hosts 文件來實現(xiàn)對設備的管理,所以在正式管理之前,首先要編寫好 hosts 文件。hosts 文件中,以[ ]包含的部分代表組名,設備列表支持主機名和IP地址。

          默認情況下,通過訪問22端口(SSH)來管理設備。若目標主機使用了非默認的SSH端口,還可以在主機名稱之后使用冒號加端口標明,以行為單位分隔配置。另外,hosts文件還支持通配符。

          [root@centos01 ~]# vim /etc/ansible/hosts
          ............   <!--此處省略部分內容-->
          [web]
          192.168.100.20
          192.168.100.30
          [test]
          www.benet.com:222                         <!--通過222端口管理設備-->
          [mail]
          yj1.kgc.cn
          yj[2:5].kgc.cn
          <!--[2:5]表示2~5之間的所有數(shù)字,即表示yj2.kgc.cn、yj3.kgc.cn……的所有主機-->

          可以將一個主機同時歸置在不同的組中。

          配置完成之后,可以針對hosts定義的組進行遠程操作,也可以針對組中的某一個或多個主機操作。例如:

          1)只對web組中192.168.1.2主機操作,通過—limit參數(shù)限定主機的變更。

          [root@centos01 ~]# ansible web -m command -a "systemctl status httpd" --limit "192.168.100.20"
          192.168.100.20 | SUCCESS | rc=0 >>
          <!--看到SUCCESS就知道成功了,所以以下內容-->
          <!--如果測試httpd服務,被測試主機必然已經(jīng)安裝并啟動了httpd服務-->

          2)只對192.168.100.20主機操作。通過IP限定主機的變更。

          [root@centos01 ~]# ansible 192.168.100.20 -m command -a "systemctl status httpd"
          192.168.100.20 | SUCCESS | rc=0 >>

          3)只對192.168.100.0網(wǎng)段主機操作,這就需要使用到通配符來限定主機的變更了。

          [root@centos01 ~]# ansible 192.168.1.* -m command -a "systemctl status httpd"
          192.168.100.20 | SUCCESS | rc=0 >>
          .......  <!--此處省略部分內容-->
          192.168.100.30 | SUCCESS | rc=0 >>
          .......    <!--此處省略部分內容-->
          <!--實驗環(huán)境,效果一樣,這里就不多說了-->

          3、Ansible 命令

          Ansible 的維護命令大多數(shù)是以 ansible 開頭,在終端輸入 ansible 后連續(xù)按兩次Tab鍵,會補全所有跟 ansible 相關的命令。

          [root@centos01 ~]# ansible  <!--連續(xù)按Tab鍵-->
          ansible               ansible-console-2     ansible-galaxy        ansible-playbook-2.7  ansible-vault-2
          ansible-2             ansible-console-2.7   ansible-galaxy-2      ansible-pull          ansible-vault-2.7
          ansible-2.7           ansible-doc           ansible-galaxy-2.7    ansible-pull-2
          ansible-connection    ansible-doc-2         ansible-playbook      ansible-pull-2.7
          ansible-console       ansible-doc-2.7       ansible-playbook-2    ansible-vault

          1)ansible

          ansible 是生產(chǎn)環(huán)境中使用非常頻繁的命令之一,主要在以下場景使用:

          非固化需求;
          臨時一次性操作;
          二次開發(fā)接口調用;

          非固化需求是指臨時性的維護,如查看web服務器組磁盤使用情況、復制一個文件到其他機器等。類似這些沒有規(guī)律的、臨時需要做的任務,我們成為非固化需求,臨時一次性操作,語法如下:

          Ansible  <host-pattern> [options]


          • -v(—verbose):輸出詳細的執(zhí)行過程信息,可以得到執(zhí)行過程所有信息;

          • -i PATH(—inventory=PATH):指定inventory信息,默認為/etc/ansible/hosts;

          • -f NUM(—forks=NUM):并發(fā)線程數(shù),默認為5個線程;

          • —private-key=PRIVATE_KEY_FILE:指定密鑰文件;

          • -m NAME,—module-name=NAME:指定執(zhí)行使用的模塊;

          • -M DIRECTORY(—module-path=DIRECTORY) :指定模塊存放路徑,默認為/usr/share/ansible;

          • -a ARGUMENTS(—args=ARGUMENTS):指定模塊參數(shù);

          • -u USERNAME(—user=USERNAME):指定遠程主機以USERNAME運行命令;

          • -l subset(—limit=SUBSET):限制運行主機;

          ①檢查所有主機是否存活,執(zhí)行命令如下:

          [root@centos01 ~]# ansible all -f 5 -m ping
          <!--調用ping模塊,all表示/etc/ansible/hosts文件中的所有主機,不用創(chuàng)建all分組(默認存在)-->
          192.168.100.20 | SUCCESS => {               <!--表示執(zhí)行成功-->
              "changed": false,                        <!--沒有對主機做出更改-->
              "ping": "pong"                  <!--表示執(zhí)行ping命令的返回結果-->
          }
          192.168.100.30 | SUCCESS => {
              "changed": false,
              "ping": "pong"
          }

          ②列出web組所有的主機列表,執(zhí)行命令如下:

          [root@centos01 ~]# ansible web --list      <!-- --list:表示列出主機列表信息-->
            hosts (2):
              192.168.100.20
              192.168.100.30

          ③批量顯示web組中的磁盤使用空間,執(zhí)行命令如下:

          [root@centos01 ~]# ansible web -m command -a "df -hT"
          192.168.100.30 | SUCCESS | rc=0 >>
          文件系統(tǒng)            類型      容量  已用  可用 已用% 掛載點
          /dev/mapper/cl-root xfs        17G  4.4G   13G   26% /
          devtmpfs            devtmpfs  897M     0  897M    0% /dev
          tmpfs               tmpfs     912M   84K  912M    1% /dev/shm
          tmpfs               tmpfs     912M     0  912M    0% /sys/fs/cgroup
          /dev/sda1           xfs      1014M  173M  842M   18% /boot
          tmpfs               tmpfs     183M   16K  183M    1% /run/user/42
          tmpfs               tmpfs     183M     0  183M    0% /run/user/0

          192.168.100.20 | SUCCESS | rc=0 >>
          文件系統(tǒng)            類型      容量  已用  可用 已用% 掛載點
          /dev/mapper/cl-root xfs        17G  4.3G   13G   26% /
          devtmpfs            devtmpfs  897M     0  897M    0% /dev
          tmpfs               tmpfs     912M   84K  912M    1% /dev/shm
          tmpfs               tmpfs     912M     0  912M    0% /sys/fs/cgroup
          /dev/sda1           xfs      1014M  173M  842M   18% /boot
          tmpfs               tmpfs     183M   16K  183M    1% /run/user/42
          tmpfs               tmpfs     183M     0  183M    0% /run/user/0
          /dev/sr0            iso9660   4.1G  4.1G     0  100% /mnt

          web關鍵字需要提前在/etc/ansible/hosts文件中定義組。

          Ansible的返回結果非常友好,一般會用三種顏色來表示執(zhí)行結果:

          • 紅色:表示執(zhí)行過程出現(xiàn)異常;

          • 橘黃顏色:表示命令執(zhí)行后目標有狀態(tài)變化;

          • 綠色:表示執(zhí)行成功且沒有目標機器做修改;

          2)Ansible-doc

          Ansible-doc用來查詢ansible模塊文檔的說明,類似于man命令,針對每個模塊都有詳細的用法說明及應用案例介紹,語法如下:

          ansible-doc [options] [module……]

          列出支持的模塊:

          [root@centos01 ~]#ansible-doc -l

          查詢ping模塊的說明信息:

          [root@centos01 ~]# ansible-doc ping
          > PING    (/usr/lib/python2.7/site-packages/ansible/modules/system/ping.py)

            A trivial test module, this module always returns `pong' on successful contact. It
            does not make sense in playbooks, but it is useful from `/usr/bin/ansible' to verify
            the ability to login and that a usable python is configured. This is NOT ICMP ping,
            this is just a trivial test module.

          EXAMPLES:
          # Test we can logon to 'webservers' and execute python with json lib.
          ansible webservers -m ping

          MAINTAINERS: Ansible Core Team, Michael DeHaan

          METADATA:
                  Status: ['stableinterface']
                  Supported_by: core

          3)Ansible-playbook

          Ansible-playbook是日常應用中使用頻率最高的命令,類似于Linux中的sh或source命令,用來執(zhí)行系列任務。

          其工作機制:通過讀取預先編寫好的playbook文件實現(xiàn)集中處理任務。Ansible-playbook命令后跟yml格式的playbook文件,playbook文件存放了要執(zhí)行的任務代碼,命令使用方式如下:

          Ansible-playbook playbook.yml
          <!--playbook.yml文件要提前編寫好,建議使用絕對路徑-->

          4)Ansible-console

          Ansible-console是Ansible為用戶提供的一款交互式工具,類似于Windows的cmd或者是Linux中shell。用戶可以在ansible-console虛擬出來的終端上像shell一樣使用Ansible內置的各種命令,這為習慣于使用shell交互式方式的用戶提供了良好的使用體驗。在終端輸入ansible-console命令后,顯示如下:

          [root@centos01 ~]# ansible-console
          Welcome to the ansible console.
          Type help or ? to list commands.
                <!--輸入help或?獲取幫助-->
          root@all (2)[f:5]$ cd web    <!--使用cd命令切換主機或分組-->
          root@web (2)[f:5]$ list                  <!--列出當前的設備-->
          192.168.100.20
          192.168.100.30
          <!--支持Tab鍵補全,快捷鍵Ctrl+D或Ctrl+C即可退出當前的虛擬終端-->

          4、Ansible模塊

          1)command模塊

          command模塊在遠程主機執(zhí)行命令,不支持管道、重定向等shell的特性。常用的參數(shù)如下:

          • chdir:在遠程主機上運行命令前要提前進入的目錄;

          • creates:在命令運行時創(chuàng)建一個文件,如果文件已存在,則不會執(zhí)行創(chuàng)建任務;

          • removes:在命令運行時移除一個文件,如果文件不存在,則不會執(zhí)行移除任務;

          • executeable:指明運行命令的shell程序;

          在所有主機上運行“l(fā)s ./”命令,運行前切換到/home目錄下。操作如下:

          [root@centos01 ~]# ansible web -m command -a "chdir=/ ls ./"

          2)shell模塊

          shell模塊在遠程主機執(zhí)行命令,相當于調用遠程主機的Shell進程,然后在該Shell下打開一個子Shell運行命令。和command模塊的區(qū)別是它支持Shell特性:如管道、重定向等。

          示例如下:

          [root@centos01 ~]# ansible web -m shell -a "echo hello world "        <!--輸出到屏幕-->
          192.168.100.20 | SUCCESS | rc=0 >>
          hello world

          192.168.100.30 | SUCCESS | rc=0 >>
          hello world
          [root@centos01 ~]# ansible web -m shell -a "echo hello world > /1.txt"   <!--輸出到1.txt文件中-->
          192.168.100.20 | SUCCESS | rc=0 >>

          192.168.100.30 | SUCCESS | rc=0 >>

          3)copy模塊

          copy模塊用于復制指定主機文件到遠程主機的指定位置。常見的參數(shù)如下:

          • dest:指出復制文件的目標目錄位置,使用絕對路徑。如果源是目錄,則目標也要是目錄,如果目標文件已存在,會覆蓋原有內容;

          • src:指出源文件的路徑,可以使用相對路徑和絕對路徑,支持直接指定目錄。如果源是目錄,則目標也要是目錄;

          • mode:指出復制時,目標文件的權限,可選;

          • owner:指出復制時,目標文件的屬主,可選;

          • group:指出復制時目標文件的屬組,可選;

          • content:指出復制到目標主機上的內容,不能和src一起使用,相當于復制content指明的數(shù)據(jù)到目標文件中;

          示例如下:

          [root@centos01 ~]# ansible web -m copy -a "src=/etc/hosts
          dest=/root/a1.hosts mode=777 owner=root group=root"
          <!--/將本機的hosts文件復制到web組中的所有主機上存放在家目錄下的a1.hosts目錄,
          權限是777,屬主是root,屬組是root-->

          4)hostname模塊

          hostname模塊用于管理遠程主機上的主機名。常用的參數(shù)如下:

          name:
          指明主機名;

          示例如下:

          [root@centos01 ~]# ansible 192.168.100.20 -m hostname -a "name=test"
          <!--將192.168.100.20的主機名改為test,
          但是192.168.100.20需要敲一下bash才生效-->

          5)yum模塊

          yum模塊基于yum機制,對遠程主機管理程序包。常用的參數(shù)如下:

          • name:程序包名稱,可以帶上版本號。若不指明版本,則默認為最新版本;

          • state=present|atest|absent:指明對程序包執(zhí)行的操作:present表明安裝程序包,latest表示安裝最新版本的程序包,absent表示卸載程序包;

          • disablerepo:在用yum安裝時,臨時禁用某個倉庫的ID;

          • enablerepo:在用yum安裝時,臨時啟用某個倉庫的ID;

          • conf_file:yum運行時的配置文件,而不是使用默認的配置文件;

          • disable_gpg_check=yes|no:是否啟用完整性校驗功能;

          示例如下:

          [root@centos01 ~]# ansible web -m shell -a "/usr/bin/rm -rf
          /etc/yum.repos.d/CentOS-*"
                    <!--批量化刪除web組主機的yum源-->
          [root@centos01 ~]# ansible web -m shell -a "/usr/bin/mount
          /dev/cdrom /mnt"   <!--批量化掛載光盤-->
           [WARNING]: Consider using mount module rather than running mount

          192.168.100.20 | SUCCESS | rc=0 >>
          mount: /dev/sr0 寫保護,將以只讀方式掛載

          192.168.100.30 | SUCCESS | rc=0 >>
          mount: /dev/sr0 寫保護,將以只讀方式掛載
          [root@centos01 ~]# ansible web -m yum -a "name=httpd
          state=present"  <!--批量化安裝httpd程序-->
          [root@centos01 ~]# ansible web -m shell -a "rpm -qa | grep httpd"
              <!--批量化查看安裝的httpd程序包-->
           [WARNING]: Consider using yum, dnf or zypper module rather than running rpm

          192.168.100.20 | SUCCESS | rc=0 >>
          httpd-2.4.6-67.el7.centos.x86_64
          httpd-tools-2.4.6-67.el7.centos.x86_64

          192.168.100.30 | SUCCESS | rc=0 >>
          httpd-2.4.6-67.el7.centos.x86_64
          httpd-tools-2.4.6-67.el7.centos.x86_64
          [root@centos01 ~]# ansible web -m shell -a "systemctl start httpd"       <!--批量啟動服務-->
          [root@centos01 ~]# ansible web -m shell -a "netstat -anptu | grep httpd"     <!--批量化監(jiān)聽httpd服務是否啟動成功-->
          192.168.100.20 | SUCCESS | rc=0 >>
          tcp6       0      0 :::80                   :::*                    LISTEN      2072/httpd

          192.168.100.30 | SUCCESS | rc=0 >>
          tcp6       0      0 :::80                   :::*                    LISTEN      3098/httpd

          管理端只是發(fā)送yum指令到被管理端,被管理端要存在可用的yum倉庫才可以成功安裝。

          6)service模塊

          service模塊為用來管理遠程主機上的服務的模塊。常見的參數(shù)如下:

          • name:被管理的服務名稱;

          • state=started|stopped|restarted:動作包含啟動,關閉或重啟;

          • enable=yes|no:表示是否設置該服務開機自啟動;

          • runlevel:如果設定了enabled開機自啟動,則要定義在哪些運行目標下自動啟動;

          示例如下:

          [root@centos01 ~]# ansible web -m service -a "name=httpd
          enabled=yes state=restarted"
          <!--設置httpd服務重新啟動和開機自動啟動-->

          7)user模塊

          user模塊主要用于管理遠程主機上的用戶賬號。常見的參數(shù)如下:

          name:必選參數(shù),賬號名稱;
          state=present|absent:創(chuàng)建賬號或者刪除賬號,present表示創(chuàng)建,absent表示刪除;
          system=yes|no:是否為系統(tǒng)賬戶;
          uid:用戶UID;
          group:用戶的基本組
          groups:用戶的附加組;
          shell:默認使用的shell;
          home:用戶的家目錄;
          mve_home=yes|no:
          如果設置的家目錄已經(jīng)存在,是否將已存在的家目錄進行移動;
          pssword:用戶的密碼,建議使用加密后的字符串;
          comment:
          用戶的注釋信息;
          remore=yes|no:
          當state=absent時,是否要刪除用戶的家目錄;

          創(chuàng)建用戶示例如下:

          [root@centos01 ~]# ansible web -m user -a "name=user01
          system=yes uid=502 group=root groups=root shell=/etc/nologin
          home=/home/user01 password=pwd@123"
          <!--在web組的所有主機上新建一個系統(tǒng)用戶,UID為502,
          屬組是root,名字是user01,密碼是pwd@123-->

          四、playbook配置文件

          1、執(zhí)行配置文件

          playbook配置文件使用YAML語法,具有簡潔明了、結構清晰等特點。playbook配置文件類似于shell腳本,是一個YAML格式的文件,用于保存針對特定需求的任務列表。上面介紹的ansible命令雖然可以完成各種任務,但是當配置一些復雜任務時,逐條輸入就顯得效率非常低下。

          更有效的方案是在playbook配置文件中放置所有的任務代碼,利用ansible-playbook命令執(zhí)行該文件,可以實現(xiàn)自動化運維。YAML文件的擴展名通常為.yaml或.yml。

          YAML語法與其他高級語言類似,其結構通過縮進來展示,通過“-”來代表項;“:”用來分隔鍵和值;整個文件以“—-”開頭并以“…”結尾,如下所示:

          [root@centos01 ~]# grep -v ^# /etc/ansible/hosts | grep -v ^$              <!--查看hosts中的分組信息-->
          [web1]
          192.168.100.20
          [web2]
          192.168.100.30
          [root@centos01 ~]# vim /etc/ansible/a.yml
                             <!--創(chuàng)建a.yml文件,寫入以下內容-->
          ---
          - hosts: web1                   <!--針對web1組中的操作-->
            remote_user: root                    <!--遠端執(zhí)行用戶身份為root-->
            tasks:                <!--任務列表-->
                  - name: adduser                               <!--任務名稱-->
                    user: name=user1 state=present <!--執(zhí)行user模塊,創(chuàng)建用戶-->
                    tags:                <!--創(chuàng)建tag標簽-->
                    - aaa                 <!--tag標簽為aaa-->
                  - name: addgroup           <!--任務名稱-->
                    group: name=root system=yes <!--執(zhí)行group模塊,創(chuàng)建組-->
                    tags:               <!--創(chuàng)建tag標簽-->
                    - bbb               <!--tag標簽為bbb-->
          - hosts: web2               <!--針對web2組中的操作-->
            remote_user: root        <!--遠端執(zhí)行用戶身份為root-->
            tasks:                     <!--任務列表-->
                  - name: copy file to web            <!--任務名稱-->
                    copy: src=/etc/passwd dest=/home        <!--執(zhí)行copy模塊,復制文件-->
                    tags:                        <!--創(chuàng)建tag標簽-->
                    - ccc                     <!--tag標簽為ccc-->
          ...

          所有的“-”和“:”后面均有空格,而且注意縮進和對齊,如下圖所示:

          playbook的核心元素包含:

          hosts:任務的目標主機,多個主機用冒號分隔,一般調用/etc/ansible/hosts中的分組信息;
          remote_user:遠程主機上,運行此任務的默認身份為root;
          tasks:任務,即定義的具體任務,由模塊定義的操作列表;
          handlers:觸發(fā)器,類似tasks,只是在特定的條件下才會觸發(fā)的任務。
          某任務的狀態(tài)在運行后為changed時,可通過“notify”通知給相應的handlers進行觸發(fā)執(zhí)行;
          roles:角色,將hosts剝離出去,由tasks、handlers等所組成的一種特定的結構集合;

          playbook文件定義的任務需要通過ansible-playbook命令進行調用并執(zhí)行。ansible-playbook命令用法如下:

          ansible-playbook [option] /PATH/TO/PLAYBOOK.yaml

          其中,[option]部分的功能包括:

          • —syntax-check:檢測yaml文件的語法;

          • -C(—check):預測試,不會改變目標主機的任何設置;

          • —list-hosts:列出yaml文件影響的主機列表;

          • —list-tasks:列出yaml文件的任務列表;

          • —list-tags:列出yaml文件中的標簽;

          • -t TAGS(—tags=TAGS):表示只執(zhí)行指定標簽的任務;

          • —skip-tags=SKIP_TAGS:表示除了指定標簽的任務,執(zhí)行其他任務;

          • —start-at-task=START_AT:從指定的任務開始往下運行;

          執(zhí)行playbook的示例如下:

          [root@centos01 ~]# ansible-playbook --syntax-check /etc/ansible/a.yml    <!--語法檢測-->

          playbook: /etc/ansible/a.yml     <!--表示沒有報錯-->
          [root@centos01 ~]# ansible-playbook -C /etc/ansible/a.yml
                   <!--對a.yml進行預測試-->
              .................<!--省略部分內容-->
          192.168.100.20       : ok=3    changed=1    unreachable=0    failed=0
          192.168.100.30       : ok=2    changed=1    unreachable=0    failed=0
          <!--返回結果表示沒有錯誤,全部可以執(zhí)行成功。-->
          [root@centos01 ~]# ansible-playbook --list-hosts /etc/ansible/a.yml
          <!--列出a.yml文件中的主機-->
          [root@centos01 ~]# ansible-playbook --list-tasks /etc/ansible/a.yml
          <!--列出任務-->
          [root@centos01 ~]# ansible-playbook --list-tags /etc/ansible/a.yml           <!--列出標簽-->
          [root@centos01 ~]# ansible-playbook /etc/ansible/a.yml                <!--執(zhí)行任務-->
          [root@centos01 ~]# ssh 192.168.100.20 tail -1 /etc/passwd <!--確認執(zhí)行結果-->
          user1:x:1001:1001::/home/user1:/bin/bash
          [root@centos01 ~]# ssh 192.168.100.30 ls -ld /home/passwd
          -rw-r--r--. 1 root root 2342 7月  23 16:06 /home/passwd
          <!--一般情況先執(zhí)行“-C”命令進行預測試,沒有問題后再執(zhí)行.yml文件。-->

          通常情況下先執(zhí)行 ansible-playbook -C /PATH/TO/PLAYBOOK.yaml 命令進行測試,測試沒問題后再執(zhí)行 ansible-playbook /PATH/TO/PLAYBOOK.yml 命令。

          2、觸發(fā)器

          需要觸發(fā)才能執(zhí)行的任務,當之前定義在tasks中的任務執(zhí)行成功后,若希望在此基礎上觸發(fā)其他任務,這時就需要定義handlers。例如,當通過ansible的模塊對目標主機的配置文件進行修改之后,如果任務執(zhí)行成功,可以觸發(fā)一個觸發(fā)器,在觸發(fā)器中定義目標主機的服務重啟操作,以使配置文件生效。handlers觸發(fā)器具有以下特點:

          • handlers是Ansible提供的條件機制之一。

          • handlers和task很類似,但是它只在被task通知的時候才會觸發(fā)執(zhí)行。

          • handlers只會在所有任務執(zhí)行完成后執(zhí)行。

          • 而且即使被通知了很多次,它也只會執(zhí)行一次。

          • handlers按照定義的順序依次執(zhí)行。

          handlers觸發(fā)器的使用示例如下:

          [root@centos01 ~]# ssh 192.168.100.20 netstat -anpt | grep 80                  <!--查詢100.20主機監(jiān)聽的端口-->
          tcp6       0      0 :::80         :::*          LISTEN      94858/httpd
          <!--可以看到是監(jiān)聽80端口,現(xiàn)在通過腳本改為8080端口,并使其生效。-->
          [root@centos01 ~]# vim /etc/ansible/httpd.yml
                      <!--編輯httpd.yml文件,寫入以下內容-->

          ---
          - hosts: web1
            remote_user: root
            tasks:
                  - name: change port
                    command: sed -i 's/Listen\ 80/Listen\ 8080/g' /etc/httpd/conf/httpd.conf
                    notify:                             <!--配置觸發(fā)條件-->
                          - restart httpd server    <!--完成該任務后調用名為“restart httpd server”的觸發(fā)器-->
            handlers:                                      <!--配置觸發(fā)器-->
                  - name: restart httpd server  <!--指定觸發(fā)器名字,要和上面“notify”指定的觸發(fā)器名字一樣-->
                    service: name=httpd state=restarted<!--觸發(fā)任務為重啟httpd服務-->
          ...
          <!--編寫完成后,保存退出即可-->
          [root@centos01 ~]# ansible-playbook -C /etc/ansible/httpd.yml          <!--進行預測試-->
          [root@centos01 ~]# ansible-playbook  /etc/ansible/httpd.yml               <!--執(zhí)行腳本-->
          [root@centos01 ~]# ssh 192.168.100.20 netstat -anpt | grep 8080        <!--遠端主機已經(jīng)運行8080端口-->
          tcp6       0      0 :::8080        :::*         LISTEN      103594/httpd

          3、角色

          將多種不同的tasks的文件集中存儲在某個目錄下,則該目錄就是角色。角色一般存放在 /etc/ansible/roles/ 目錄,可通過ansible的配置文件來調整默認的角色目錄,/etc/ansible/roles/ 目錄下有很多子目錄,其中每一個子目錄對應一個角色,每個角色也有自己的目錄結構,如下圖所示:

          /etc/ansible/roles/為角色集合,該目錄下有自定義的各個子目錄:

          • mariadb:mysql角色;

          • Apache:httpd角色;

          • Nginx:Nginx角色;

          每個角色的定義,以特定的層級目錄結構進行組織。以mariadb(mysql角色)為例:

          • files:存放由copy或script等模塊調用的文件;

          • templates:存放template模塊查找所需要的模板文件的目錄,如mysql配置文件模板;

          • tasks:任務存放的目錄;

          • handlers:存放相關觸發(fā)執(zhí)行的目錄;

          • vars:變量存放的目錄;

          • meta:用于存放此角色元數(shù)據(jù);

          • default:默認變量存放的目錄,文件中定義了此角色使用的默認變量;

          上述目錄中,tasks、handlers、vars、meta、default至少應該包含一個main.yml文件,該目錄下也可以有其他.yml文件,但是需要在main.yml文件中用include指令將其他.yml文件包含進來。

          有了角色后,可以直接在yaml文件(playbook配置文件)中調用角色,示例如下:

          - hosts: web
            remote_user: root
            roles:
            - mysql        <!--調用角色名-->
            - httpd             <!--調用角色名-->

          可以只調用一個角色,也可以調用多個角色,當定義了角色后,用ansible-playbook PALYBOOK文件執(zhí)行即可。

          此時ansible會到角色集合的目錄(/etc/ansible/roles)去找mysql和httpd目錄,然后依次運行mysql和httpd目錄下的所有代碼。

          下面來個安裝及配置mariadb數(shù)據(jù)庫的實例

          需求分析:

          • 要求被管理主機上自動安裝mariadb,安裝完成后上傳提前準備好的配置文件至遠端主機,重啟服務,然后新建testdb數(shù)據(jù)庫,并允許test用戶對其擁有所有權限。

          • 被管理主機配置yum倉庫,自行配置,若被管理端可以連接互聯(lián)網(wǎng),那么直接將yum倉庫指向互聯(lián)網(wǎng)即可。

          鏈接:https://blog.51cto.com/14156658/2461907


          推薦閱讀

          原來Kubernetes部署如此簡單,看完全明白了

          怎么知道誰動了我的 Linux 主機?

          超詳細!K8S 面試題總結

          又一款 Nginx 管理可視化神器!通過界面完成配置監(jiān)控

          速度快,性能好!壓縮神器 zstd

          瀏覽 53
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  偷拍精品一区二区三区 | 久久久久亚洲Av片无码下载蜜桃 | 久久肏屄 | 韩一区二区三区 | 69性爱网|