day38 ansible自動(dòng)化管理實(shí)踐

SSH批量管理項(xiàng)目如何一鍵一秒鐘完成:一秒完成

1.ssh-keygen非交互式創(chuàng)建秘鑰對:

具體命令:

ssh-keygen -f ~/.ssh/id_rsa -P '' -p

參數(shù)講解:

ssh-keygen:密鑰對創(chuàng)建工具
[-P old-passphrase] :密碼
[-f output_keyfile ]:輸出的秘鑰文件
[-q ]:不輸出信息
[-t dsa ]:指定秘鑰類型

2.ssh-copy-id不需要提示yes/no分發(fā)秘鑰

具體命令:

ssh-copy-id -f -i ~/.ssh/id_rsa.pub -o StrictHostKeyChecking=no 172.16.1.8

參數(shù)講解:

ssh-copy-id -f -i ~/.ssh/id_rsa.pub -o StrictHostKeyChecking=no root172.16.1.8
ssh-copy-id [-f] [-i [identity_file]] [-p port] [[-o <ssh -o options>] ...] [user@]hostname
說明:
-f :force mode 強(qiáng)制
[-i [identity_file]] 指定秘鑰文件
[[-o <ssh -o options>] ...] 指定ssh參數(shù)選項(xiàng)谎仲。

3.sshpass工具:指定密碼文件非人工交互分發(fā)秘鑰

具體命令:

sshpass -p123456 ssh-copy-id -f -i ~/.ssh_rsaput "-o StrictHostKeyChecking=no" 172.16.1.7

參數(shù)講解:

[root@web02 ~]# sshpass -help
Usage: sshpass [-f|-d|-p|-e] [-hV] command parameters
sshpass -p123456 ssh-copy-id -f -i ~/.ssh/id_rsa.pub "-o StrictHostKeyChecking=no" 172.16.1.7
sshpass [-f|-d|-p|-e] [-hV] command parameters

-p password   Provide password as argument (security unwise)    #指定用戶密碼操作

4.一鍵配置實(shí)戰(zhàn)

把web02作為分發(fā)服務(wù)器:
web02(8)-->m01(61)
web02(8)-->web01(7)

ssh-keygen -f ~/.ssh/id_rsa  -P '' -q
ssh-copy-id -f -i ~/.ssh/id_rsa.pub "-o StrictHostKeyChecking=no" 172.16.1.7
sshpass -p123456 ssh-copy-id -f -i ~/.ssh/id_rsa.pub "-o StrictHostKeyChecking=no" 172.16.1.7

#!/bin/bash
#yum install sshpass -y
ssh-keygen -f ~/.ssh/id_rsa  -P '' -q
for ip in 7 61
do
  sshpass -p123456 ssh-copy-id -f -i ~/.ssh/id_rsa.pub "-o StrictHostKeyChecking=no" 172.16.1.$ip
done
#test
ssh 172.16.1.7 "ifconfig eth0"
ssh 172.16.1.61 "ifconfig eth0"

一俩檬、ansible自動(dòng)化管理實(shí)戰(zhàn)

1.ansible介紹

ssh秘鑰認(rèn)證+腳本批量管理鲤妥。
特點(diǎn):簡單终抽、使用
看起來比較low秕狰,需要人工寫腳本柬唯,類似實(shí)時(shí)復(fù)制的inotify工具隐砸。
2013以前這種方式很普遍。

2.批量管理工具歷史

SSH+腳本------> CFEngine------> Puppet------> saltack----------------------------> ansible
08年以前 -------->07-08年--------->10-13年------>14-17年(Python開發(fā))------>16- (python開發(fā))

3.為什么用ansible吏颖?

簡單搔体、方便、容易學(xué)習(xí)半醉、功能同樣強(qiáng)大疚俱。
ansible有配置文件,可以多線程直接實(shí)現(xiàn)缩多。
不需要寫腳本呆奕,類似實(shí)時(shí)復(fù)制的sersync。

4.什么是ansible衬吆?

