ansible常用模块(playbook)

ansible常用模块(playbook)

hostname

例子

- name: change hostname
hostname:
 name: ansimgr

参数
name: 设置的主机名

file

例子

- name: touch ansible file
 file:
   path: /root/ansible_test/ansible_test2.yaml
   state: touch
   owner: root
   group: root
   mode: 0755

参数
follow: yes/no,默认no;如果原来的文件是link,拷贝后依旧是link
force: yes/no,默认no;强制执行
group: 设定一个群组拥有拷贝到远程节点的文件权限
mode: 等同于chmod,参数可以为“u+rwx or u=rw,g=r,o=r”
owner: 设定一个用户拥有拷贝到远程节点的文件权限
path: 目标路径,也可以用dest,name代替
src: 待拷贝文件/文件夹的原始位置。
state: file/link/directory/hard/touch/absent,默认file;file代表拷贝后是文件;link代表最终是个软链接;directory代表文件夹;hard代表硬链接;touch代表生成一个空文件;absent代表删除

blockinfile

例子

- name: edit sshd_config
blockinfile:
 backup: yes
 path: /etc/ssh/sshd_config
 block: |
   Match User ansible-agent
   PasswordAuthentication no
 state: present

参数
path: required,指定要操作的文件。
block: 指定要操作的”一段文本”,此参数有一个别名叫”content”,使用content或block的作用是相同的。
marker: 在指定文件中插入一段文本,ansible会自动为这段文本添加两个标记,一个开始标记,一个结束标记,默认情况下,开始标记为# BEGIN ANSIBLE MANAGED BLOCK,结束标记为# END ANSIBLE MANAGED BLOCK,使用marker参数自定义”标记”。比如,marker=#{mark}test ,这样设置以后,开始标记变成了# BEGIN test,结束标记变成了# END test。
state: state参数有两个可选值,present与absent,插入和删除对应标记的段落。
insertafter: 在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的后面,可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的后面。如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为EOF,表示将文本插入到文档末尾。
insertbefore: 在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的前面,可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的前面。如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为BOF,表示将文本插入到文档开头。
backup: 是否在修改文件之前对文件进行备份。
create: 当要操作的文件并不存在时,是否创建对应的文件。

lineinfile

例子

- name: set limit 2
lineinfile:
 backup: yes
 path: /etc/security/limits.conf
 insertafter: '# End of file'
 line: "{{ item }}"
 state: present
with_items:
 - '* soft nofile 655360'
 - '* hard nofile 131072'
 - '* soft nproc 655350'
 - '* hard nproc 655350'
 - '* soft memlock unlimited'
 - '* hard memlock unlimited'

参数
path/dest: 目标文件绝对路径+文件名,必须参数
line: 替换/插入的内容
regexp: 待匹配内容
insertbefore: 匹配行前面插入
insertafter: 匹配行后面插入
state: 删除匹配行,需要将值设为absent,默认值present。
backup: 是否在修改文件之前对文件进行备份。 yes/no
create: 当要操作的文件并不存在时,是否创建对应的文件。yes/no
backrefs:yes/no,backrefs为no时,如果没有匹配,则添加一行line。如果匹配了,则把匹配内容替被换为line内容;backrefs为yes时,如果没有匹配,则文件保持不变。如果匹配了,把匹配内容替被换为line内容。

setup

例子

- name: get server kernet
 setup: filter=ansible_kernel

参数
filter: 可以筛选关键词,主要可选的筛选项如下
ansible_all_ipv4_addresses #所有机器的ipv4地址
ansible_all_ipv6_addresses #所有机器的ipv6地址
ansible_date_time #系统时间
ansible_kernel #内核版本
ansible_default_ipv4 #默认机器的ipv4地址
ansible_default_ipv6 #默认机器的ipv6地址
ansible_distribution #linux系统发行版本,如centos,ubuntu,debian等
ansible_nodename #主机名
ansible_pkg_mgr #包管理器
ansible_python_version #python版本

group

例子

