久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

python中Ansible模塊的Playbook的具體使用

瀏覽:74日期:2022-07-24 09:27:15

Playbook

在上一節(jié)中,我們?cè)敿?xì)介紹了Ansible提供的一些常用模塊??梢钥吹?,Ansible中的每個(gè)模塊專(zhuān)注于某一方面的功能。雖然每個(gè)模塊實(shí)現(xiàn)的功能都比較簡(jiǎn)單,但是,將各個(gè)模塊組合起來(lái)就可以實(shí)現(xiàn)比較復(fù)雜的功能。在Ansible中,將各個(gè)模塊組合起來(lái)的文件是一個(gè)YAML格式的配置文件。這個(gè)配置文件,在Ansible中稱(chēng)為Playbook。

在這一節(jié)中,我們將循序漸進(jìn)地介紹Ansible中的Playbook,我們將首先介紹Playbook的定義,然后介紹如何使用Playbook完成遠(yuǎn)程服務(wù)器部署,之后詳細(xì)介紹Playbook的基本語(yǔ)法,使用Playbook的基本講法就能夠完成大部分的部署任務(wù)。

在這一節(jié)中,找們將介紹如何使用Playbook的基本語(yǔ)法完成nginx與MongoDB的部署,最后,我們介紹了部分Playbook的高級(jí)語(yǔ)法。

1、Playbook的定義

Playbook不同于其他使用單個(gè)模塊操作遠(yuǎn)程服務(wù)器,Playbook的功能更加強(qiáng)大。如果只使用Playbook的基本功能,那么,Playbook是一個(gè)非常簡(jiǎn)單的配、管理和部署系統(tǒng)。此外,Playbook也可以實(shí)現(xiàn)各種高級(jí)功能,如指定任務(wù)的執(zhí)行順序,委派其他主機(jī)來(lái)執(zhí)行某一個(gè)任務(wù),與監(jiān)控服務(wù)器和負(fù)載均衡組件進(jìn)行交互等。

有一個(gè)非常恰當(dāng)?shù)谋扔?,Ansible中的模塊類(lèi)似于Linux下的命令,Ansible中的Playbook類(lèi)似于Linux下的Shell腳本文件。Shell腳本文件將各個(gè)Linux命令組合起來(lái),以此實(shí)現(xiàn)復(fù)雜的功能,Playbook將各個(gè)模塊組合起來(lái)也可以實(shí)現(xiàn)復(fù)雜的部署功能。在shell腳本中,除了調(diào)用Linux命令以外,還有一些基本的語(yǔ)法,如變量定義、if語(yǔ)句、for循環(huán)等。在Playbook中,一方面通過(guò)YAML格式進(jìn)行定義提高Playbook的可讀性、可維護(hù)性,降低工程師的學(xué)習(xí)負(fù)擔(dān);另一方面,Ansible提供了若干可以應(yīng)用在Playbook中的選項(xiàng),以便工程師實(shí)現(xiàn)更加高級(jí)的功能。

一個(gè)Playbook可以包含一到多個(gè)Play,每一個(gè)Play是一個(gè)完整的部署任務(wù)。在Play中,我們需要指定對(duì)哪些遠(yuǎn)程服務(wù)器執(zhí)行操作,以及對(duì)這些遠(yuǎn)程服務(wù)器執(zhí)行哪些操作。

下面是一個(gè)名為first_playbook.yml的Playbook。在這個(gè)Playbook中,我們定義了兩個(gè)Play,前者用來(lái)在數(shù)據(jù)庫(kù)服務(wù)器上部署MongoDB,后者用來(lái)在web服務(wù)器上部署“應(yīng)用”。這里只是為了對(duì)Playbook進(jìn)行演示,并沒(méi)有真的部署應(yīng)用。

[root@python ~]# vim first_playbook.yml---- hosts: dbservers become: yes become_method: sudo tasks: - name: install mongodb yum: name=mongodb-server state=present- hosts: webservers tasks: - name: copy file copy: src=/tmp/data.txt dest=/tmp/data.txt - name: change mode file: dest=/tmp/data.txt mode=655 owner=root group=root

這個(gè)Playbook中包含了兩個(gè)Play。一個(gè)Playbook可以包含一到多個(gè)Play,所以即使Playbook中值包含一個(gè)Play,也需要使用列表的形式進(jìn)行定義。在YAML語(yǔ)法中,“- hosts”前面的“-”表示定義列表。

在Ansible中,一個(gè)Play必須包含以下兩項(xiàng):

1. hosts:需要對(duì)哪些遠(yuǎn)程服務(wù)器執(zhí)行操作2. tasks:需要在這些服務(wù)器上執(zhí)行的任務(wù)列表

例如,對(duì)web服務(wù)器進(jìn)行部署時(shí),我們僅僅使用了hosts和tasks兩個(gè)選項(xiàng)。前者表示對(duì)哪些服務(wù)器執(zhí)行操作,后者表示對(duì)服務(wù)器執(zhí)行哪些操作。在部署數(shù)據(jù)庫(kù)服務(wù)器時(shí)需要安裝軟件,因此使用了become與become_method兩個(gè)選項(xiàng),用來(lái)表示使用管理員的身份去安裝MongoDB數(shù)據(jù)庫(kù)。

一個(gè)Play可以包含一到多個(gè)task,因此task也必須以YAML的列表形式進(jìn)行定義。可以看到,在這個(gè)例子中,對(duì)數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行操作時(shí)僅包含了一個(gè)task,對(duì)web服務(wù)器進(jìn)行部署時(shí)包含了兩個(gè)task。

在Ansible中,task有兩種定義形式:

1. action:module options

2. module:options

前一種形式是Ansible的舊版本語(yǔ)法,第2種形式是新版本的語(yǔ)法,直接使用模塊的名稱(chēng)作為鍵,使用模塊的參數(shù)作為值。如下所示:

- name: install httpd yum: name=httpd update_cache=yes state=present

在安裝Apache的例子中,“name=httpd update_cache=yes state=present”是一個(gè)完整的字符串,而不是一個(gè)字典。只是字符串的值是一個(gè)“key=value”形式的參數(shù)。

在參數(shù)較多時(shí),為了增加Playbook的可讀性,我們也可以像下面這樣定義一個(gè)task:

- name: install httpd yum: > name=httpd update_cache=yes state=present

在Ansible中,當(dāng)參數(shù)較長(zhǎng)時(shí),除了使用“>”進(jìn)行折疊換行以外,也可以使用縮進(jìn)字塊的形式:

- name: install httpd yum: name: httpd update_cache: yes state: present

雖然從字面來(lái)看,這兩種指定參數(shù)的方式相差不大。但是,從YAML的語(yǔ)法來(lái)說(shuō),這是完全不同的兩個(gè)方法。前者是一個(gè)比較長(zhǎng)的字符串,后者是一個(gè)字典。

task的定義中,name是可選的。所以,像下面這樣定義task也是完全合法的:

- yum: name=httpd update_cache=yes state=present

name的作用在于,執(zhí)行Playbook時(shí)作為注釋進(jìn)行顯示,以便使用者知道當(dāng)前執(zhí)行到哪一步。因此,在定義task時(shí),一般都會(huì)定義name字段。

