【Ansible】ansible循環(huán)

Ansible 循環(huán)

一思恐、簡單介紹

在ansible2.5之前摊册,大多數(shù)人使”with_XXX”類型的關(guān)鍵字來操作循環(huán)乐埠,但是從2.6版本開始找筝,官方推薦是”loop”關(guān)鍵字代替” with_XXX”随静。

1.我們先看下一個(gè)小例子八千,使用loop關(guān)鍵字進(jìn)行最簡單的循環(huán):

[root@localhost cycle]# cat cycle.1.yml

---

? -name: cycletest

???hosts: test

???gather_facts: no

???tasks:

??? -name: debug cycle

?????debug:

???????msg: "{{ item }}"

?????loop:

???????- test1

???????- test2


結(jié)果:

[root@localhost cycle]# ansible-playbookcycle.1.yml


PLAY [cycle test]***************************************************************************************


TASK [debug cycle]**************************************************************************************

ok: [192.168.15.10] => (item=test1)=> {

???"msg": "test1"

}

ok: [192.168.15.10] => (item=test2)=> {

???"msg": "test2"

}


PLAY RECAP**********************************************************************************************

192.168.15.10????????????? : ok=1??? changed=0???unreachable=0??? failed=0??? skipped=0??


debug cycle------------------------------------------------------------- 0.17s

Playbook finished: Mon Dec 24 17:57:252018, 1 total tasks.? 0:00:00 elapsed.

實(shí)例中所以loop關(guān)鍵字,替換之前的with_XXX關(guān)鍵字燎猛,它們的效果是完全相同的恋捆。

2.我們可以使用loop關(guān)鍵字和dict插件代替”with_dict”關(guān)鍵字,示例如下:

[root@localhost cycle]# cat cycle.2.yml

---

? -name: cycle test2

???hosts: test

???gather_facts: no

???vars:

?????dicts:

???????China: 1

???????America: 2

???tasks:

??? -name: debug cycle

?????debug:

???????msg: "{{ item.key }} is no.{{ item.value }}"

?????loop: "{{ lookup('dict',dicts) }}"

結(jié)果:

[root@localhost cycle]# ansible-playbookcycle.2.yml


PLAY [cycle test2]**************************************************************************************


TASK [debug cycle] **************************************************************************************

ok: [192.168.15.10] => (item={'key':u'America', 'value': 2}) => {

???"msg": "America is no.2"

}

ok: [192.168.15.10] => (item={'key':u'China', 'value': 1}) => {

???"msg": "China is no.1"

}


PLAY RECAP**********************************************************************************************

192.168.15.10????????????? : ok=1??? changed=0???unreachable=0??? failed=0??? skipped=0??


debug cycle -------------------------------------------------------------0.18s


Playbook finished: Mon Dec 24 17:59:582018, 1 total tasks.? 0:00:00 elapsed

示例已經(jīng)在上一個(gè)例子中講述重绷,再次不在講述

3.上個(gè)例子中使用”loop+lookup”的方式完成循環(huán)沸停,而在2.6版本的官網(wǎng)中推薦使用”loop+filter”方式老代替”loop+loopup”的方式,什么意思呢? 我們來看個(gè)小例子昭卓,如下:

---

? -name: cycle test3

???hosts: test

???gather_facts: no

???vars:

?????dicts:

???????China: 1

???????America: 2

???tasks:

??? -name: debug cycle

?????debug:

???????msg: "{{ item.key }} is no.{{ item.value }}"

?????loop: "{{ dicts | dict2items }}"

結(jié)果:

[root@localhost cycle]# ansible-playbookcycle.3.yml


PLAY [cycle test3]**************************************************************************************


TASK [debug cycle]**************************************************************************************

ok: [192.168.15.10] => (item={'key':u'America', 'value': 2}) => {

???"msg": "America is no.2"

}

ok: [192.168.15.10] => (item={'key':u'China', 'value': 1}) => {

???"msg": "China is no.1"

}


PLAY RECAP **********************************************************************************************

192.168.15.10????????????? : ok=1??? changed=0???unreachable=0??? failed=0??? skipped=0??


debug cycle------------------------------------------------------------- 0.18s


Playbook finished: Mon Dec 24 18:05:212018, 1 total tasks.? 0:00:00 elapsed.

如上例所示愤钾,在使用loop關(guān)鍵字操作對于的字典變量users時(shí)瘟滨,并沒有借助dict插件,而是使用dict2items的過濾器能颁。