- name: add group admin
 group:
   gid: 1111
   name: admin
   system: yes
   state: present

参数
gid: 指创建的组ID信息
name: 指创建组名称信息
system: yes/no system=yes 则表示创建系统组
state: present(默认)/absent,指定组状态;present创建指定的用户组,absent删除指定的用户组

cron

例子

- name: start chkrootkit
cron:
 name: start chkrootkit
 minute: "0"
 hour: "2"
 weekday: "1"
 job: "/opt/chkrootkit-0.55/scripts/chkrootkit_exec.sh"
 user: root

参数
backup: yes/no,默认no 如果设置了,请在修改crontab之前创建备份。该模块在backup_file变量中返回备份的位置。
cron_file: 如果指定了该文件,将使用该文件而不是单个用户的crontab。如果这是一个相对路径,它将根据/etc/cron.d进行解释,如果它是绝对的,它通常会是/etc/crontab。要使用cron_file参数,还必须指定use。
day: 默认"" 作业应该运行的月份(1-31、、/2等)
disabled: yes/no,默认no 是否应该在crontab中禁用该作业(注释掉)。只有state=present时才有效。
env: yes/no,默认no 如果设置了,则管理crontab的环境变量。在crontab上添加了新的变量。Name和value参数是环境变量的名称和值。
hour: 默认"
" 作业应该运行的时间(0-23、、/2等)
insertafter: 与state=present和env一起使用。如果指定了,环境变量将被插入到指定环境变量的声明之后。
insertbefore: 与state=present和env一起使用。如果指定了,环境变量将被插入到指定环境变量的声明之前。
job: 执行的命令,如果设置了env,则为环境变量的值。命令不应该包含换行符。如果需要state=present。
minute: 默认"" 作业应该运行的时间(0-59、、/2等)
month: 默认"
" 作业应该运行的月份(1-12,,/2,等等)
name: crontab表项的描述,如果设置了env,则是环境变量的名称。如果需要state=absent。如果没有设置name并且state=present,那么无论现有的crontab条目是什么,都会创建一个新的crontab条目。
reboot: yes/no,默认no 是否应该在重新启动时运行作业。不赞成使用该选项。用户应该使用special_time。
special_time: annually or daily or hourly or monthly or reboot or weekly or yearly 特殊时间规范昵称。
state: absent/present,默认present 是否确保作业或环境变量存在或不存在。
user: 需要修改crontab的用户。如果不设置,该参数默认使用root。
weekday: 默认"" 作业应该运行的星期几(0-6表示周日-周六,等)

fetch

例子

- name: fetch chkrootkit
fetch:
  src: /opt/chkrootkit-0.55/scripts/chkrootkit_exec.sh
  dest: /root/

参数
dest: 保存文件的目录。例如,如果dest目录是/backup,则主机host.example.com上名为/etc/profile的src文件将被保存到/backup/host.example.com/etc/profile。主机名以库存名称为准
fail_on_missing: yes/no,默认为yes 当设置为yes时,如果由于任何原因无法读取远程文件,则任务将失败。
flat: yes/no,默认no 允许您覆盖将主机名/path/to/文件追加到目标的默认行为。如果dest以’/'结尾,它将使用源文件的基名,类似于copy模块。如果使用单个主机,或者检索每个主机唯一命名的文件,这可能很有用。如果使用多个具有相同文件名的主机,则每个主机的文件将被覆盖。
src: 要在远程系统上获取的文件。这必须是一个文件,而不是目录。在以后的版本中可能会支持递归抓取。
validate_checksum: yes/no,默认yes 在获取文件之后,验证源和目标校验和是否匹配。

firewalld

例子

- name: deny 8081 port
firewalld:
 port: 8081/tcp
 permanent: yes
 state: enabled