在實(shí)際工作中,雖然一個(gè)Playbook可以包含多個(gè)Play,但是為了Playbook的可讀性和可維護(hù)性,我們一般只會(huì)在Playbook中編寫(xiě)一個(gè)Play。例如,對(duì)于這里的例子,我們可以將first_playbook.yml這個(gè)Playbook拆分成兩個(gè)Playbook,分別名為db.yml與web.yml。其中,db.yml文件包含了與數(shù)據(jù)庫(kù)服務(wù)器相關(guān)的部署任務(wù),web.yml文件包含了與web服務(wù)器相關(guān)的部署任務(wù)。

當(dāng)我們需要部署數(shù)據(jù)庫(kù)服務(wù)器和web服務(wù)器時(shí),可以先執(zhí)行db.yml文件,再執(zhí)行web.yml文件。除此之外,Ansible還提供了一種便捷方式來(lái)處理這種情況。例如,我們可以編寫(xiě)一個(gè)名為all.yml的Playbook,它的內(nèi)容如下:

---- include: db.yml- include: web.yml

include選項(xiàng)是Ansible提供的,用于在一個(gè)Playbook中導(dǎo)入其他Playbook。在Ansible中,只需要使用include選項(xiàng)導(dǎo)入其他Playbook文件,執(zhí)行這個(gè)Playbook時(shí),被導(dǎo)入的Playbook便會(huì)依次執(zhí)行。

上面詳細(xì)介紹了Ansible的Playbook定義,這個(gè)Playbook定義雖然比較簡(jiǎn)單,但是,是一個(gè)比較完整的Playbook例子。在實(shí)際工作中使用的Playbook也不會(huì)比這個(gè)Playbook復(fù)雜很多。

我們接下來(lái)將介紹如何使用ansible-playbook命令執(zhí)行Playbook,然后再介紹Playbook的其他語(yǔ)法。

2、ansible拆分playbook.yml

查看一下所需文件是否正確

[root@python ~]# cat hosts 127.0.0.1[webservers]192.168.1.60[dbservers]192.168.1.80[common:children]dbserverswebservers[root@python ~]# cat /etc/ansible/ansible.cfg [defaults]remote_user = rootremote_port = 22inventory = /root/hosts

拆分playbook.yml

[root@python ~]# cat db.yml ---- hosts: dbservers become: yes become_method: sudo tasks: - name: install mongodb yum: name=mongodb-server state=present #mongodb-server 可歡成其他服務(wù)如(git)[root@python ~]# cat web.yml ---- hosts: webservers tasks: - name: copy file copy: src=/tmp/data.txt dest=/opt/data.txt - name: change mode file: dest=/opt/data.txt mode=655 owner=root group=root[root@python ~]# cat all.yml ---- include: db.yml- include: web.yml[root@python ~]# touch /tmp/data.txt[root@python ~]# touch /opt/data.txt

3、使用Ansible-playbook執(zhí)行Playbook

上一小節(jié)中,我們簡(jiǎn)單地介紹了Playbook的定義。那么,當(dāng)我們有了一個(gè)Playbook文件以后,如何執(zhí)行這個(gè)文件完成應(yīng)用部署呢?我們知道,Ansible安裝完成以后存在多個(gè)可執(zhí)行的命令行工具,其中,ansible-playbook便是用于執(zhí)行Playbook的命令行工具。

ansible-playbook的執(zhí)行方式如下:

ansible-playbook first_playbook.yml

ansible-playbook命令也有若干命令行選項(xiàng),其中,有部分選項(xiàng)與ansible命令相同。Ansible中也存在一些ansible-playbook特有的命令行選項(xiàng)。

ansible-playbook命令與ansible命令相同的命令行選項(xiàng):

-T --timeout:建立SSH連接的超時(shí)時(shí)間--key-file --private-key:建立SSH連接的私鑰文件-i --inventory-file:指定Inventory文件,默認(rèn)是/etc/ansible/hosts-f --forks:并發(fā)執(zhí)行的進(jìn)程數(shù),默認(rèn)為5--list-hosts:playbooks匹配的服務(wù)器列表。

ansible-playbook也有一個(gè)名為--list-hosts的選項(xiàng),該選項(xiàng)的作用是列出匹配的服務(wù)器列表。例如,在我們這個(gè) Playbook的例子中,hosts文件的內(nèi)容如下:

127.0.0.1[webservers]192.168.1.60[dbservers]192.168.1.80[common:children]dbserverswebservers

我們知道,Ansible中的Play定義了需要對(duì)哪些服務(wù)器執(zhí)行哪些操作,也就是說(shuō),每一個(gè)Play都可以指定匹配的遠(yuǎn)程服務(wù)器。在我們這個(gè)Playbook的例子中,對(duì)數(shù)據(jù)庫(kù)服務(wù)器安裝MongoDB,對(duì)web服務(wù)器部署“應(yīng)用“。因此,ansible-playbook命令與ansible命令的--list-hosts選項(xiàng)輸出的結(jié)果將會(huì)大不相同。ansible-playbook命令的--list-hosts選項(xiàng)輸出的結(jié)果如下:

[root@python ~]# ansible-playbook all.yml --list-hosts

python中Ansible模塊的Playbook的具體使用

ansible-playbook命令有一些特有的選項(xiàng),如下所示:

--list-tasks:列出任務(wù)列表--step:每執(zhí)行一個(gè)任務(wù)后停止,等待用戶(hù)確認(rèn)--syntax-check:檢查Playbook語(yǔ)法-C --check:檢查當(dāng)前這個(gè)Playbook是否會(huì)修改遠(yuǎn)程服務(wù)器,相當(dāng)于預(yù)測(cè)Playbook的執(zhí)行結(jié)果。

這里的幾個(gè)選項(xiàng),除了--step以外,其他幾個(gè)選項(xiàng)都不會(huì)執(zhí)行Playbook中的任務(wù)。這些選項(xiàng)存在主要是為了便于調(diào)試Playbook。例如,--list-tasks選項(xiàng),該選項(xiàng)用來(lái)顯示當(dāng)前Playbook中的任務(wù)列表。當(dāng)Playbook比較大時(shí),可以通過(guò)這個(gè)方式快速查看任務(wù)列表。如下所示:

[root@python ~]# ansible-playbook all.yml --list-tasksplaybook: all.yml play #1 (dbservers): dbservers TAGS: [] tasks: install mongodb TAGS: [] play #2 (webservers): webservers TAGS: [] tasks: copy file TAGS: [] change mode TAGS: []

當(dāng)我們查看任務(wù)列表時(shí),任務(wù)的名稱(chēng)就是task的name字段。因此,name的定義需要具有較好的描述性,讓使用者通過(guò)名字就能知道該任務(wù)需要做什么事情。

--step選項(xiàng)類(lèi)似于編程語(yǔ)言中的單步調(diào)試。當(dāng)我們使--step選項(xiàng)執(zhí)行Playbook時(shí),ansible-playbook在每一個(gè)任務(wù)之前都會(huì)停住,等侍用戶(hù)輸入yes,、no或continue。如下所示:

[root@python ~]# ansible-playbook all.yml --step[DEPRECATION WARNING]: ’include’ for playbook includes. You should use ’import_playbook’ instead. This feature will be removed in version 2.12. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.PLAY [dbservers] ***************************************************************Perform task: TASK: Gathering Facts (N)o/(y)es/(c)ontinue: yPerform task: TASK: Gathering Facts (N)o/(y)es/(c)ontinue: *********************TASK [Gathering Facts] *********************************************************ok: [192.168.1.80]Perform task: TASK: install mongodb (N)o/(y)es/(c)ontinue: yPerform task: TASK: install mongodb (N)o/(y)es/(c)ontinue: *********************TASK [install mongodb] *********************************************************changed: [192.168.1.80]PLAY [webservers] **************************************************************Perform task: TASK: Gathering Facts (N)o/(y)es/(c)ontinue: yPerform task: TASK: Gathering Facts (N)o/(y)es/(c)ontinue: *********************TASK [Gathering Facts] *********************************************************ok: [192.168.1.60]Perform task: TASK: copy file (N)o/(y)es/(c)ontinue: yPerform task: TASK: copy file (N)o/(y)es/(c)ontinue: ***************************TASK [copy file] ***************************************************************changed: [192.168.1.60]Perform task: TASK: change mode (N)o/(y)es/(c)ontinue: yPerform task: TASK: change mode (N)o/(y)es/(c)ontinue: *************************TASK [change mode] *************************************************************changed: [192.168.1.60]PLAY RECAP *********************************************************************192.168.1.60: ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 192.168.1.80: ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

輸入yes以后,任務(wù)將會(huì)繼續(xù)執(zhí)行,并在下一個(gè)任務(wù)時(shí)停止,等待用戶(hù)繼續(xù)輸入。當(dāng)我們輸入continue時(shí),Ansible會(huì)執(zhí)行完當(dāng)前這個(gè)Play,當(dāng)執(zhí)行到下一個(gè)Play時(shí)再停止,并等待用戶(hù)輸入。

二、Playbook的詳細(xì)語(yǔ)法

到目前為止,我們已經(jīng)學(xué)習(xí)了如何編寫(xiě)Playbook以及如何運(yùn)行Playbook。但是,我們僅僅介紹了最簡(jiǎn)單的Playbook。在這一節(jié)中,我們將會(huì)介紹Playbook是如何通過(guò)不同的選項(xiàng)提供豐富多樣的功能。靈活使用這些選項(xiàng),能夠編寫(xiě)出形式各異的Playbook,以此應(yīng)對(duì)自動(dòng)部署中的各種情況。

在定義Play時(shí),只有hosts與tasks是必選選項(xiàng),其他選項(xiàng)都是根據(jù)需要添加的。在這一小節(jié)中。我們將介紹Playbook提供的不同功能,以Playbook的功能為線(xiàn)索,介紹Play與task中可以使用的選項(xiàng)。

(1)權(quán)限

在Ansible中,默認(rèn)使用當(dāng)前用戶(hù)連接遠(yuǎn)程服務(wù)器執(zhí)行操作。我們也可以在anaible.cfg文件中配置連接遠(yuǎn)程服務(wù)器的默認(rèn)用戶(hù)。此外,如果是不同的用戶(hù)使用不同類(lèi)型的遠(yuǎn)程服務(wù)器,那么也可以在Playbook的Play定義中指定連接遠(yuǎn)程服務(wù)器的用戶(hù)。例如,我們可以指定執(zhí)行Play的用戶(hù):

---- hosts: webservers remote_user: root

用戶(hù)可以細(xì)分每一個(gè)task,如下所示:

---- hosts: werbservers remote_user: root tasks: - name: test connection ping: remote_user: yourname

很多時(shí)候,我們需要的不是以某個(gè)特定用戶(hù)連接遠(yuǎn)程服務(wù)器,而是在需要更高級(jí)別的權(quán)限時(shí),使用管理員身份去執(zhí)行操作。在ansible中,可以通過(guò)become與become_ method選項(xiàng)實(shí)現(xiàn):

---- hosts: werbservers remote_user: root become: yes

與remote_user選項(xiàng)類(lèi)似,我們也可以為單個(gè)任務(wù)使用管理員權(quán)限,如下所示:

---- hosts: werbservers remote_user: yourname tasks: - name: installed nginx service: name=nginx state=started become: yes become_method: sudo

實(shí)例

先修改遠(yuǎn)程服務(wù)器中test的權(quán)限為(0:0)

[root@192 ~]# vim /etc/passwdtest:x:0:0::/home/test:/bin/bash[root@python ~]# chown test:root /etc/ansible/*[root@python ~]# su test[test@python root]$ cd [test@python ~]$ vim hosts[db]192.168.1.60[test@python ~]$ vim db.yml---- hosts: db remote_user: root #遠(yuǎn)程服務(wù)器登陸的用戶(hù) tasks: - name: installed nginx become: yes become_method: sudo ping: remote_user: root #遠(yuǎn)程服務(wù)器登陸的用戶(hù)[test@python ~]$ vim /etc/ansible/ansible.cfg [defaults]inventory = /home/test/hosts

執(zhí)行一下

[test@python ~]$ sudo ansible-playbook db.yml --stepWe trust you have received the usual lecture from the local SystemAdministrator. It usually boils down to these three things: #1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility.[sudo] password for test: PLAY [db] **********************************************************************Perform task: TASK: Gathering Facts (N)o/(y)es/(c)ontinue: yPerform task: TASK: Gathering Facts (N)o/(y)es/(c)ontinue: *********************TASK [Gathering Facts] *********************************************************Enter passphrase for key ’/root/.ssh/id_rsa’: ok: [192.168.1.60]Perform task: TASK: installed nginx (N)o/(y)es/(c)ontinue: Perform task: TASK: installed nginx (N)o/(y)es/(c)ontinue: *********************PLAY RECAP *********************************************************************192.168.1.60: ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

(2)通知

在Ansible中,模塊是冪等的。例如,我們要在遠(yuǎn)程服務(wù)器上創(chuàng)建一個(gè)用戶(hù),如果該用戶(hù)已經(jīng)存在,那么Ansible不會(huì)將該用戶(hù)刪除以后重新創(chuàng)建,而是直接返回成功,并通過(guò)changed字段表示是否對(duì)遠(yuǎn)程服務(wù)器進(jìn)行了修改。

考慮這樣一種需求:我們要通過(guò)Ansible修改Apache的配置文件,并重啟Apache服務(wù),使得新的配置文件生效。由于Ansible的模塊是冪等的,當(dāng)我們修改Apache的配置文件時(shí),如果配置文件的內(nèi)容已經(jīng)與我們想要修改成的內(nèi)容一樣(例如,不小心將Ansible執(zhí)行了兩次的情況),那么,Ansible就什么也不做。既然Apache的配置文件并沒(méi)有真的被修改,那么我們也不應(yīng)該去重啟Apache的服務(wù)器。在Ansible中,通過(guò)notify與handler機(jī)制來(lái)實(shí)現(xiàn)這里的功能。

在下面的例子中,我們首先嘗試安裝Apache,然后修改Apache的配置文件。如果配置文件被修改,則通過(guò)notify選項(xiàng)通知handler進(jìn)行后續(xù)處理。

handler是Ansible提供的條件機(jī)制,與tasks比較類(lèi)似,都是去執(zhí)行某些操作。但是,handler只有在被notify觸發(fā)以后才會(huì)執(zhí)行,如果沒(méi)有被觸發(fā)則不會(huì)執(zhí)行。在Playbook中,如果task后面存在notify選項(xiàng),那么,當(dāng)Ansible識(shí)別到task改變了系統(tǒng)的狀態(tài),就會(huì)通過(guò)notify去觸發(fā)handler。