二杂瘸、具體示例

1.With_list

#loop可以替代with_list,當(dāng)處理嵌套的列表時(shí)伙菊,列表不會(huì)被拉平

[root@localhost cycle]# cat cycle.4.yml

---

? -name: cycle test4

???hosts: test

???gather_facts: no

???vars:

?????dicts:

???????- A

???????- B

???????- [c,D]

???tasks:

??? -name: debug cycle

?????debug:

???????msg: "{{ item }}"

?????loop: "{{ dicts }}"


結(jié)果:

[root@localhost cycle]# ansible-playbookcycle.4.yml


PLAY [cycle test4]**************************************************************************************


TASK [debug cycle]**************************************************************************************

ok: [192.168.15.10] => (item=A) => {

???"msg": "A"

}

ok: [192.168.15.10] => (item=B) => {

???"msg": "B"

}

ok: [192.168.15.10] => (item=[u'c',u'D']) => {

???"msg": [

???????"c",

???????"D"

??? ]

}


PLAY RECAP **********************************************************************************************

192.168.15.10????????????? : ok=1??? changed=0???unreachable=0??? failed=0??? skipped=0??


debug cycle------------------------------------------------------------- 0.19s


Playbook finished: Mon Dec 24 18:25:412018, 1 total tasks.? 0:00:00 elapsed.

2.With_flattened

#flatten過濾器可以替代with_flattened败玉,當(dāng)處理多層嵌套的列表時(shí),列表中所有的嵌套層級都會(huì)被拉平

[root@localhost cycle]# cat cycle.5.yml

---

? -name: cycle test5

???hosts: test

???gather_facts: no

???vars:

?????dicts:

???????- A

???????- B

???????- [c,D]

???tasks:

??? -name: debug cycle

?????debug:

???????msg: "{{ item }}"

?????loop: "{{ dicts | flatten }}"


結(jié)果:

[root@localhost cycle]# ansible-playbookcycle.5.yml


PLAY [cycle test5]**************************************************************************************


TASK [debug cycle]**************************************************************************************

ok: [192.168.15.10] => (item=A) => {

???"msg": "A"

}

ok: [192.168.15.10] => (item=B) => {

???"msg": "B"

}

ok: [192.168.15.10] => (item=c) => {

???"msg": "c"

}

ok: [192.168.15.10] => (item=D) => {

???"msg": "D"

}


PLAY RECAP**********************************************************************************************

192.168.15.10????????????? : ok=1??? changed=0???unreachable=0??? failed=0??? skipped=0??


debug cycle------------------------------------------------------------- 0.19s


Playbook finished: Mon Dec 24 18:31:472018, 1 total tasks.? 0:00:00 elapsed.

3.With_items

#flatten過濾器(加參數(shù))可以替代with_items镜硕,當(dāng)處理多層嵌套的列表時(shí)运翼,只有列表中的第一層會(huì)被拉平

[root@localhost cycle]# cat cycle.6.yml

---

? -name: cycle test6

???hosts: test

???gather_facts: no

???vars:

?????dicts:

???????- A

???????- B

???????- [c,D]

???tasks:

??? -name: debug cycle

?????debug:

???????msg: "{{ item }}"

?????loop: "{{ dicts | flatten(levels=1) }}"

結(jié)果:

[root@localhost cycle]# ansible-playbookcycle.6.yml


PLAY [cycle test6] **************************************************************************************


TASK [debug cycle]**************************************************************************************

ok: [192.168.15.10] => (item=A) => {

???"msg": "A"

}

ok: [192.168.15.10] => (item=B) => {

???"msg": "B"

}

ok: [192.168.15.10] => (item=c) => {

???"msg": "c"

}

ok: [192.168.15.10] => (item=D) => {

???"msg": "D"

}


PLAY RECAP **********************************************************************************************

192.168.15.10????????????? : ok=1??? changed=0???unreachable=0??? failed=0??? skipped=0??


debug cycle------------------------------------------------------------- 0.29s


Playbook finished: Mon Dec 24 18:34:312018, 1 total tasks.? 0:00:00 elapsed.

#PS 嗯 處理下客戶問題先。Weblogic真毒~

4.With_indexed_items

#flatten過濾器(加參數(shù))兴枯,再配合loop_control關(guān)鍵字血淌,可以替代with_indexed_items