参数
icmp_block: 在防火墙中添加或者移除的ICMP块。
icmp_bolck_inversion: 开启/关闭防火墙区域ICMP报文反转功能。
immediate: yes/no,默认no 如果将此配置设置为永久性,则应立即应用此配置。
interface: 在防火墙中添加或移除interface
masquerade: 在在防火墙中开启或关闭masquerade功能
offline: yes/no 是否在防火墙离线时运行此模块。
permanent: yes/no 该配置是否在运行的防火墙配置中,或者在重新启动时仍然存在。注意,如果这是no, immediate被假定为yes。
port: 在防火墙中添加或移除端口名称或端口范围。端口范围必须为PORT/PROTOCOL或PORT-PORT/PROTOCOL格式。
rich_rule: rich_rule添加或删除到防火墙
service: 在防火墙中添加或移除服务名称该服务必须在firewall-cmd --get-services的输出中列出。
source: 在防火墙中添加或移除某个来源的网络
state: absent/disabled/enabled/present 启用或禁用一项设置。对于端口:该端口是否接受(enabled)或拒绝(disabled)连接。状态的(present)和(absent)只能在区域级别操作中使用(即,当除了zone和state没有设置其他参数时)。
timeout: 默认0 该规则应在非永久性时生效的时间
zone: 添加或移除的防火墙区域。注意,可以为每个系统配置默认的区域,可能的值有block, dmz, drop, external, home, internal, public, trusted, work,public

script

例子

- name: sh chkrootkit
script:
 cmd: /opt/chkrootkit-0.55/scripts/chkrootkit_exec.sh

参数
chdir: 在运行脚本之前,在远程节点上切换到这个目录。
cmd: 要运行的本地脚本的路径,后跟可选参数。
creates: 远程节点上的文件名,如果它已经存在,则不会运行此步骤。
decrypt: yes/no,默认yes 此选项控制使用保险库对源文件进行自动解密。
executable: 用于调用脚本的可执行文件的名称或路径。
free_form: 本地脚本文件的路径,后跟可选参数。
removes: 远程节点上的文件名,如果不存在,则不会运行此步骤。

user

例子

- name: add user luorf
 user: 
   system: yes
   comment: user luorf
   home: /home/luorf
   groups: root
   name: luorf 
   shell: /bin/bash

参数
system: 默认创建为普通用户,为yes则创建系统用户
append: 添加一个新的组
comment: 添加描述信息
createhome: 给用户创建家目录
force: 强制删除用户
group: 创建用户主组
groups: 将用户加入组或者附属组添加
home: 指定用户的家目录
name: 表示状态,是否create、remove、modify
password: 指定用户的密码,为加密密码
remove: 删除用户
shell: 设置用户的shell登录环境
uid: 设置用户ID
update_password: 修改用户密码
state: 用户状态,默认为present,表示新建用户

command

例子

- name: cat hosts file
 command: chdir=/root ls -lt 

参数
chdir: 执行命令前,切换到目录
creates: 当该文件存在时,不执行该步骤
executable: 切换shell来执行命令,需要使用命令的绝对路径
free_from: 需要执行的脚本,一般使用Ansible的-a参数代替。
removes: 当该文件不存在时,不执行该步骤
warn: 如果在ansible.cfg中存在告警,如果设定了false,不会告警该行

说明

command模块不支持变量、重定向、管道符等

shell

例子

- name: hosts bak
shell: cp /etc/hosts /etc/hosts.bak.`date +%Y%m%d`

参数

chdir: 在哪个目录下执行shell命令,相当于执行shell命令前先cd到对应目录

creates: 如果存在某文件,就不执行shell

removes: 如果不存在某文件,就不执行shell;与creates左右相反

executable: 修改并指定shell解释器来执行命令

free_form: 指的就是具体的shell命令,实际上是一个不存在的选项

ping

例子

- name: ping all server
ping:
 data: crash

参数
data: 为ping返回值返回的数据。默认为’pong’,如果该参数设置为crash,模块将引发异常。

make

例子

- name: Build ClamAV 3 
make:
 chdir: /root/clamav-{{clamav_version}}/build
 target: install 
become: yes

参数
chdir: 在执行task之前,需要切换的目录路径—必须

file: 标准Makefile的路径