ansible是一個(gè)用來遠(yuǎn)程管理服務(wù)器的工具軟件梁钾。
ansible是一個(gè)用來批量部署遠(yuǎn)程主機(jī)上服務(wù)的工具。這里“遠(yuǎn)程主機(jī)(Remote Host)”是指任何可以通過SSH登錄的主機(jī)逊抡,所以它既可以使遠(yuǎn)程虛擬機(jī)或物理機(jī)姆泻,也可以是本地主機(jī)。
ansible通過SSH協(xié)議實(shí)現(xiàn)管理節(jié)點(diǎn)與遠(yuǎn)程節(jié)點(diǎn)之間的通信。理論上來說拇勃,只要能通過SSH登錄到遠(yuǎn)程主機(jī)來完成的操作四苇,都可以通過ansible實(shí)現(xiàn)批量自動(dòng)化操作。
涉及管理操作:復(fù)制文件潜秋、安裝服務(wù)蛔琅、服務(wù)啟動(dòng)定制管理、配置管理等等峻呛。

5.為什么要用批量管理工具運(yùn)維罗售?

提高效率,百度幾萬臺(tái)服務(wù)器钩述,阿里幾十萬臺(tái)服務(wù)器寨躁。
如何省錢?
SSD+SATA 熱點(diǎn)存儲(chǔ)

6.ansible特點(diǎn)

ansible基于Python語言實(shí)現(xiàn)牙勘,有Paramiko和PyYAML兩個(gè)關(guān)鍵模塊構(gòu)建职恳。
Shell、Python是Linux運(yùn)維學(xué)員避諱的兩門語言方面。

1)安裝部署過程特別簡單放钦,學(xué)習(xí)曲線很平坦
2)不需要單獨(dú)安裝客戶端,只是利用現(xiàn)有的SSHD服務(wù)(協(xié)議)即可
3)不需要服務(wù)端(no server)
4)ansible playbook恭金,采用yaml配置操禀,提前編排自動(dòng)化任務(wù)
5)ansible功能模塊較多,對于自動(dòng)化的場景支持豐富横腿。

7.ansible架構(gòu)介紹

1颓屑、連接插件connectior plugins用于連接主機(jī) 用來連接被管理端
2、核心模塊 core modules 連接主機(jī)實(shí)現(xiàn)操作耿焊, 它依賴于具體的模塊來做具體的事情
3揪惦、自定義模塊 custom modules器腋,根據(jù)自己的需求編寫具體的模塊
4榜苫、插件 plugins抗悍,完成模塊功能的補(bǔ)充
5、劇本 playbooks,ansible的配置文件,將多個(gè)任務(wù)定義在劇本中,由ansible自動(dòng)執(zhí)行
6、主機(jī)清單 inventor,定義ansible需要操作主機(jī)的范圍
最重要的一點(diǎn)是 ansible是模塊化的 它所有的操作都依賴于模塊

8.ansible實(shí)踐環(huán)境準(zhǔn)備

61(m01)====>31(nfs01)
61(m01) ====>41(backup)

9.安裝ansible

m01管理機(jī):

yum install epel-release -y
yum install ansible -y

#如果有l(wèi)ibselinux-python就不執(zhí)行下面的命令了咧党。
#rpm -qa |grep libselinux-python
#yum install libselinux-python -y

其他所有機(jī)器:

#rpm -qa |grep libselinux-python
#yum install libselinux-python -y

10.zhuji 列表配置

ssh列表實(shí)現(xiàn)方法:

for n  in 7 8
do 
 echo 172.16.1.$n
done

/etc/ansible/hosts主機(jī)資產(chǎn)清單文件聪舒,用于定義被管理主機(jī)的認(rèn)證信息 

例如:ssh登錄用戶名止吁、密碼以及key相關(guān)信息俄删。如何配置Inventory文件
1.主機(jī)支持主機(jī)名通配以及正則表達(dá)式,例如web[1:3].oldboy.com代表三臺(tái)主機(jī)
2.主機(jī)支持基于非標(biāo)準(zhǔn)的ssh端口,例如web1.oldboyedu.com:6666
3.主機(jī)支持指定變量庐椒,可對個(gè)別主機(jī)的特殊配置,如登陸用戶\密碼
4.主機(jī)組支持指定變量[group_name:vars],同時(shí)支持嵌套組[game:children]

實(shí)踐:

cp /etc/ansible/hosts{,.ori}
cat >/etc/ansible/hosts<<EOF
[oldboy]
172.16.1.31
172.16.1.41

[oldgirl]
172.16.1.31
172.16.1.41
172.16.1.51
EOF
cat /etc/ansible/hosts

/etc/ansible/ansible.cfg #ansible的配置文件

11.

直接執(zhí)行如下命令會(huì)報(bào)錯(cuò):

ansible oldboy -m command -a "free -m"

基于SSH秘鑰認(rèn)證的前提下:

如果沒有做SSH秘鑰認(rèn)證炬灭,可以把用戶名寫到
/etc//ansible/hosts
[oldboy_pass]
172.16.1.7 ansible_ssh_user=root ansible_ssh_pass=123456
172.16.1.8 ansible_ssh_user=root ansible_ssh_pass=123456

ansible oldboy -m command -a "free -m"
要想成功,先解決yes/no的問題靡菇。
1.ssh 連接一遍

ssh 172.16.1.31

2.ssh -o 參數(shù)

ansible關(guān)閉ssh首次連接時(shí)的yes/no提示重归。

使用ssh連接時(shí),可以使用-o參數(shù)將StrictHostKeyChecking設(shè)置為no厦凤,避免使用ssh連接時(shí)避免首次連接時(shí)讓輸入yes/no部分的提示鼻吮。

方法一:修改/etc/ansible/ansible.cfg中的374行。

369 [ssh_connection]
370 
371 # ssh arguments to use
372 # Leaving off ControlPersist will result in poor performance, so use
373 # paramiko on older platforms rather than removing it, -C controls compression use
374 #ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s

374行改為:
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no

方法二:修改/etc/ansible/ansible.cfg中的71行较鼓。

70 # uncomment this to disable SSH key host checking
71 #host_key_checking = False
71行的注釋取消:host_key_checking = False


目標(biāo):ansible是不是需要面秘鑰認(rèn)證(ssh免秘鑰認(rèn)證)椎木?YES

[root@m01 ~]# cat /etc/ansible/hosts
[oldboy]
172.16.1.31
172.16.1.7

還原/etc/ansibleansible.cfg配置,重啟服務(wù)器:

[root@m01 ~]# ansible oldboy -m command -a "free -m"
The authenticity of host '172.16.1.7 (172.16.1.7)' can't be established.
ECDSA key fingerprint is SHA256:qZSBkrmOv7xO/63qOU1uLXkPyNVHdkqvrNAcAmXqNEk.
ECDSA key fingerprint is MD5:23:d0:cb:a9:f4:7c:0b:eb:2d:07:00:e1:a3:12:d8:33.
Are you sure you want to continue connecting (yes/no)? The authenticity of host '172.16.1.31 (172.16.1.31)' can't be established.
ECDSA key fingerprint is SHA256:qZSBkrmOv7xO/63qOU1uLXkPyNVHdkqvrNAcAmXqNEk.
ECDSA key fingerprint is MD5:23:d0:cb:a9:f4:7c:0b:eb:2d:07:00:e1:a3:12:d8:33.
Are you sure you want to continue connecting (yes/no)?

解決yes/no不需要輸入問題:

修改ansible.cfg 374行:(/etc/ansible/ansible.cfg)
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no

再執(zhí)行博烂,報(bào)錯(cuò):

[root@m01 ~]# ansible oldboy -m command -a "free -m"
172.16.1.7 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: Warning: Permanently added '172.16.1.7' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,password).", 
    "unreachable": true
}
172.16.1.31 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: Warning: Permanently added '172.16.1.31' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", 
    "unreachable": true
}

解決公鑰問題:

ssh-keygen -f ~/.ssh/id_rsa  -P '' -q
for ip in 7
do
  sshpass -p123456 ssh-copy-id -f -i ~/.ssh/id_rsa.pub "-o StrictHostKeyChecking=no" 172.16.1.$ip
done
#test
ssh 172.16.1.7 "ifconfig eth0"

執(zhí)行ansible命令:

[root@m01 ~]# ansible oldboy -m command -a "free -m"
172.16.1.31 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", 
    "unreachable": true
}
172.16.1.7 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:            972          69         807           7          95         771
Swap:           767           0         767