Ansibie是通過(guò)什么條件判斷notify觸發(fā)的是哪一個(gè)handler呢?很簡(jiǎn)單,在Ansible中,task使用handler的名字作為參數(shù),以此來(lái)觸發(fā)特定的handler。例如,在我們這里的例子中,notify觸發(fā)的是“restart apache'這個(gè)handler, handlers中也存在一個(gè)名為' restart apache“的handler。

---- hosts: webservers tasks: - name: ensure apache is at the latest version yum: name=httpd state=latest - name: write the apache config file template: src=/srv/httpd.j2 dest=/etc/httpd.conf notify: - restart apache - name: ensure apache is running service: name=httpd state=started handlers: - name: restart apache service: name=httpd state=restarted

需要注意的是,handler只會(huì)在所有task執(zhí)行完后執(zhí)行。并且,即便一個(gè)handler被觸發(fā)多次,它也只會(huì)執(zhí)行一次。handler并不是在被觸發(fā)時(shí)立即執(zhí)行,而是按照Play中定義的順序執(zhí)行。一般情況下,handler都位于Play的最后,即在所有任務(wù)執(zhí)行完成以后再執(zhí)行。

Ansible官方文檔提到handler的唯一用途,就是重啟服務(wù)與服務(wù)器,正如找們這個(gè)例子所演示的。

在這個(gè)例子中,我們還用到T了template模塊。template模塊用以渲染Jinja模板。

(3)變量

在Inventory管理章節(jié),我們已經(jīng)介紹了如何定義變量。在Ansible中,還有其他幾種定義變量的方式。對(duì)于簡(jiǎn)單的Playbook,最直接的方式是將變量定義在Playbook的vars選項(xiàng)中。如下所示:

- hosts: dbservers vars: mysql_port: 3307

在Playbook中定義變量,可以在模板渲染時(shí)使用。例如:Ansible官方給出的例子中,MySQL配置文件的部分模板如下:

[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sockuser=mysqlport={{ mysql_port }}

當(dāng)變量較少的時(shí)候,定義在vars選項(xiàng)中完全沒(méi)有問(wèn)題。當(dāng)變量較多時(shí),可以將變量保存在一個(gè)獨(dú)立的文件中,并通過(guò)vars_files選項(xiàng)引用該文件。如下所示:

---- hosts: all vars: favcolor: blue vars_files: - /vars/external_vars.yml tasks: - name: this is just a placeholer command: /bin/echo foo

保存變量的文件是一個(gè)簡(jiǎn)單的YAML格式的字典,如下所示:

---# in th above example, this would be vars/external_vars.ymlsomevar: somevaluepassword: magic

在shell腳本中,我們可以通過(guò)獲取上一條命令的返回碼判斷命令是否執(zhí)行成功。在Ansible中,我們也可以獲取任務(wù)的執(zhí)行結(jié)果,將任務(wù)的執(zhí)行結(jié)果保存在一個(gè)變最中,并在之后引用這個(gè)變量。這樣的變量在Ansible中使用register選項(xiàng)獲取,也稱(chēng)為注冊(cè)變量。

例如,在下面這個(gè)例子中,我們首先執(zhí)行/usr/bin/foo命令,并通過(guò)register選項(xiàng)獲取命令的執(zhí)行結(jié)果,將結(jié)果保存在foo_result中。在之后的task中,使用這個(gè)變量名引用/usr/bin/foo命令的執(zhí)行結(jié)果。

- hosts: web_servers tasks: - shell: /usr/bin/foo register: foo_result ignore_errors: True - shell: /usr/bin/bar when: foo_result == 5

這個(gè)例子還涉及了兩個(gè)新的選項(xiàng),分別是ignore_errors與when。前者表示忽略當(dāng)前task中的錯(cuò)誤,后者是一個(gè)條件語(yǔ)句,只有條件為真時(shí)才會(huì)執(zhí)行這個(gè)task。

(4)Facts變量

在Ansible中,還有一些特殊的變量,這些變量不需要我們進(jìn)行任何設(shè)置就可以直接使用,這樣的變量稱(chēng)為Facts變量。Facts變量是Ansible執(zhí)行遠(yuǎn)程部署之前從遠(yuǎn)程服務(wù)器中獲取的系統(tǒng)信息,包括服務(wù)器的名稱(chēng)、IP地址、操作系統(tǒng)、分區(qū)信息、硬件信息等。Facts變量可以配合Playbook實(shí)現(xiàn)更加個(gè)性化的功能需求。例如,將MongoDB數(shù)據(jù)庫(kù)的數(shù)據(jù)保存在/var/mongo-<hostname>/目錄下。

我們可以通過(guò)setup模塊查看Facts變量的列表,如下所示:

ansible all -m setup

有了Facts變量以后,如何在Ansible中使用它們呢?答案是直接使用。我們可以在Playbook中直接通過(guò)變量的名字引用變量,也可以在Jinja2模板中通過(guò)變量的名字引用變量。下面是一個(gè)名為test_facts.yml的Playbook。在這個(gè)Playbook中,我們輸出了操作系統(tǒng)的類(lèi)型,并且只有在操作系統(tǒng)為“RedHat'類(lèi)操作系統(tǒng)時(shí)才會(huì)執(zhí)行安裝操作。

---- hosts: dbservers tasks: - shell: echo {{ ansible_os_family }} register: myecho - debug: var=myecho.stdout_lines - name: install git on Red Hat Linux yum: name=git state=installed when: ansible_os_family == 'RedHat'

setup模塊為了輸出結(jié)果的可讀性,對(duì)模塊的輸出進(jìn)行了歸類(lèi)和整理。因此,當(dāng)我們要訪(fǎng)問(wèn)復(fù)雜變量的子屬性時(shí),需要使用嵌套結(jié)構(gòu)。例如,我們可以通過(guò)下面兩種方式訪(fǎng)問(wèn)Ansible中的ipv4地址:

ansible_ens33[’ipv4’][’address’]ansible_ens33.ipv4.address

訪(fǎng)問(wèn)復(fù)雜的變量的Playbook:

---- hosts: dbservers gather_facts: yes tasks: - shell: echo {{ ansible_ens33[’ipv4’][’address’] }} register: myecho - debug: var=myecho.stdout_lines - shell: echo {{ ansible_ens33.ipv4.address }} register: myecho - debug: var=myecho.stdout_lines

在實(shí)際工作中,我們一般會(huì)在Jinja2模板中引用Facts變量。使用方式與這里的例子一樣,為了節(jié)省篇幅就不再贅述了。

在Playbook中,可以通過(guò)gather_ facts選項(xiàng)控制是否收集遠(yuǎn)程服務(wù)器的信息。該選項(xiàng)默認(rèn)取值為yes,如果確定不需要用到遠(yuǎn)程服務(wù)器的信息,可以將該選項(xiàng)設(shè)置為no,以此提高Ansible部署的效率。如下所示:

---- hosts: dbservers gather_factes: no tasks:

(5)循環(huán)

- name: Install Mysql package yum: name={{ item }} state=installed with_items: - mysql-server - MySQL-python - libselinux-python - libsemanage-python

(6)條件

有時(shí)候,一個(gè)任務(wù)是否執(zhí)行取決于一個(gè)變量的取值,或者上一個(gè)任務(wù)的執(zhí)行結(jié)果,這個(gè)時(shí)候找們就需要條件語(yǔ)句。再或者說(shuō),在循環(huán)的時(shí)候想要跳過(guò)一些特定的元素,在服務(wù)器部署時(shí)只對(duì)某些特定的操作系統(tǒng)進(jìn)行操作。所有這些行為都可以使用條件語(yǔ)句解決。Ansible的Playbook不是一門(mén)編程語(yǔ)言,因此沒(méi)有相應(yīng)的條件語(yǔ)句,不過(guò)Ansible提供了一個(gè)類(lèi)似的選項(xiàng)。

在Playbook中可以通過(guò)when選項(xiàng)執(zhí)行條件語(yǔ)句,when就類(lèi)似于編程語(yǔ)言中的if語(yǔ)句。

下面是一個(gè)簡(jiǎn)單的when選項(xiàng)使用示例:

# 查看Linux系統(tǒng)版本:cat /etc/redhat-releasetasks: - name: '系統(tǒng)關(guān)機(jī)' command: /sbin/shutdown -t now when: ansible_os_family == 'RedHat'

when選項(xiàng)也支持多個(gè)條件語(yǔ)句,下面是一個(gè)YAML格式的多條件:

tasks: - name: 'shutdown CentOS 7 systems' command: /sbin/shutdown -t now when: - ansible_distribution == 'CentOS' - ansible_distribution_major_version == '7'

對(duì)于更復(fù)雜的條件可以使用and、or與括號(hào)進(jìn)行定義:

tasks: - name: 'shutdown CentOS 7 and Debian 6 systems' command: /sbin/shutdown -t now when: (ansible_distribution == 'CentOS' and ansible_distribution_major_version == '7') or (ansible_distribution == 'Debian' and ansible_distribution_major_version == '6')

在when選項(xiàng)中可以讀取變量的取值,例如:

vars: epic: truetasks: - shell: echo 'This certainly is epic!' when: epic

when選項(xiàng)可以與循環(huán)一起使用,以實(shí)現(xiàn)過(guò)濾的功能:

tasks: - command: echo {{ item }} with_items: [0, 2, 4, 6, 8, 10] when: item > 5

(7)任務(wù)執(zhí)行策略

在Ansible中,Playbook的執(zhí)行是以task為單位進(jìn)行的。Ansible默認(rèn)使用5個(gè)進(jìn)程對(duì)遠(yuǎn)程服務(wù)器執(zhí)行任務(wù)。在默認(rèn)情況的任務(wù)執(zhí)行策略( linear)中,Ansible首先執(zhí)行task1,并且等到所有服務(wù)器執(zhí)行完task1以后再開(kāi)始執(zhí)行task2,以此類(lèi)推。從Ansible 2.0開(kāi)始,Ansible支持名為free的任務(wù)執(zhí)行策略,允許執(zhí)行較快的遠(yuǎn)程服務(wù)器提前完成Play的部署,不用等待其他遠(yuǎn)程服務(wù)器一起執(zhí)行task。如下所示:

- hosts: all strategy: free tasks: ……

在這一節(jié)中,我們比較詳細(xì)地介紹了Ansible中的Playbook選項(xiàng)。在Ansible中,Play與task都有很多選項(xiàng),每個(gè)選項(xiàng)可以實(shí)現(xiàn)不同的功能。Ansibie官方并沒(méi)有通過(guò)功能的形式介紹不同的選項(xiàng)給出一個(gè)完整的選項(xiàng)列表。我們也可以參考https://github.com/lorin/ansible-quickref快速了解Play與task中的選項(xiàng),以及各個(gè)選項(xiàng)的含義。

4、案例:使用Playbook部署nginx

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo//下載源

在這個(gè)例子中,我們使用Ansible配置一臺(tái)服務(wù)器運(yùn)行nginx進(jìn)程。部署nginx的Playbook如下:

---- hosts: webservers become: yes become_method: sudo vars: worker_prosess: 4 worker_connections: 768 max_open_files: 65506 tasks: - name: install nginx yum: name=nginx update_cache=yes state=present - name: copy nginx config file template: src=/root/test_ansible/nginx.conf.j2 dest=/etc/nginx/nginx.conf notify: restart nginx - name: copy index.html template: src: /root/test_ansible/index.html.j2 dest: /usr/share/nginx/www/index.html mode: 0644 notify: restart nginx handlers: - name: restart nginx service: name=nginx state=restarted

在這個(gè)Playbook中,我們首先通過(guò)hosts選項(xiàng)指定了要對(duì)哪些遠(yuǎn)程服務(wù)器執(zhí)行操作。隨后,我們通過(guò)become與become_method選項(xiàng)聲明了部署時(shí)使用sudo權(quán)限。接下來(lái),我們?cè)趘ars字段中定義了三個(gè)變量,這三個(gè)變量將用在nginx的配置文件中。我們?cè)趖asks選項(xiàng)下定義了部署nginx服務(wù)的任務(wù)列表,包括軟件安裝、模板渲染、定制s首頁(yè)和重啟nginx進(jìn)程。