params: 一些额外的需要传给make命令的参数

target: make要执行的操作,可以写:install/test/all

make.params.PREFIX: 编译之后的文件存放位置。适用于不是root用户执行的脚本

archive

例子

- name:  archive ansible test files
 archive:
   path: /root/ansible_test/
   dest: /root/ansible_test.gz
   owner: root

参数
path: 远程主机上需要被打包/压缩的源文件(可以是文件列表,支持glob模式)
dest: 打包/压缩后的包文件路径(包文件的父目录必须存在);如果包文件已存在,则会被覆盖。
format: 指定压缩类型,包括:bz2、gz(默认)、tar、xz、zip
owner: 指定属主
group: 指定属组
mode: 指定权限
remove: yes|no,默认为no,在打包/压缩后,不删除源文件

unarchive

例子

- name: Unarchive kubernetes package
unarchive:
 src: "/opt/kubernetes-server-linux-amd64.tar.gz"
 dest: "/usr/local/bin/"
 remote_src: yes
 extra_opts:
  - --strip-components=3
 exclude:
  - "*.tar"
  - "*_tag"
  - "*.org"
  - "*.io"
  - "*.com"
  - "*.net"

参数
creates: 如果指定的绝对路径(文件或目录)已存在,则不会运行此步骤。。
copy: 默认为yes,拷贝的文件从ansible主机复制到远程主机,如果没有可复制对象,在远程主机上寻找,no在远程主机上寻找src源文件解压
src: tar源路径,可以是ansible主机上的路径,也可以是远程主机上的路径,如果是远程主机上的路径,则需设置copy=no
dest: 远程主机上的目标绝对路径
mode: 设置解压缩后的文件权限
exec: 列出需要排除的目录和文件
remote_src: 设置remote_src=yes为解包目标上已经存在的档案。对于Windows目标,改用win_unzip模块。
owner: 解压后文件或目录的属主
group: 解压后的目录或文件的属组
exclude: 列出要从unarchive操作中排除的目录和文件条目。
extra_opts:通过传入数组指定其他选项
keep_newer:不要替换比归档文件更新的现有文件

k8s

例子

- name: create namespace
k8s:
  name: my-namespace
  api_version: v1
  kind: Namespace
  state: present

参数
name: 用于指定对象的名称

api_version: 指定API版本号,默认“v1”

force:yes/no,默认为no;如果设置为“yes”,并且存在状态,则将替换现有对象。

kind: 指定对象资源类型

namespace:用于指定对象的命令空间

state:absent/present /patched,默认为present ;present,如果不存在,则安装;absent,如果存在,则删除,patched,如果存在,则修补

reboot

例子

- name: Wait for server to restart
reboot:
 reboot_timeout: 180

参数
reboot_timeout: 等待计算机重新启动并响应测试命令的最长秒数,默认为600S

test_command: 重启后测试命令,默认为“whoami”

msg:重启前提示用户的消息,默认为“Reboot initiated by Ansible”

service

例子

- name: init service chrony
service:
 name: chronyd 
 enabled: yes 
 state: started

参数
name(required): 设置启停服务名称
enabled: 设置服务是否开机自启动,可选项yes/no;如果参数不指定,原有服务开机自启动状态进行保留
sleep: 如果执行了restarted,则在stop和start之间沉睡几秒钟
state: 需要对当前服务执行的动作,可选项reloaded(平滑重启),restarted(重启),started(启动),stopped(停止)

get_url

例子

- name: get file calico-etcd.yaml
get_url: 
 url=https://docs.projectcalico.org/manifests/calico-etcd.yaml
 dest=/root/
 validate_certs=no

参数
dest: 指定将文件下载的绝对路径—必须
url: 文件的下载地址(网址)—必须
url_username: 用于http基本认证的用户名
url_password: 用于http基本认证的密码
validate_certs: 如果否,SSL证书将不会验证。这只应在使用自签名证书的个人控制站点上使用
owner: 指定属主
group: 指定属组
mode: 指定权限

copy

