主頁 >  其他 > 簡單聊一聊Ansible自動化運維

簡單聊一聊Ansible自動化運維

2020-09-21 10:54:29 其他

一、Ansible概述

Ansible是今年來越來越火的一款開源運維自動化工具,通過Ansible可以實作運維自動化,提高運維工程師的作業效率,減少人為失誤,Ansible通過本身集成的非常豐富的模塊可以實作各種管理任務,其自帶模塊超過上千個,更為重要的是,它操作非常簡單,即使小白也可以輕松上手,但它提供的功能又非常豐富,在運維領域,幾乎可以做任何事,

1、Ansible特點

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

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

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

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

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

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

二、Ansible的角色

  • 使用者:如何使用Ansible實作自動化運維?

  • Ansible工具集:Ansible可以實作的功能?

  • 作用物件:Ansible可以影響哪些主機?

1、使用者

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

  • CMDB:CMDB存盤和管理者企業IT架構中的各項配置資訊,是構建ITIL專案的核心工具,運維人員可以組合CMDB和Ansible,通過CMDB直接下發指令呼叫Ansible工具集完成操作者所希望達到的目標;

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

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

  • Playbooks:Users預先撰寫好Ansible Playbooks,通過執行
    Playbooks中預先編排好的任務集,按序執行任務;
    簡單聊一聊Ansible自動化運維

2、Ansible工具集

Ansible工具集包含Inventory、Modules、Plugins和API,其中:Inventory:用來管理設備串列,可以通過分組實作,對組的呼叫直接影響組內的所有主機;Modules:是各種執行模塊,幾乎所有的管理任務都是通過模塊執行的;Plugins:提供了各種附加功能;API:為編程人員提供一個介面,可以基于此做Ansible的二次開發;具體表現如下:

  • Ansible Playbooks:任務腳本,編排定義Ansible任務及的組態檔,由Ansible按序依次執行,通常是JSON格式的YML檔案;

  • Inventory:Ansible管理主機清單;

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

  • Plugins:模塊功能的補充,如連接型別插件、回圈插件、變數插件、過濾插件等,該功能不太常用;

  • API:供第三方程式呼叫的應用程式編程介面;

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

3、作用物件

Ansible的作用物件不僅僅是Linux和非Linux作業系統的主機,也可以作用于各類PUBLIC/PRIVATE、商業和非商業設備的網路設施,

使用者使用Ansible或Ansible-Playbooks時,在服務器終端輸入Ansible的Ad-Hoc命令集或Playbooks后,Ansible會遵循預選安排的規則將Playbooks逐步拆解為Play,再將Play組織成Ansible可以識別的任務,隨后呼叫任務涉及的所有模塊和插件,根據Inventory中定義的主機串列通過SSH將任務集以臨時檔案或命令的形式傳輸到遠程客戶端執行并回傳執行結果,如果是臨時檔案則執行完畢后自動洗掉,

三、Ansible的配置

1、Ansible安裝

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

1)通過YUM安裝Ansible

可以自行從互聯網上直接下載Ansible所需軟體包,本篇博客提供安裝Ansible自動化運維工具所需的依賴軟體包,網盤鏈接:[https://pan.baidu.com/s/1EduwbjYwoj2Pzl9Ye14HEw
提取碼:hsvm])
如果使用本人提供的網盤鏈接,自己建立yum組態檔,掛載光碟這些就不說了啊,畢竟太基礎了!使用互聯網直接安裝即可(實驗環境我這里是關閉防火墻和SELinux的),

[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    <!--如果命令可以正常執行,則表示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)創建SSH免互動登錄

Ansible通過SSH對設備進行管理,而SSH包含兩種認證方式:一種是通過密碼認證,另一種是通過密鑰對驗證,前者必須和系統互動,而后者是免互動登錄,如果希望通過Ansible自動管理設備,應該配置為免互動登錄被管理設備,如果對SSH免互動式登錄不太了解的朋友可以參考博文:Centos 7.4中的遠程訪問控制里面有詳細的介紹,這里就不詳細介紹了!

[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-->

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

2、Ansible配置

Inventory是Ansible管理主機資訊的組態檔,相當于系統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檔案來實作對設備的管理,所以在正式管理之前,首先要撰寫好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之間的所有數字,即表示yj2.kgc.cn、yj3.kgc.cn……的所有主機-->

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

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

1)只對web組中192.168.1.2主機操作,通過--limit引數限定主機的變更,