為了避免配置文件在沒(méi)有任何修改的情況下重啟了nginx進(jìn)程,這里使用了Ansible的handler機(jī)制。在這個(gè)Playbook中,存在兩個(gè)notify選項(xiàng),以及一個(gè)handler選項(xiàng)。無(wú)論是nginx的配置文件,還是定制首頁(yè)發(fā)生了修改,我們都會(huì)重啟nginx進(jìn)程。由于我們使用了Ansible的handlers機(jī)制,因此,在沒(méi)有任何修改的情況下,Ansible并不會(huì)重啟nginx進(jìn)程。使用handler機(jī)制還有一個(gè)好處,notify多次,handler也只會(huì)執(zhí)行一次,避免了反復(fù)多次重啟nginx進(jìn)程。

在這個(gè)部署nginx服務(wù)的Playbook中,我們用到了nginx.conf.j2這個(gè)配置模板。這個(gè)模板使用的是Jinja2的語(yǔ)法,所以后綴名為j2。模板的內(nèi)容如下:

[root@python ~]# mkdir test_ansible[root@python ~]# vim /root/test_ansible/nginx.conf.j2worker_processes {{ worker_prosess }};worker_rlimit_nofile {{ max_open_files }};events { worker_connections {{ worker_connections }};}http { server { listen 80; listen 443 ssl; server_name localhost; location / { root /usr/share/nginx/www; index index.html index.htm; tr_files $uri $uri/ =404; } }}

Ansible會(huì)使用我們?cè)赑laybook的vars字段中定義的變量,將Jinja2模板渲染成真實(shí)的配置文件。

我們的Playbook還用到了一個(gè)名為index.html.j2的模板,該模板用于渲染網(wǎng)站首頁(yè)。index.html.j2的內(nèi)容如下:

[root@python ~]# vim /root/test_ansible/index.html.j2<html> <meta charset='utf-8'> <head> <title>wellcome to ansible</title> </head> <body> <h1>nginx, configured by ansible</h1> <p>如果你能看到這個(gè)頁(yè)面,說(shuō)明ansible自動(dòng)部署nginx成功了!</p> <p>{{ ansible_hostname }}<p> </body></html>

在index.html.j2中,我們用到了一個(gè)名為ansible_hostname的變量。這個(gè)變量是Facts變量,是Ansible在執(zhí)行Playbook之前從遠(yuǎn)程服務(wù)器獲取到的信息。因此,我們不需要定義,直接使用即可。