例子

- name: calico-etcd cfg 1
copy:
 src: calico.sh
 dest: /root/
 owner: root
 group: root
 mode: 0755

参数
src: 用于指定需要copy的文件或目录。
dest: 用于指定文件将被拷贝到远程主机的哪个目录中,dest为必须参数。
content: 当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src与content两个参数必有其一,否则会报错。
force: 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖,可选值有yes和no,默认值为yes,表示覆盖,如果设置为no,则不会执行覆盖拷贝操作,远程主机中的文件保持不变。
backup: 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否对远程主机的文件进行备份,可选值有yes和no,当设置为yes时,会先备份远程主机中的文件,然后再将ansible主机中的文件拷贝到远程主机。
owner : 指定文件拷贝到远程主机后的属主,但是远程主机上必须有对应的用户,否则会报错。
group: 指定文件拷贝到远程主机后的属组,但是远程主机上必须有对应的组,否则会报错。
mode: 指定文件拷贝到远程主机后的权限,如果你想将权限设置为”rw-r--r--“,则可以使用mode=0644表示,如果你想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示。

template

例子

- name: 将index.html文件复制到节点,并将其中的变量替换为对应的值
template:
 src: ~/play/template/index.html
 dest: /var/www/html/index.html
 
$ cat index.html
# 将变量写在文件中
welcome to {{ ansible_hostname }} on {{ ansible_ztuzex7lqa.ipv4.address }} 

参数

backup: yes/no,建立个包括timestamp在内的文件备份,以备不时之需
dest: 必选项,远程节点上的绝对路径,用于放置template文件
group: 设置远程节点上的的template文件的所属用户组
mode: 设置远程节点上的template文件权限。类似Linux中chmod的用法
owner: 置远程节点上的template文件所属用户
src: 必选项,本地Jinjia2模版的template文件位置

filesystem

例子

- name: Create a ext4 filesystem on /dev/sdb1 and check disk blocks
filesystem:
 fstype: ext4
 dev: /dev/sdb1
 opts: -cc

参数
fstype: 文件系统的类型(Choices: btrfs, ext2, ext3, ext4, ext4dev, f2fs, lvm, ocfs2, reiserfs, xfs, vfat,swap)
dev: 预备检查的硬盘分区
force: yes/no,默认为no;强制格式化文件系统,在已经格式化文件系统的基础上重新格式化文件系统需要把参数配成yes
opts: 其他mkfs命令的参数

lvol

例子

- name: Create a logical volume of 512m with disks /dev/sdb1 and /dev/sdb2
lvol:
 vg: firefly
 lv: test
 size: 512
 pvs: /dev/sdb1,/dev/sdb2

参数
vg: 在哪个卷组上创建lv
lv: 逻辑卷名
size: 逻辑卷大小,默认单位是M。
pvs: 指定物理卷
force: yes/no,默认no,即默认不允许缩小和删除lv操作,如果一定要执行就force=yes
state: 模块状态,absent代表删除,present代表新建,默认是present。
active: 卷是否已激活并且对主机可见

lvg

例子

- name: Create a volume group on top of /dev/sdb1 with physical extent size = 32MB
lvg:
 vg: vg.services
 pvs: /dev/sdb1
 pesize: 32

参数
vg: 要创建的卷组名称
pvs: 要加入到卷组中的物理卷列表
pesize: 指定pe大小,默认值是4M,默认单位是M。
state: 模块状态,absent代表删除,present代表新建,默认是present。

yum_repository

例子

- name: Add repository
yum_repository:
 name: epel
 description: EPEL YUM repo
 baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/

参数
name: 指定repository ID。
description: 软件源的描述信息。
file: 保存repo信息的文件(不用加.repo后缀);如果不指定,默认保存在以name命名的repo文件中。
baseurl: repodata文件的URL。
state: present(默认)或absent。
mirrorlist: mirrorlist是一个包含多个baseurl的列表文件,这里指定的是mirrorlist文件的URL。
gpgcheck: yes|no,是否需要对该软件源的程序包进行GPG校验。没有默认值,如果不设置,将会延用/etc/yum.conf中的配置,或者系统默认的no。