[root@centos01 ~]# ansible web -m command -a "systemctl status httpd" --limit "192.168.100.20"
192.168.100.20 | SUCCESS | rc=0 >><!--看到SUCCESS就知道成功了,所以以下內容--><!--如果測驗httpd服務,被測驗主機必然已經安裝并啟動了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網段主機操作,這就需要使用到通配符來限定主機的變更了,

[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 >>
.......    <!--此處省略部分內容--><!--實驗環境,效果一樣,這里就不多說了-->

3、Ansible命令

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

[root@centos01 ~]# ansible  <!--連續按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是生產環境中使用非常頻繁的命令之一,主要在以下場景使用:

  • 非固化需求;

  • 臨時一次性操作;

  • 二次開發介面呼叫;

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

Ansible  <host-pattern> [options]

可用選項如下:

  • -v(--verbose):輸出詳細的執行程序資訊,可以得到執行程序所有資訊;

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

  • -f NUM(--forks=NUM):并發執行緒數,默認為5個執行緒;

  • --private-key=PRIVATE_KEY_FILE:指定密鑰檔案;

  • -m NAME,--module-name=NAME:指定執行使用的模塊;

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

  • -a ARGUMENTS(--args=ARGUMENTS):指定模塊引數;

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

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

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

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

②列出web組所有的主機串列,執行命令如下:

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

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

[root@centos01 ~]# ansible web -m command -a "df -hT"192.168.100.30 | SUCCESS | rc=0 >>
檔案系統            型別      容量  已用  可用 已用% 掛載點/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/42tmpfs               tmpfs     183M     0  183M    0% /run/user/0192.168.100.20 | SUCCESS | rc=0 >>
檔案系統            型別      容量  已用  可用 已用% 掛載點/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/42tmpfs               tmpfs     183M     0  183M    0% /run/user/0/dev/sr0            iso9660   4.1G  4.1G     0  100% /mnt

web關鍵字需要提前在/etc/ansible/hosts檔案中定義組,

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

  • 紅色:表示執行程序出現例外;

  • 橘黃顏色:表示命令執行后目標有狀態變化;

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

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命令,用來執行系列任務,其作業機制:通過讀取預先撰寫好的playbook檔案實作集中處理任務,Ansible-playbook命令后跟yml格式的playbook檔案,playbook檔案存放了要執行的任務代碼,命令使用方式如下:

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模塊在遠程主機執行命令,不支持管道、重定向等shell的特性,常用的引數如下:

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

  • creates:在命令運行時創建一個檔案,如果檔案已存在,則不會執行創建任務;

  • removes:在命令運行時移除一個檔案,如果檔案不存在,則不會執行移除任務;

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

在所有主機上運行“ls ./”命令,運行前切換到/home目錄下,操作如下:

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

2)shell模塊

shell模塊在遠程主機執行命令,相當于呼叫遠程主機的Shell行程,然后在該Shell下打開一個子Shell運行命令,和command模塊的區別是它支持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模塊用于復制指定主機檔案到遠程主機的指定位置,常見的引數如下:

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

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

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

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

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

  • content:指出復制到目標主機上的內容,不能和src一起使用,相當于復制content指明的資料到目標檔案中;

示例如下:

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

4)hostname模塊

hostname模塊用于管理遠程主機上的主機名,常用的引數如下:

  • 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機制,對遠程主機管理程式包,常用的引數如下:

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

  • state=present|atest|absent:指明對程式包執行的操作: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"     <!--批量化監聽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          

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

6)service模塊

service模塊為用來管理遠程主機上的服務的模塊,常見的引數如下:

  • 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模塊主要用于管理遠程主機上的用戶賬號,常見的引數如下:

  • name:必選引數,賬號名稱;

  • state=present|absent:創建賬號或者洗掉賬號,present表示創建,absent表示洗掉;

  • system=yes|no:是否為系統賬戶;

  • uid:用戶UID;

  • group:用戶的基本組;

  • groups:用戶的附加組;

  • shell:默認使用的shell;

  • home:用戶的家目錄;

  • mve_home=yes|no:如果設定的家目錄已經存在,是否將已存在的家目錄進行移動;

  • pssword:用戶的密碼,建議使用加密后的字串;

  • comment:用戶的注釋資訊;

  • remore=yes|no:當state=absent時,是否要洗掉用戶的家目錄;