for ip in 31
do
  sshpass -p123456 ssh-copy-id -f -i ~/.ssh/id_rsa.pub "-o StrictHostKeyChecking=no" 172.16.1.$ip
done
#test
ssh 172.16.1.31 "ifconfig eth0"

[root@m01 ~]# ansible oldboy -m command -a "free -m"
172.16.1.7 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:            972          69         807           7          95         771
Swap:           767           0         767

172.16.1.31 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:            972          71         804           7          96         768
Swap:           767           0         767

驗(yàn)證:刪除公鑰香椎,是不是不可以了?
重啟后禽篱,不行畜伐,重啟前可以

[root@m01 ~]# ansible oldboy -m command -a "free -m"
172.16.1.7 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: Warning: Permanently added '172.16.1.7' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,password).", 
    "unreachable": true
}
172.16.1.31 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: Could not create directory '/root/.ssh'.\r\nWarning: Permanently added '172.16.1.31' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", 
    "unreachable": true
}

修改Host增加用戶和密碼:

[root@m01 ~]# cat /etc/ansible/hosts
#[oldboy]
#172.16.1.31
#172.16.1.7

[oldboy_pass]
172.16.1.31 ansible_ssh_user=root ansible_ssh_pass=123456
172.16.1.7 ansible_ssh_user=root ansible_ssh_pass=123456

結(jié)果:
[root@m01 ~]# ansible oldboy_pass -m command -a "free -m"
172.16.1.31 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:            972          79         791           7         101         758
Swap:           767           0         767

172.16.1.7 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:            972          69         806           7          95         771
Swap:           767           0         767

結(jié)論:使用SSH連接:
密碼認(rèn)證: host里主機(jī)后面加密碼 Paramiko模塊 重點(diǎn):
秘鑰認(rèn)證:提前發(fā)公鑰,才能用ansible. SSHPASS工具

特殊端口:

[oldboy]
172.16.1.7  ansible_port=52113  ansible_user=root ansible_ssh_pass=123456
172.16.1.8  ansible_port=52113  ansible_user=root ansible_ssh_pass=123456

12.基于SSH秘鑰認(rèn)證的實(shí)踐

一鍵創(chuàng)建及分發(fā)秘鑰:

#!/bin/bash
ssh-keygen -f ~/.ssh/id_rsa  -P '' -q
for ip in 7 8 41 31
do
  sshpass -p123456 ssh-copy-id -i ~/.ssh/id_rsa.pub "-o StrictHostKeyChecking=no" 172.16.1.$ip
done
[root@m01 ~]# cat /etc/ansible/hosts
[oldboy]
172.16.1.31
172.16.1.41
172.16.1.7

[root@m01 ~]# ansible oldboy -m command -a "free -m" #和前面sh cmd.sh "free -m"

13.ansible命令參數(shù):

-m MODULE_NAME谆级,模塊名字烤礁,默認(rèn)command
-a MODULE_ARGS讼积,模塊參數(shù)
-f FORKS 并發(fā)進(jìn)程數(shù),默認(rèn)5個(gè)
-i INVENTORY (dufauit=/etc/ansible/hosts)指定主機(jī)列表文件

ansible
ansible-doc
ansible-playbook
ansible-galaxy

14.ansible模塊查看和幫助

查找模塊:

ansible-doc -l #模塊就是Linux命令了脚仔。

查看某個(gè)模塊的具體參數(shù)幫助:

ansible-doc -s command #linux命令參數(shù)

1.command模塊

1)功能說明:

command Executes a command on a remote node
功能說明: 執(zhí)行一個(gè)命令在遠(yuǎn)程節(jié)點(diǎn)上

操作實(shí)踐:

ansible oldboy -m command -a "free -m"
ansible oldboy -m command -a "df -h"
ansible oldboy -m command -a "ls /root"
ansible oldboy -m command -a "cat redhat-release"
ansible oldboy -m command -a "cat /etc/redhat-release"
最通用的功能勤众。

[root@m01 ~]# ansible oldboy -m command -a "cat /etc/redhat-release"
172.16.1.7 | CHANGED | rc=0 >>
CentOS Linux release 7.6.1810 (Core) 