package_facts

例子

- name: take installed package
package_facts:
 manager: auto

- name: list installed package
debug:
 var: ansible_facts.packages

参数
manager: auto/rpm/apt/portage/pkg/pacman/apk,默认auto;表示系统使用的包管理器,auto表示自动判断包管理器类型

strategy:first/all,默认first;如何查询系统上的程序包管理器。 first意味着它将仅返回有关第一个受支持的程序包管理器的信息。 all 将返回系统上所有受支持的可用软件包管理器的信息。

package

例子

- name: install package mariadb
package:
 name:
   - mariadb-server
 state: latest

参数
name: 指定要安装的软件包名
state: present/absent;present 安装 absent 卸载

yum/dnf

例子

- name: install service chrony
dnf:
 name:
  - chrony

参数
name: 用于指定需要管理的软件包,比如 chrony。
state: 状态 present,installed,removed,latest,absent;默认为present;installed and present等效;latest标志安装yum中最新版本;absent and removed 等效,表示删除安装包。
disable_gpg_check: 用于禁用rmp包的公钥gpg验证,默认值no,表示不做验证,设置为yes 表示禁用验证,即不验证包,直接安装。在对应的yum源没有开启gpg验证的情况下,需要将此参数的值设置为yes,否则会报错而无法进行安装。
enablerepo: 用于指定安装软件包是临时启用的yum源。假如你想要从A源中安装软件,但是你不确定A源是否启用了,你可以在安装软件包时将此参数的值设置为yes,即使A源的设置是未启用,也可以在安装软件包时临时启用A源。
Disablerepo: 用于指定安装软件包是临时禁止用的yum源。当多个yum源中同时存在要安装的软件包时,可以使用此参数临时禁用某个源

mount

例子

- name: mount media
mount:
 src=/dev/sr0
 path=/media
 state=mounted
 fstype=iso9660

参数
src: 定义挂载内容
path: 设备挂载至本地的路径,必须指定
fstype: 挂载的文件系统类型,xfs、nfs...,必须指定
opts: 挂载的参数,defaults、ro...
state: 挂载的状态,absent/mounted/unmounted;mounted进行挂载,修改/etc/fstab信息,unmounted临时卸载,不修改/etc/fstab信息,absent永久性卸载,并修改 /etc/fstab信息

其他

main.yml

例子

# cat main.yml 
- import_tasks: kube-proxy_cfg.yml 

参数

import_tasks:静态加载,playbook在运行一开始解析的时候,加载子任务中全部变量;

include_tasks:动态加载,playbook在执行到该子任务的时候,才会加载该子任务中全部变量;

补充:import_tasks调用的子任务文件名称不可以使用变量,但是include_tasks调用的子任务名称则可以加变量;import_tasks会调用子任务中的所有tag,使用–list-tags参数时也能看到,但是include_tasks调用的子任务中如果定义了tag,则不会生效。

常用的通用参数

忽略错误

ignore_errors: True

打标签

tags: kube-proxy_cfg

输出结果

register: result3
- debug:
 var: result3.stdout

判断后输出结果

  debug:
    msg: "NetworkManager版本:{{ansible_facts.packages['NetworkManager'][0].version}}"
  when: "'NetworkManager' in ansible_facts.packages" 
  # 如果NetworkManager在已安装列表中,显示NetworkManager的版本

循环参数

 line: "{{ item }}"
with_items:
 - '* soft nofile 655360'
 - '* hard nofile 131072'
 - '* soft nproc 655350'
 - '* hard nproc 655350'
 - '* soft memlock unlimited'
 - '* hard memlock unlimited'

使用root或者sudoer的权限

  become: yes

如何查询模块的用法和写法

执行命令ansible-doc 「ansiblem模块名称」,然后输入「/EXAMPLE(注意大写) 」回车键

$ ansible-doc user
/EXAMPLE
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容