創建用戶示例如下:

[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組的所有主機上新建一個系統用戶,UID為502,
屬組是root,名字是user01,密碼是pwd@123-->

四、playbook組態檔

1、執行組態檔

playbook組態檔使用YAML語法,具有簡潔明了、結構清晰等特點,playbook組態檔類似于shell腳本,是一個YAML格式的檔案,用于保存針對特定需求的任務串列,上面介紹的ansible命令雖然可以完成各種任務,但是當配置一些復雜任務時,逐條輸入就顯得效率非常低下,更有效的方案是在playbook組態檔中放置所有的任務代碼,利用ansible-playbook命令執行該檔案,可以實作自動化運維,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  
                   <!--創建a.yml檔案,寫入以下內容-->---
- hosts: web1                   <!--針對web1組中的操作-->
  remote_user: root                    <!--遠端執行用戶身份為root-->
  tasks:                <!--任務串列-->
        - name: adduser                               <!--任務名稱-->
          user: name=user1 state=present <!--執行user模塊,創建用戶-->
          tags:                <!--創建tag標簽-->
          - aaa                 <!--tag標簽為aaa-->
        - name: addgroup           <!--任務名稱-->
          group: name=root system=yes <!--執行group模塊,創建組-->
          tags:               <!--創建tag標簽-->
          - bbb               <!--tag標簽為bbb-->- hosts: web2               <!--針對web2組中的操作-->
  remote_user: root        <!--遠端執行用戶身份為root-->
  tasks:                     <!--任務串列-->
        - name: copy file to web            <!--任務名稱-->
          copy: src=https://www.cnblogs.com/etc/passwd dest=/home        
          tags:                        
          - ccc                     ...

所有的“-”和“:”后面均有空格,而且注意縮進和對齊,如下圖所示:
簡單聊一聊Ansible自動化運維

playbook的核心元素包含:

  • hosts:任務的目標主機,多個主機用冒號分隔,一般呼叫/etc/ansible/hosts中的分組資訊;

  • remote_user:遠程主機上,運行此任務的默認身份為root;

  • tasks:任務,即定義的具體任務,由模塊定義的操作串列;

  • handlers:觸發器,類似tasks,只是在特定的條件下才會觸發的任務,某任務的狀態在運行后為changed時,可通過“notify”通知給相應的handlers進行觸發執行;

  • roles:角色,將hosts剝離出去,由tasks、handlers等所組成的一種特定的結構集合;

playbook檔案定義的任務需要通過ansible-playbook命令進行呼叫并執行,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):表示只執行指定標簽的任務;

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

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