172.16.1.31 | CHANGED | rc=0 >>
CentOS Linux release 7.6.1810 (Core) 

172.16.1.41 | CHANGED | rc=0 >>
CentOS Linux release 7.6.1810 (Core) 

[root@m01 ~]# cat /server/scripts/cmd.sh 
for n in 31 41
do
   echo "=====172.16.1.$n======"
   ssh 172.16.1.$n "$1"
done
[root@m01 ~]# sh /server/scripts/cmd.sh "cat /etc/redhat-release"
=====172.16.1.31======
CentOS Linux release 7.6.1810 (Core) 
=====172.16.1.41======
CentOS Linux release 7.6.1810 (Core) 

特殊:不支持的東西,例如 > < | &等 $HOME鲤脏,替代方案用shell模塊
ansible oldboy -m shell -a "ps -ef|grep ssh"
ansible oldboy -m shell -a "echo oldboy >/tmp/a.log"

2)常用參數(shù)說明及實(shí)踐

[root@m01 ~]# ansible-doc -s command
- name: Executes a command on a remote node
  command:
      argv:                  # Allows the user to provide the command as a list vs. a string.  Only the
                               string or the list form can be provided, not
                               both.  One or the other must be provided.
      chdir:                 # Change into this directory before running the command.
      creates:               # A filename or (since 2.0) glob pattern. If it already exists, this step
                               *won't* be run.
      free_form:             # (required) The command module takes a free form command to run.  There is no
                               parameter actually named 'free form'. See the
                               examples!
      removes:               # A filename or (since 2.0) glob pattern. If it already exists, this step *will*  be run.
      stdin:                 # Set the stdin of the command directly to the specified value.
      warn:                  # If command_warnings are on in ansible.cfg, do not warn about this particular
                               line if set to `no'.

參數(shù):chdir=/tmp配置相當(dāng)于cd /tmp
[root@m01 ~]# ansible oldboy -m command -a "pwd chdir=/etc"
ansible oldboy -m shell -a "cd /etc/;pwd"
參數(shù):creates=/etc 相當(dāng)于條件測試 [ -e /etc ]||pwd 和下面removes相反
[root@m01 ~]# ansible oldboy -m command -a "pwd creates=/etc"
參數(shù):removes=/root 相當(dāng)于條件測試 [ -e /root ]&&ls /root
ansible oldboy -m command -a "ls /root removes=/root"
ansible oldboy -m shell -a "[ -d /etc ]||pwd"
[root@m01 ~]# ansible oldboy -m command -a "cat /etc/hosts removes=/etc/hosts"
參數(shù):warn=False 忽略警告
[root@m01 ~]# ansible oldboy -m command -a "chmod 000 /etc/hosts warn=False"

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末们颜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子猎醇,更是在濱河造成了極大的恐慌窥突,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硫嘶,死亡現(xiàn)場離奇詭異阻问,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)沦疾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門称近,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哮塞,你說我怎么就攤上這事刨秆。” “怎么了忆畅?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵衡未,是天一觀的道長。 經(jīng)常有香客問我家凯,道長缓醋,這世上最難降的妖魔是什么绊诲? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上竭鞍,老公的妹妹穿的比我還像新娘板惑。我一直安慰自己,他們只是感情好偎快,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布晒夹。 她就那樣靜靜地躺著裆馒,像睡著了一般姊氓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喷好,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音梗搅,去河邊找鬼。 笑死荡短,一個(gè)胖子當(dāng)著我的面吹牛哆键,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播籍嘹,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼噩峦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了识补?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對情侶失蹤祝辣,失蹤者是張志新(化名)和其女友劉穎切油,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孕荠,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡攻谁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了个曙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片受楼。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖猴贰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情慌植,我是刑警寧澤义郑,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站交汤,受9級(jí)特大地震影響劫笙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜填大,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一允华、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧靴寂,春花似錦、人聲如沸褐隆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虫埂。三九已至圃验,卻和暖如春缝呕,著一層夾襖步出監(jiān)牢的瞬間斧散,已是汗流浹背摊聋。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留箍镜,地道東北人煎源。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像歇僧,于是被迫代替她去往敵國和親锋拖。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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