有了Playbook以后,使用ansible-playbook命令進(jìn)行部署。如下所示:

[root@python ~]# pip install Jinja2[root@python ~]# vim /etc/ansible/ansible.cfg [defaults]inventory = /root/hosts[root@bogon ~]# ansible-playbook nginx.ymlPLAY [webservers] **********************************************************************************************************TASK [Gathering Facts] *****************************************************************************************************ok: [127.0.0.1]TASK [install nginx] *******************************************************************************************************ok: [127.0.0.1]TASK [copy nginx config file] **********************************************************************************************ok: [127.0.0.1]TASK [copy index.html] *****************************************************************************************************ok: [127.0.0.1]PLAY RECAP *****************************************************************************************************************127.0.0.1 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [root@bogon ~]#

如果安裝失敗,可能是端口被占用,可以停止使用該端口的服務(wù),或者更改nginx端口。

[root@bogon ~]# netstat -ntlpActive Internet connections (only servers)Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:111 0.0.0.0:*LISTEN 1/systemd tcp 0 0 0.0.0.0:6000 0.0.0.0:*LISTEN 7470/X tcp 0 0 192.168.122.1:53 0.0.0.0:*LISTEN 7654/dnsmasq tcp 0 0 0.0.0.0:22 0.0.0.0:*LISTEN 7337/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:*LISTEN 7340/cupsd tcp 0 0 127.0.0.1:6010 0.0.0.0:*LISTEN 31653/sshd: root@pt tcp 0 0 127.0.0.1:6011 0.0.0.0:*LISTEN 31653/sshd: root@pt tcp 0 0 127.0.0.1:6012 0.0.0.0:*LISTEN 31653/sshd: root@pt tcp6 0 0 :::111 :::* LISTEN 1/systemd tcp6 0 0 :::80 :::* LISTEN 17867/httpd tcp6 0 0 :::6000 :::* LISTEN 7470/X tcp6 0 0 :::22 :::* LISTEN 7337/sshd tcp6 0 0 ::1:631 :::* LISTEN 7340/cupsd tcp6 0 0 ::1:6010:::* LISTEN 31653/sshd: root@pt tcp6 0 0 ::1:6011:::* LISTEN 31653/sshd: root@pt tcp6 0 0 ::1:6012:::* LISTEN 31653/sshd: root@pt [root@bogon ~]# systemctl stop httpd.service

第二臺(tái)服務(wù)器啟動(dòng)一下nginx

[root@192 ~]# nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@192 ~]# nginxnginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)nginx: [emerg] still could not bind()

瀏覽器訪(fǎng)問(wèn)一下

python中Ansible模塊的Playbook的具體使用