執行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   
<!--回傳結果表示沒有錯誤,全部可以執行成功,-->[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                <!--執行任務-->[root@centos01 ~]# ssh 192.168.100.20 tail -1 /etc/passwd <!--確認執行結果-->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<!--一般情況先執行“-C”命令進行預測驗,沒有問題后再執行.yml檔案,-->

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

2、觸發器

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

  • handlers是Ansible提供的條件機制之一,handlers和task很類似,但是它只在被task通知的時候才會觸發執行,

  • handlers只會在所有任務執行完成后執行,而且即使被通知了很多次,它也只會執行一次,handlers按照定義的順序依次執行,

handlers觸發器的使用示例如下:

[root@centos01 ~]# ssh 192.168.100.20 netstat -anpt | grep 80                  <!--查詢100.20主機監聽的埠-->tcp6       0      0 :::80         :::*          LISTEN      94858/httpd 
<!--可以看到是監聽80埠,現在通過腳本改為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:                             <!--配置觸發條件-->
                - restart httpd server    <!--完成該任務后呼叫名為“restart httpd server”的觸發器-->
  handlers:                                      <!--配置觸發器-->
        - name: restart httpd server  <!--指定觸發器名字,要和上面“notify”指定的觸發器名字一樣-->
          service: name=httpd state=restarted<!--觸發任務為重啟httpd服務-->...<!--撰寫完成后,保存退出即可-->[root@centos01 ~]# ansible-playbook -C /etc/ansible/httpd.yml          <!--進行預測驗-->[root@centos01 ~]# ansible-playbook  /etc/ansible/httpd.yml               <!--執行腳本-->[root@centos01 ~]# ssh 192.168.100.20 netstat -anpt | grep 8080        <!--遠端主機已經運行8080埠-->tcp6       0      0 :::8080        :::*         LISTEN      103594/httpd

3、角色

將多種不同的tasks的檔案集中存盤在某個目錄下,則該目錄就是角色,角色一般存放在/etc/ansible/roles/目錄,可通過ansible的組態檔來調整默認的角色目錄,/etc/ansible/roles/目錄下有很多子目錄,其中每一個子目錄對應一個角色,每個角色也有自己的目錄結構,如下圖所示:
簡單聊一聊Ansible自動化運維

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

  • mariadb:mysql角色;

  • Apache:httpd角色;

  • Nginx:Nginx角色;

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

  • files:存放由copy或script等模塊呼叫的檔案;

  • templates:存放template模塊查找所需要的模板檔案的目錄,如mysql組態檔模板;

  • tasks:任務存放的目錄;

  • handlers:存放相關觸發執行的目錄;

  • vars:變數存放的目錄;

  • meta:用于存放此角色元資料;

  • 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檔案執行即可,此時ansible會到角色集合的目錄(/etc/ansible/roles)去找mysql和httpd目錄,然后依次運行mysql和httpd目錄下的所有代碼,

下面來個安裝及配置mariadb資料庫的實體

需求分析:

  • 要求被管理主機上自動安裝mariadb,安裝完成后上傳提前準備好的組態檔至遠端主機,重啟服務,然后新建testdb資料庫,并允許test用戶對其擁有所有權限,

  • 被管理主機配置yum倉庫,自行配置,若被管理端可以連接互聯網,那么直接將yum倉庫指向互聯網即可,

開始在ansible服務器上實施:

[root@centos01 /]# mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}
mkdir: 已創建目錄 "/etc/ansible/roles/mariadb"
mkdir: 已創建目錄 "/etc/ansible/roles/mariadb/files"
mkdir: 已創建目錄 "/etc/ansible/roles/mariadb/tasks"
mkdir: 已創建目錄 "/etc/ansible/roles/mariadb/handlers"
[root@ansible /]# cd /etc/ansible/roles/mariadb/tasks/ <!--切換至指定目錄-->[root@centos01 tasks]# ls
[root@centos01 tasks]# vim main.yml  <!--撰寫main.yml檔案-->---
- name: install mariadb
  yum: name=mariadb-server state=present
- name: move config file
  shell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak"
- name: provide a new config file
  copy: src=https://www.cnblogs.com/createwell/p/my.cnf dest=/etc/my.cnf
- name: reload mariadb
  shell: systemctl restart mariadb
- name: create database testdb
  shell: mysql -u root -e"create database testdb;grant all on testdb.* to 'test'@'192.168.100.%' identified by 'test123';flush privileges;"
  notify:
  - restart mariadb
...<!--撰寫完畢,保存退出即可-->[root@centos01 tasks]# cd ../handlers/ <!--切換至觸發器目錄-->[root@centos01 handlers]# vim main.yml <!--撰寫main.yml檔案,寫入以下內容-->---
- name: restart mariadb
  service: name=mariadb state=restarted
...<!--撰寫完畢,保存退出即可-->[root@centos01 handlers]# cd ../files <!--進入mariadb角色檔案夾的files-->[root@centos01 files]# pwd
/etc/ansible/roles/mariadb/files
[root@centos01 files]# ls  <!--準備好配置好的mysql資料庫組態檔,需要分發到遠程主機的-->my.cnf
[root@centos01 files]# cd /etc/ansible/
[root@centos01 ansible]# vim mariadb.yml  <!--撰寫.yml檔案-->---
- hosts: web
  remote_user: root
  roles:
  - mariadb
...<!--撰寫完畢,保存退出即可-->[root@centos01 ansible]# ansible-playbook -C mariadb.yml          <!--進行預檢測-->
                                  ........................          <!--省略部分內容-->PLAY RECAP ***************************************************************************
192.168.100.20                : ok=3    changed=1    unreachable=0    failed=0 
<!--回傳結果表示沒問題-->[root@centos01 ansible]# ansible-playbook mariadb.yml   <!--執行安裝-->

待安裝完成后,在遠端主機上自行測驗,


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/96460.html

標籤:其他

上一篇:好用的黑白配色法

下一篇:Spring Boot 2 實戰:如何自定義 Servlet Filter

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more