#當(dāng)處理多層嵌套的列表時(shí),只有列表中的第一層會(huì)被拉平念恍,flatten過濾器的bug暫且忽略

[root@localhost cycle]# cat cycle.7.yml

---

? -name: cycle test7

???hosts: test

???gather_facts: no

???vars:

?????dicts:

???????- A

???????- B

???????- [c,D]

???tasks:

??? -name: debug cycle

?????debug:

???????msg: " {{ index}}--{{ item }}"

?????loop: "{{ dicts | flatten(levels=1) }}"

?????loop_control:

???????index_var: index

結(jié)果:

[root@localhost cycle]# ansible-playbookcycle.7.yml


PLAY [cycle test7]**************************************************************************************


TASK [debug cycle]**************************************************************************************

ok: [192.168.15.10] => (item=A) => {

???"msg": " 0--A"

}

ok: [192.168.15.10] => (item=B) => {

???"msg": " 1--B"

}

ok: [192.168.15.10] => (item=c) => {

???"msg": " 2--c"

}

ok: [192.168.15.10] => (item=D) => {

???"msg": " 3--D"

}


PLAY RECAP**********************************************************************************************

192.168.15.10????????????? : ok=1??? changed=0???unreachable=0? ??failed=0???skipped=0??


debug cycle------------------------------------------------------------- 0.21s


Playbook finished: Mon Dec 24 20:29:572018, 1 total tasks.? 0:00:00 elapsed.

“l(fā)oop_control”關(guān)鍵字可以用于控制循環(huán)的行為六剥,比如在循環(huán)是獲取元素的索引。

“index_var “是”loop_control”的一個(gè)設(shè)置選項(xiàng)峰伙,”index_var”可以讓我們指定變量,”loop_control”會(huì)將元素索引值存放在指定變量中

5.With_togeher

[root@localhost cycle]# cat cycle.8.yml

---

? -name: cycle test8

???hosts: test

???gather_facts: no

???vars:

?????testlist1: [ A,B,C,D ]

?????testlist2: [ 110,120,911 ]

?????testlist3: [ x,y ]

???tasks:

??? -name: debug cycle with_together

?????debug:

???????msg: " {{ item.0 }} - {{ item.1 }} - {{ item.2 }}"

?????with_together:

???????- "{{ testlist1 }}"

???????- "{{ testlist2 }}"

???????- "{{ testlist3 }}"

??? -name: debug cycle loop+zip_logest

?????debug:

???????msg: " {{ item.0 }} - {{ item.1 }} - {{ item.2 }}"

?????loop: "{{ testlist1 | zip_longest(testlist2,testlist3) | list }}

結(jié)果:

[root@localhost cycle]# ansible-playbookcycle.8.yml


PLAY [cycle test8]**************************************************************************************


TASK [debug cycle with_together]************************************************************************

ok: [192.168.15.10] => (item=[u'A', 110,u'x']) => {

???"msg": " A - 110 - x"

}

ok: [192.168.15.10] => (item=[u'B', 120,u'y']) => {

???"msg": " B - 120 - y"

}

ok: [192.168.15.10] => (item=[u'C', 911,None]) => {

???"msg": " C - 911 - "

}

ok: [192.168.15.10] => (item=[u'D',None, None]) => {

???"msg": " D -? -"

}


TASK [debug cycle loop+zip_logest]**********************************************************************

ok: [192.168.15.10] => (item=[u'A', 110,u'x']) => {

???"msg": " A - 110 - x"

}

ok: [192.168.15.10] => (item=[u'B', 120,u'y']) => {

???"msg": " B - 120 - y"

}

ok: [192.168.15.10] => (item=[u'C', 911,None]) => {

???"msg": " C - 911 - "

}

ok: [192.168.15.10] => (item=[u'D',None, None]) => {

???"msg": " D -? -"

}


PLAY RECAP**********************************************************************************************

192.168.15.10????????????? : ok=2??? changed=0???unreachable=0??? failed=0??? skipped=0??


debug cycle with_together----------------------------------------------- 0.25s

debug cycle loop+zip_logest--------------------------------------------- 0.21s


Playbook finished: Mon Dec 24 20:44:422018, 2 total tasks.? 0:00:00 elapsed.

示例中同時(shí)寫出2中方法方便進(jìn)行比較疗疟。