到此這篇關(guān)于python中Ansible模塊的Playbook的具體使用的文章就介紹到這了,更多相關(guān)python Ansible Playbook內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: www久 | 国产h视频在线观看 | 成人超碰在线 | 国产精品一区二区久久 | 国产午夜精品久久久久久久 | 91国内精品久久 | 国产在线一区二区三区 | 日韩欧美在线视频 | 国产精品欧美一区二区三区 | 日本a v网站 | 欧美一级裸体视频 | 成人在线免费视频观看 | 久久婷婷麻豆国产91天堂 | 日韩欧美在线观看一区二区三区 | 日产精品久久 | 毛片真人毛毛片毛片 | 91国内外精品自在线播放 | 精品96久久久久久中文字幕无 | 成人福利在线 | 亚洲一区二区在线免费观看 | 在线观看www| 91性高湖久久久久久久久_久久99 | 最新日韩在线观看视频 | 久久久久久黄 | 欧日韩在线视频 | 91精品久久久久久久久久入口 | 成人网在线 | 久久97视频| 欧美色视频在线观看 | 午夜精品一区二区三区免费视频 | 99热在线播放 | 日韩毛片 | 激情国产 | 国产在线a | 99爱在线观看 | 成人免费视频网站 | 自拍偷拍在线视频 | 亚洲超碰av | 色综合免费 | 一本一本久久a久久精品综合妖精 | 韩国精品在线 | 亚洲精品久久 | 黄色一级免费电影 | 日韩在线播放一区二区 | 国产免费av在线 | 久久99国产精品久久99果冻传媒 | 国产色在线观看 | 三区在线| 亚洲区在线 | 久久久在线| 午夜精品一区二区三区在线视频 | 成人羞羞在线观看网站 | 成人在线免费观看 | 精品国产91亚洲一区二区三区www | 午夜操操| 亚洲日本二区 | 久久久久久99 | 久久久久久国产精品 | 特级av| 精品国产不卡一区二区三区 | 亚洲精品三级 | 亚洲欧洲一区二区 | 国产三级在线观看 | 精品99免费| 国产一区久久 | 精品久| 欧美在线观看免费观看视频 | 亚洲视频在线播放 | 一级片网 | 女人久久久久久久 | 91精品一区二区 | 精品久久久久久久久久久院品网 | 免费国产视频 | 国产欧美综合一区二区三区 | 欧美一级片在线观看 | 久久精品国产99国产 | 午夜电影福利 | 国产色视频在线观看免费 | 日本久久国产 | 国产高清一区 | 久久久久久国产视频 | 男女黄色免费网站 | 国产精品日韩欧美一区二区 | 黄色日批视频 | 久久成人av | 色精品 | 黄在线看 | 久久精品国产一区二区三区不卡 | 亚洲一区二区三区在线免费观看 | 国产 日韩 欧美 在线 | 搞黄免费视频 | 国产精品亚洲一区二区三区 | 一区二区成人在线 | 欧美精品二区中文乱码字幕高清 | 一区二区三区四区 | 黄色av网站在线观看 | 中文字幕在线播放不卡 | 一区二区在线免费观看 | www.久久久.com | m豆传媒在线链接观看 | 最新av在线网址 | 色呦呦网站在线观看 | 亚洲精品一区二三区不卡 | 国产九九九 | 亚洲第一视频 | 日韩中文字幕av在线 | 亚洲瑟瑟 | 成人av高清| 亚洲精品电影在线一区 | 国产亚洲精品成人av久久影院 | 亚洲精品久久久久久一区二区 | 亚洲成av| 欧美成人精品在线视频 | 国产高清在线看 | 午夜妇女aaaa区片 | 日日操夜夜操天天操 | 国内自拍网站 | 91中文| 精品久久久久久国产 | 国产日韩精品视频 | 亚洲天堂av网 | 亚洲欧美中文日韩在线v日本 | 日韩3级在线观看 | 国产午夜精品美女视频明星a级 | 久99视频| 久久毛片 | 国产精品视频一二三区 | 日韩综合色 | 日韩在线观看高清 | 一区二区久久 | 另类五月天 | 91亚洲免费 | 在线看欧美| 国产精品久久久久国产精品 | 欧美日韩中文字幕在线 | 国产精品国产三级国产a | 国产精品美女久久久久久久久久久 | 91在线视频在线 | 国产日韩一区二区 | 91视频免费播放 | 黄视频网站免费观看 | 精品一区二区三区三区 | 亚洲精品久久久一区二区三区 | 亚洲色图在线播放 | 欧美精品在线观看 | 久久久免费视频播放 | 久久九九国产精品 | 国产午夜视频 | 久久久人成影片一区二区三区 | 成人免费视频网站在线观看 | 99精品在线 | 亚洲成人免费在线 | 天天干夜夜爽 | 亚洲欧美激情精品一区二区 | 91精产国品一二三区在线观看 | 久久久99国产精品免费 | 狠狠操天天操 | 国产98色在线 | 日韩 | 国产精品视频一二三区 | 影音在线资源 | 成人看片免费 | 欧美日韩中 | 亚洲精彩视频 | 中文av网站| 亚洲高清视频在线观看 | 精品视频一区二区三区 | 不卡一二区 | 亚洲精品一 | 九色在线观看 | 中文字幕91 | 五月婷婷导航 | 羞羞的视频在线 | 精国产品一区二区三区四季综 | 中文日韩在线 | 国产精久| 久草天堂| 一级女性全黄久久生活片免费 | 国产91福利视频 | 亚洲码欧美码一区二区三区 | 超碰在线看| 毛片a在线 | 欧美日韩在线视频一区二区 | 欧美一级在线 | 午夜久久视频 | 久久久久久亚洲 | 久久亚洲一区二区三区四区五区高 | 中文字幕av亚洲精品一部二部 | 久久国内免费视频 | 毛片网| 免费一区| 亚洲第一视频 | 欧美成人精品一区二区三区 | 狠狠色狠狠色综合网 | 午夜色福利 | 中文字幕在线第一页 | 亚洲精品乱码久久久久久国产主播 | 欧美日韩精品一区二区 | 国产精品久久久久久久久久久久冷 | 在线免费观看毛片 | 伊人在线 | 男女啪啪高清无遮挡 | 亚洲高清视频网站 | 一区二区三区精品视频 | 国产区在线 | 97久久久国产精品 | 日本一区二区成人 | 精品国偷自产在线 | 日韩中文字幕视频 | 网址av| 91在线视频一区 | 精品二区| 精品亚洲成a人片在线观看 国产高清在线 | 91嫩草在线| 成人国产一区 | 三级国产网站 | 噜噜噜噜噜色 | 97国产一区二区 | 国产成人天天爽高清视频 | 久久成人综合 | 日韩有码一区 | 中文字幕日韩欧美一区二区三区 | 欧美 日韩 中文 | 色免费在线观看 | 中文字幕一区二区三区四区 | 日日夜夜精品网站 | 你懂的在线视频播放 | 国产精品国产精品国产专区不片 | 久久一二 | 色呦呦网站在线观看 | heyzo在线观看| 亚洲人成人一区二区在线观看 | 三级黄色视频毛片 | 久久人人爽人人爽人人片亚洲 | 能直接看的av网站 | 欧美成人精品在线观看 | 久久99精品国产自在现线 | 国产v日产∨综合v精品视频 | 免费观看电视在线高清视频 | 欧美成年黄网站色视频 | 欧美一区二区免费 | 亚洲精品乱码久久久久久久 | 欧美日韩中文字幕在线 | 久久久久久久久久久久久久久久久久久 | 欧美一级艳片视频免费观看 | 男女啪啪高清无遮挡 | 国产综合精品一区二区三区 | 久草视频播放 | 精品影院 | 亚洲精品9999 | 91中文字幕在线 | 久久久精品一区二区 | 国产日韩高清在线 | 特黄视频 | 欧美精品久久久久久久久老牛影院 | 午夜精品影院 | 国产精品中文字幕在线观看 | 日韩精品免费 | www.五月婷婷 | 91精品国产乱码久久久久久久久 | 日本中文字幕在线播放 | 久久久精品区 | 色婷婷在线视频 | 亚洲精品欧美 | 日本欧美一区二区 | 久久视频免费在线 | 亚洲精品资源在线观看 | 日韩超级大片免费看国产国产播放器 | 99久久婷婷国产精品综合 | 97久久精品| 国产美女网站视频 | 在线视频中文字幕 | 成人欧美一区二区三区色青冈 | 国产精品一任线免费观看 | 精品国产99| 亚洲免费视频大全 | 人人插人人 | 国产特级毛片aaaaaa毛片 | 亚洲精品66 | 亚洲久悠悠色悠在线播放 | 国产传媒视频 | 国产精品久久久久久久浪潮网站 | 中文字幕精品一区二区三区精品 | 国产区91 | 成人午夜在线视频 | 亚洲视频在线观看 | 手机看片169| 日韩免费一区二区 | 成人免费视频观看视频 | 久久九精品 | 国产情侣一区二区三区 | 视频一区二区国产 | 欧美成人手机在线 | 精品久久久久久久久久久久 | 国产欧美综合一区二区三区 | 日韩欧美综合 | 国产主播福利 | 大吊一区二区 | 中文字幕本久久精品一区 | 国产最新精品视频 | 国产精品久久久久久一区二区三区 | 欧美精产国品一二三区 | 精品在线一区二区 | 国产精品亚洲一区二区三区 | 国产精品毛片久久久久久 | 久久99国产精品久久99大师 | 亚洲欧美日韩另类精品一区二区三区 | 国产欧美日韩在线观看 | 看毛片网站| 日本阿v视频高清在线中文 中文二区 | 欧美亚洲国产一区 | 天天爽夜夜爽夜夜爽精品视频 | 亚洲视频在线观看视频 | 日本末发育嫩小xxxx | 一级电影在线观看 | 91麻豆精品国产91久久久资源速度 | 国产精品国产三级国产aⅴ无密码 | 久久这里只有精品首页 | av网站观看 | 97国产一区二区 | 污色视频在线观看 | 久久综合一区二区三区 | 国产欧美日韩精品一区 | 国产一级片一区二区三区 | 久久国产欧美一区二区三区精品 | 亚洲精品自在在线观看 | 亚洲成人激情在线观看 | 久久久久久久国产 | 正在播放国产精品 | 午夜看片 | 国产高清在线精品一区二区三区 | 91精品国产色综合久久不卡98口 | 国产日韩精品在线观看 | av网站在线免费观看 | 国产精品久久久久毛片软件 | 日韩精品无码一区二区三区 | 欧美一区二区在线播放 | 欧美精品一区久久 | 成人免费视频网 | 国产精品三级久久久久久电影 | 欧美午夜精品久久久久久浪潮 | 99久久婷婷国产综合精品电影 | 国产免费亚洲 | 亚洲av毛片 | 国产婷婷精品 | 天天干天操 | 成人免费视频网站 | 欧美成人精品一区二区三区在线看 | 亚洲视频精品一区 | 欧美日韩精品 | 鲁视频| 亚洲精品二区 | 亚洲视频一区二区三区 | 亚洲 欧美 另类 综合 偷拍 | 国产精品久久久久久久久久 | 五月天婷婷在线视频 | 欧美国产在线观看 | 最新av片| 亚洲女人天堂成人av在线 | 久久精品视频在线播放 | 91亚洲国产成人久久精品网站 | 国产一区二区免费电影 | 欧美一级在线观看 | 欧美一区日韩一区 | 国产精品久久毛片 | 日本一区二区三区四区视频 | 国产精品96久久久久久久 | 日日干夜夜操 | 久久久精品影院 | 日韩成人影院 | 久久视频在线看 | 特级av | 伊人免费在线观看高清版 | 亚洲免费色 | 午夜三区| 国产久 | 国产一区二区三区av在线 | 亚洲综合色自拍一区 | 中文字幕日韩在线 | 99精品热 | 欧美亚洲三级 | 北条麻妃一区二区三区中文字幕 | 国产精品日韩欧美一区二区三区 | 亚洲欧美综合乱码精品成人网 | 精品久久久久久久久久久 | 欧美1314 | 国产色| 亚洲一区二区三区精品视频 | 91视频免费观看 | 久久精品欧美 | 香蕉大人久久国产成人av | 一区二区日本 | 国产毛片毛片 | 视频二区| 狠久久 | 蜜桃视频一区二区三区 | a性片| 国产精品久久久久久久久久妇女 | 成人在线视频网站 | 亚洲免费视频大全 | 欧美一级网 | 精品日韩一区二区三区 | 国产 日韩 欧美 中文 在线播放 | 日韩蜜桃 | 国产精品国产精品国产专区不片 | 日韩91精品 | 久久99精品久久久久久噜噜 | 国产成人精品久久二区二区91 | 精品久久久久一区二区国产 | 欧美一区二区免费 | 操久在线| 97精品超碰一区二区三区 | 欧美日韩中文在线 | 簧片毛片| 欧美成人一区二区三区片免费 | 理论片一区 | 成人免费毛片嘿嘿连载视频 | 国产一区二区三区四区在线观看 | 欧美日韩成人在线视频 | 欧美日韩成人免费 | 精久久 | 人人草人人干 | www国产成人免费观看视频,深夜成人网 | 国产午夜精品一区二区三区 | 成人精品久久久 | 亚洲精选一区 | 免费毛片视频 | 亚洲精品乱码久久久久久 | www.日本三级 | 国产区精品在线 | 成人aaaa | 一级黄色毛片 | 天天干天天操天天干 | 亚洲一区二区三区高清 | 777kkk999成人ww | 久久一区二区三区四区 | 国产精品久久久久久久久久久久久 | 久久久精品综合 | 国产精品视频一区二区三区四蜜臂 | 一区二区在线视频 | 能直接看的av网站 | 91aiai| 亚洲www啪成人一区二区 | 国产特黄一级 | 国产精品a免费一区久久电影 | 国产丝袜一区 | 91久久久久久久久久久久久久久久 | 一区二区三区四区在线播放 | 久久国产精品一区二区三区 | 国产激情一区二区三区 | 中文字幕在线免费观看 | 欧美一区日韩一区 | 国产精品久久久久久久午夜片 | h视频在线免费观看 | 精品久久久久久亚洲精品 | 国产精品第一国产精品 | 日韩欧美国产精品一区二区三区 | 国产精品永久在线 | 日韩成人国产 | 精品亚洲一区二区三区 | 久久69精品久久久久久久电影好 | 日本黄色一级片视频 | 中文字幕免费看 | 在线观看日韩 | 国产成人亚洲综合 | 国产精品久久久久久久久 | 欧美精品一区二 | 国产精品久久久久国产a级 日韩在线二区 | 日韩污视频在线观看 | 后人极品翘臀美女在线播放 | 欧美激情伊人 | 视频一区二区三区中文字幕 | 日韩成人影院 | 琪琪午夜伦伦电影福利片 | 黄色网在线| 亚洲精品乱码久久久久久蜜桃 | 久久国产一区二区三区 | 久久中文字幕一区 | 国产成人精品一区二区三区四区 | 亚洲欧美高清 | 美女国产 | 成人精品鲁一区一区二区 | 国产精品久久久久aaaa九色 | 欧美久久久久久久久久伊人 | 亚洲91精品 | 欧美日韩黄色一区二区 | 一级全黄性色生活片 | 国产大片久久久 | 久在线 | 国产成人精品一区二区视频免费 | 亚洲欧美激情精品一区二区 | 一区在线播放 | 久久午夜精品 | 亚洲日本欧美日韩高观看 | 91电影院 | 91视频免费在线看 | 日韩在线亚洲 | 在线观看精品91福利 | 欧美天堂 | 亚洲欧美中文字幕 | 日韩精品在线一区 | 欧美一区中文字幕 | 一区二区亚洲 | 国产最好的av国产大片 | 精品久久久久av | 成人欧美一区二区三区在线播放 | 日日骚| 国产91视频在线观看 | 欧美午夜一区二区三区免费大片 | 日本黄色短片 | 制服 丝袜 激情 欧洲 亚洲 | 天天干狠狠干 | 亚洲男人天堂 | 天堂久久一区 | 96自拍视频 | 国产视频网 | 日韩久久成人 | 国产精品久久久久一区二区三区 | 免费毛片网站 | www.av在线 | а天堂中文最新一区二区三区 | 精品一区二区三区免费 | 国产精品欧美日韩 | 久久久久国产精品午夜一区 | 黄色毛片视频网站 | 色婷婷国产精品免费网站 | 欧美视频二区 | 国产男女做爰免费网站 | 狠狠撸在线视频 | 在线视频一区二区 | 亚洲精品国产综合 | 91在线视频福利 | 日本黄色大片 | 国产综合一区二区 | 一区二区三区中文字幕 | 日韩9999 | 国产精品久久久久久久久久久久冷 | 欧美国产视频一区 | 国产中文在线 | 99视频在线看 | 日韩在线视频一区 | 黑人巨大精品欧美一区免费视频 | 一级一片在线观看 | 国产成人高清在线 | 一级a性色生活片久久毛片波多野 | 亚洲在线视频 | 亚洲一区二区三 | 日韩不卡在线 | 国产精品高清在线 | 欧美在线一区二区 | 九色视频网站 | 成人黄色一级网站 | 日韩高清在线一区 | 黄色一级视屏 | 成人av片在线观看 | 成人免费毛片aaaaaa片 | 欧美日韩在线精品 | 特黄特黄aaaa级毛片免费看 | 精品国产欧美一区二区三区成人 | 97免费在线视频 | 欧美激情国产日韩精品一区18 | 九九热这里都是精品 | 国产视频精品在线 | 99国产精品99久久久久久 | 可以在线观看的av网站 | 欧美久久久 | 五月婷婷丁香在线 | 久久久精品免费观看 | 在线欧美一区 | 国产精品亚洲天堂 | 久久久99精品免费观看 | 免费观看欧美一级 | 久久精品亚洲欧美日韩精品中文字幕 | 播放一级毛片 | 亚洲精品福利在线 | 久在线视频 | 久久se精品一区精品二区 | 亚洲精品视频一区二区三区 | 国产精品久久综合 | 久久久久久亚洲精品 | 欧美午夜精品久久久 | 日韩视频精品 | 亚洲精品在线网站 | 91久久国产综合久久 | 国产日本韩国在线 | 男女黄色免费网站 | 国产精品一区二区在线 | 小情侣高清国产在线播放 | 自拍偷拍第一页 | 超碰一区二区三区 | 91免费在线视频 | 一区二区在线播放视频 | 亚洲人人| 电影91久久久 | 国产精品高清在线 | 成人免费一区二区三区视频网站 | 久久久久亚洲一区二区三区 | 国产精品中文字幕在线播放 | 天天操综| 99看片 | 欧美日韩一二三 | 国内精品在线视频 | 日日操视频 | 成人激情视频在线免费观看 | 91网站在线播放 | 亚洲一区二区在线 | www国产成人免费观看视频 | 国产黄色一级大片 | 欧美 日韩 国产 一区 | 国产大胆自拍 | 欧美精品网| 日本天天操 | 成人视屏在线观看 | 久久精品综合 | 亚洲不卡视频 | 国产精品对白一区二区三区 |