當(dāng)多個(gè)列表使用”with_together”進(jìn)行對比合并時(shí),如果列表長度不同瞳氓,這使用最長的列表長度進(jìn)行對其策彤,由于短列表中元素不足,所以使用空值與長列表中元素進(jìn)行對齊匣摘,zip_longest過濾器也和”with_together”一樣店诗,對列表進(jìn)行組合,但是還需要借助list過濾器音榜,將組合的數(shù)據(jù)列表化庞瘸。

可以指定字符代替空值

-?debug:

msg:?"{{?item.0?}}?-?{{?item.1?}}?-?{{item.2}}"

loop:?"{{?testlist1?|?zip_longest(testlist2,testlist3,fillvalue='None')?|?list?}}"

和最短的列表進(jìn)行對齊

-?debug:

msg:?"{{?item.0?}}?-?{{?item.1?}}?-?{{item.2}}"

loop:?"{{?testlist1?|?zip(testlist2,testlist3)?|?list?}}"


6.With_nested/With_cartesian

#product過濾器配合list過濾器,可以替代with_nested和with_cartesian

[root@localhost cycle]# cat cycle.9.yml

---

? -name: cycle test4

???hosts: test

???gather_facts: no

???vars:

?????list1: [ 1,2,3 ]

?????list2: [ a,b,c,d ]

???tasks:

??? -name: debug cycle

?????debug:

???????msg: "{{ item.0 }} ----? {{item.1 }}"

?????loop: "{{ list1 | product(list2) | list }}"

結(jié)果:

[root@localhost cycle]# ansible-playbookcycle.9.yml


PLAY [cycle test4]**************************************************************************************


TASK [debug cycle]**************************************************************************************

ok: [192.168.15.10] => (item=[1, u'a'])=> {

???"msg": "1 ----?a"

}

ok: [192.168.15.10] => (item=[1, u'b'])=> {

???"msg": "1 ----?b"

}

ok: [192.168.15.10] => (item=[1, u'c'])=> {

???"msg": "1 ----?c"

}

ok: [192.168.15.10] => (item=[1, u'd'])=> {

???"msg": "1 ----?d"

}

ok: [192.168.15.10] => (item=[2, u'a'])=> {

???"msg": "2 ----?a"

}

ok: [192.168.15.10] => (item=[2, u'b'])=> {

???"msg": "2 ----?b"

}

ok: [192.168.15.10] => (item=[2, u'c'])=> {

?? ?"msg": "2 ----? c"

}

ok: [192.168.15.10] => (item=[2, u'd'])=> {

???"msg": "2 ----?d"

}

ok: [192.168.15.10] => (item=[3, u'a'])=> {

???"msg": "3 ----?a"

}

ok: [192.168.15.10] => (item=[3, u'b'])=> {

???"msg": "3 ----?b"

}

ok: [192.168.15.10] => (item=[3, u'c'])=> {

???"msg": "3 ----?c"

}

ok: [192.168.15.10] => (item=[3, u'd'])=> {

???"msg": "3 ----?d"

}


PLAY RECAP **********************************************************************************************

192.168.15.10????????????? : ok=1??? changed=0???unreachable=0??? failed=0??? skipped=0??


debug cycle------------------------------------------------------------- 0.31s


Playbook finished: Mon Dec 24 20:55:192018, 1 total tasks.? 0:00:00 elapsed.

7.With_random_choice

#使用random函數(shù)可以替代with_random_choice赠叼,由于random函數(shù)是隨機(jī)取出列表中的一個(gè)值擦囊,并不涉及循環(huán)操作,所以并不用使用loop關(guān)鍵字嘴办。

[root@localhost cycle]# cat cycle.10.yml

---

? -name: cycle test

???hosts: test

???gather_facts: no

???vars:

?????list: [a,b,c]

???tasks:

??? -name: debug cycle

?????debug:

???????msg: "{{ list | random }}"

???-? debug:

???????msg: "{{ list | random }}"

???-? debug:

???????msg: "{{ list | random }}

結(jié)果:

[root@localhost cycle]# ansible-playbookcycle.10.yml


PLAY [cycle test]***************************************************************************************


TASK [debug cycle] **************************************************************************************

ok: [192.168.15.10] => {

???"msg": "a"

}


TASK [debug]********************************************************************************************

ok: [192.168.15.10] => {

???"msg": "a"

}


TASK [debug]********************************************************************************************

ok: [192.168.15.10] => {

???"msg": "c"

}


PLAY RECAP**********************************************************************************************

192.168.15.10????????????? : ok=3??? changed=0???unreachable=0??? failed=0??? skipped=0??


debug cycle------------------------------------------------------------- 0.18s

?------------------------------------------------------------------------0.16s


Playbook finished: Mon Dec 24 21:06:322018, 2 total tasks.? 0:00:00 elapsed.

8.with_dict

#除了上文總結(jié)的dict2items過濾器瞬场,dictsort過濾器也可以替代with_dict

[root@localhost cycle]# cat cycle.11.yml

---

? -name: cycle test2

???hosts: test

??? gather_facts:no

???vars:

?????dicts:

???????China: 1

???????America: 2

???????aaa: 3

???????bbb: 4

???????ccc: 5

???tasks:

??? -name: debug cycle dict2items

?????debug:

???????msg: "{{ item.key }} is no.{{ item.value }}"

?????loop: "{{ dicts | dict2items }}"

??? -name: debug cycle

?????debug:

???????msg: "{{ item.0 }} is no.{{ item.1 }}"

?????loop: "{{ dicts | dictsort }}"

結(jié)果:

[root@localhost cycle]# ansible-playbookcycle.11.yml


PLAY [cycle test2]**************************************************************************************


TASK [debug cycle dict2items]***************************************************************************

ok: [192.168.15.10] => (item={'key':u'China', 'value': 1}) => {

???"msg": "China is no.1"

}

ok: [192.168.15.10] => (item={'key':u'America', 'value': 2}) => {

???"msg": "America is no.2"

}

ok: [192.168.15.10] => (item={'key':u'aaa', 'value': 3}) => {

???"msg": "aaa is no.3"

}

ok: [192.168.15.10] => (item={'key':u'bbb', 'value': 4}) => {

???"msg": "bbb is no.4"

}

ok: [192.168.15.10] => (item={'key':u'ccc', 'value': 5}) => {

???"msg": "ccc is no.5"

}


TASK [debug cycle]**************************************************************************************

ok: [192.168.15.10] => (item=[u'aaa', 3])=> {

???"msg": "aaa is no.3"

}

ok: [192.168.15.10] =>(item=[u'America', 2]) => {

???"msg": "America is no.2"

}

ok: [192.168.15.10] => (item=[u'bbb',4]) => {

???"msg": "bbb is no.4"

}

ok: [192.168.15.10] => (item=[u'ccc',5]) => {

???"msg": "ccc is no.5"

}

ok: [192.168.15.10] => (item=[u'China',1]) => {

???"msg": "China is no.1"

}


PLAY RECAP **********************************************************************************************

192.168.15.10????????????? : ok=2??? changed=0???unreachable=0??? failed=0??? skipped=0??


debug cycle dict2items-------------------------------------------------- 0.26s

debug cycle------------------------------------------------------------- 0.22s


Playbook finished: Mon Dec 24 21:10:402018, 2 total tasks.? 0:00:00 elapsed.



本文《ansible循環(huán)》首發(fā)于 樂維論壇,歡迎到訪~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涧郊,一起剝皮案震驚了整個(gè)濱河市贯被,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖彤灶,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件看幼,死亡現(xiàn)場離奇詭異,居然都是意外死亡枢希,警方通過查閱死者的電腦和手機(jī)桌吃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苞轿,“玉大人,你說我怎么就攤上這事逗物“嶙洌” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵翎卓,是天一觀的道長契邀。 經(jīng)常有香客問我,道長失暴,這世上最難降的妖魔是什么坯门? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮逗扒,結(jié)果婚禮上古戴,老公的妹妹穿的比我還像新娘。我一直安慰自己矩肩,他們只是感情好现恼,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著黍檩,像睡著了一般叉袍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刽酱,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天喳逛,我揣著相機(jī)與錄音,去河邊找鬼棵里。 笑死润文,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的衍慎。 我是一名探鬼主播转唉,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼稳捆!你這毒婦竟也來了赠法?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎砖织,沒想到半個(gè)月后款侵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侧纯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年新锈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眶熬。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡妹笆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出娜氏,到底是詐尸還是另有隱情拳缠,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布贸弥,位于F島的核電站窟坐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏绵疲。R本人自食惡果不足惜哲鸳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盔憨。 院中可真熱鬧徙菠,春花似錦、人聲如沸般渡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驯用。三九已至脸秽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蝴乔,已是汗流浹背记餐。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留薇正,地道東北人片酝。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像挖腰,于是被迫代替她去往敵國和親雕沿。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容