ansible管理部署高可用环境下的LAMP环境

一、前言

尝试通过ansible 来在centos 7系统环境下部署实现nginx+keepalived+LAMP环境,以加深对ansible的理解。部署拓扑如下:


部署拓扑图

两台nginx作为web代理服务器,配置实现keepalived做主备;后端两个apache服务器,一个部署apache+php,另一个部署apache+mysql。通过ansible管理配置以上服务器,配置完成后,能通过VIP访问到后端主机主页。

二、环境准备

因为控制终端的程序包什么的都可以通过ansible主机来管理安装配置,因此这里的我们只需要在ansible主机上安装ansible服务,并将相应的远程主机添加管理即可。

1、安装ansible服务

在ansible主机上安装ansible服务:

[root@ansible ~]# yum install -y ansible

2、添加管理远程主机

编辑/etc/ansible/hosts:

[nginx]
192.168.0.87
192.168.0.89
[apache]
192.168.0.83
192.168.0.84
[php]
192.168.0.83
[mysql]
192.168.0.84

编辑/etc/hosts,添加相应的主机名解析:

[root@ansible ~]# vim /etc/hosts
192.168.0.83 ap1.ilinux.io ap1
192.168.0.84 ap2.ilinux.io ap2
192.168.0.87 nginx1.ilinux.io nginx1
192.168.0.89 nginx2.ilinux.io nginx2

3、配置使用ssh免密钥认证管理远程主机

首先在ansible主机上创建相应的密钥文件:

[root@ansible ~]# ssh-keygen -t rsa -N ''
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
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:
fc:af:d8:8f:41:dd:d2:00:2a:d2:07:e7:68:b1:c7:d3 root@ansible
The key's randomart image is:
+--[ RSA 2048]----+
|      o . .      |
|     . O o .     |
|    . * B E .    |
|     o = . . +   |
|        S . o o  |
|         o   .   |
|          o      |
|         o +     |
|        . +oo    |
+-----------------+

然后将生成的公钥文件送往远程主机:

[root@ansible ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.83
[root@ansible ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.84
[root@ansible ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.87
[root@ansible ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.89

测试认证访问:

[root@ansible ~]# ansible all -m ping
192.168.0.83 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.0.89 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.0.87 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.0.84 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

4、配置时间同步

在部署前确保每个服务器的时间及时区是同步的:

[root@ansible ~]# ansible all -m shell -a 'echo "TZ='Asia/Shanghai'; export TZ" > /etc/profile '

配置定期同步时间:

[root@ansible ~]# ansible all -m cron -a "minute=*/3 job='/usr/sbin/ntpdate ntp1.aliyun.com &> /dev/null' name=dateupdate"
192.168.0.84 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "dateupdate"
    ]
}
192.168.0.89 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "dateupdate"
    ]
}
192.168.0.83 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "dateupdate"
    ]
}
192.168.0.87 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "dateupdate"
    ]
}

5、关闭firewalld和selinux

因此firewalld和selinux很容易对演示结果造成影响,因此这里我们统一把相应的服务器的firewalld和selinux关闭。生产环境中请按照实际需求进行定制。

[root@ansible ~]# ansible all -m shell -a 'systemctl stop firewalld; systemctl disable firewalld; setenforce 0'
192.168.0.87 | SUCCESS | rc=0 >>
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

192.168.0.89 | SUCCESS | rc=0 >>
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

192.168.0.84 | SUCCESS | rc=0 >>
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

192.168.0.83 | SUCCESS | rc=0 >>
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

三、配置roles

接着我们就可以在ansible主机上配置需要下发到各远程主机上的playbook了,这里我以roles角色定义各服务器上需要配置的服务,最后用playbook调用相应的roles进行下发配置。

1、 配置apache服务role

首先在/etc/ansible/roles目录下创建相关的目录:

[root@ansible ~]# mkdir -pv  /etc/ansible/roles/apache/{files,templates,tasks,handlers,vars,meta,default}
mkdir: 已创建目录 "/etc/ansible/roles/apache"
mkdir: 已创建目录 "/etc/ansible/roles/apache/files"
mkdir: 已创建目录 "/etc/ansible/roles/apache/templates"
mkdir: 已创建目录 "/etc/ansible/roles/apache/tasks"
mkdir: 已创建目录 "/etc/ansible/roles/apache/handlers"
mkdir: 已创建目录 "/etc/ansible/roles/apache/vars"
mkdir: 已创建目录 "/etc/ansible/roles/apache/meta"
mkdir: 已创建目录 "/etc/ansible/roles/apache/default"
[root@ansible ~]# ll /etc/ansible/roles/apache/
总用量 0

接着配置apache的配置模板:

[root@ansible ~]# vim /etc/ansible/roles/apache/templates/vhost1.conf.j2
<virtualhost *:80>
        servername www.ilinux.io
        DirectoryIndex index.html index.php
        Documentroot /var/www/html
        ProxyRequest off
        ProxyPassMatch ^/(.*\.php)$ fcgi://192.168.0.83:9000/var/www/html/$1
        ProxyPassMatch ^/(ping|status)$ fcgi://192.168.0.83:9000/$1
        <Directory / >
                options FollowSymlinks
                Allowoverride none
                Require all granted
        </Directory>
</virtualhost>

配置apache的主页文件模板:

[root@ansible ~]# vim /etc/ansible/roles/apache/templates/
index.html
<h1>This is {{ ansible_hostname }}</h1>
[root@ansible ~]# vim /etc/ansible/roles/apache/templates/
index.php
<?php
        phpinfo();
?>

配置apache的task任务:

[root@ansible ~]# vim /etc/ansible/roles/apache/tasks/main.yml
- name: install apache
  yum: name=apache state=latest
- name: install vhost file
  template: src=/etc/ansible/roles/apache/templates/vhost1.conf.j2 dest=/etc/httpd/conf.d/vhost.conf
- name: install index.html
  template: src=/etc/ansible/roles/apache/templates/index.html dest=/var/www/html/index.html
- name: install index.php
  template: src=/etc/ansible/roles/apache/templates/index.php dest=/var/www/html/index.php
- name: start httpd
  service: name=httpd state=started

2、配置php-fpm服务的role

首先创建对应的roles角色目录:

[root@ansible ~]# mkdir -pv  /etc/ansible/roles/php-fpm/{files,templates,tasks,handlers,vars,meta,default}
mkdir: 已创建目录 "/etc/ansible/roles/php-fpm"
mkdir: 已创建目录 "/etc/ansible/roles/php-fpm/files"
mkdir: 已创建目录 "/etc/ansible/roles/php-fpm/templates"
mkdir: 已创建目录 "/etc/ansible/roles/php-fpm/tasks"
mkdir: 已创建目录 "/etc/ansible/roles/php-fpm/handlers"
mkdir: 已创建目录 "/etc/ansible/roles/php-fpm/vars"
mkdir: 已创建目录 "/etc/ansible/roles/php-fpm/meta"
mkdir: 已创建目录 "/etc/ansible/roles/php-fpm/default"

接着将事先准备好的php-fpm配置模板文件,复制到指定的模板目录下并进行编辑:

[root@ansible ~]# cp /etc/php-fpm.d/www.conf /etc/ansible/roles/php-fpm/templates/www.conf
[root@ansible ~]# vim /etc/ansible/roles/php-fpm/templates/www.conf
#修改以下配置
listen = 0.0.0.0:9000
;listen.allowed_clients = 127.0.0.1
pm.status_path = /status
ping.path = /ping
ping.response = pong

然后配置相应的task任务文件:

[root@ansible ~]# vim /etc/ansible/roles/php-fpm/tasks/main.yml
- name: install epel repo
  yum: name=epel-release state=latest
- name: install php package
  yum: name={{ item }} state=latest
  with_items:
  - php-fpm
  - php-mysql
  - php-mbstring
  - php-mcrypt
- name: install config file
  template: src=/etc/ansible/roles/php-fpm/templates/www.conf dest=/etc/php-fpm.d/www.conf
- name: install session directory
  file: path=/var/lib/php/session group=apache owner=apache state=directory
- name: start php-fpm
  service: name=php-fpm state=started

3、配置mysql服务role

首先创建对应的mysql服务的roles目录:

[root@ansible ~]# mkdir -pv  /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,meta,default}
mkdir: 已创建目录 "/etc/ansible/roles/mysql"
mkdir: 已创建目录 "/etc/ansible/roles/mysql/files"
mkdir: 已创建目录 "/etc/ansible/roles/mysql/templates"
mkdir: 已创建目录 "/etc/ansible/roles/mysql/tasks"
mkdir: 已创建目录 "/etc/ansible/roles/mysql/handlers"
mkdir: 已创建目录 "/etc/ansible/roles/mysql/vars"
mkdir: 已创建目录 "/etc/ansible/roles/mysql/meta"
mkdir: 已创建目录 "/etc/ansible/roles/mysql/default"

将事先准备的mysql配置文件复制到指定的模板目录下并编辑:

[root@ansible ~]# cp /etc/my.cnf /etc/ansible/roles/mysql/templates/
[root@ansible ~]# vim /etc/ansible/roles/mysql/templates/my.cnf
#添加下面两行配置
skip-name-resolve=ON
innodb-file-per-table=ON

接着配置mysql服务的task任务:

[root@ansible ~]# vim /etc/ansible/roles/mysql/tasks/main.yml
- name: install mysql
  yum: name=mariadb-server state=latest
- name: install config file
  template: src=/etc/ansible/roles/mysql/templates/my.cnf dest=/etc/my.cnf
- name: start mysql
  service: name=mariadb-server state=started

4、配置nginx服务的role

首先创建对应的ngixn服务的目录:

[root@ansible ~]# mkdir -pv  /etc/ansible/roles/nginx/{files,templates,tasks,handlers,vars,meta,default}
mkdir: 已创建目录 "/etc/ansible/roles/nginx"
mkdir: 已创建目录 "/etc/ansible/roles/nginx/files"
mkdir: 已创建目录 "/etc/ansible/roles/nginx/templates"
mkdir: 已创建目录 "/etc/ansible/roles/nginx/tasks"
mkdir: 已创建目录 "/etc/ansible/roles/nginx/handlers"
mkdir: 已创建目录 "/etc/ansible/roles/nginx/vars"
mkdir: 已创建目录 "/etc/ansible/roles/nginx/meta"
mkdir: 已创建目录 "/etc/ansible/roles/nginx/default"

复制nginx的配置文件到指定的模板目录下并修改其内容:

[root@ansible ~]# cp /etc/nginx/nginx.conf /etc/ansible/roles/nginx/templates/
[root@ansible ~]# vim /etc/ansible/roles/nginx/templates/
http {
        ......
        upstream apservers {
                server 192.168.0.83:80;
                server 192.168.0.84:80;
        }

      ......
    server {
        ......
        location / {
                proxy_pass http://apservers;
                proxy_set_header host $http_host;
                proxy_set_header X-Forward-For $remote_addr;
        }
        ......
    }

最后配置nignx服务role的task任务:

[root@ansible ~]# vim /etc/ansible/roles/nginx/tasks/main.yml
- name: install epel
  yum: name=epel-release state=latest
- name: install nginx
  yum: name=nginx state=latest
- name: install config file
  template: src=/etc/ansible/roles/nginx/templates/nginx.conf dest=/etc/nginx/nginx.conf
- name: start nginx
  service: name=nginx state=started

5、配置keepalived服务role

首先创建keepalived的role目录:

[root@ansible ~]# mkdir -pv  /etc/ansible/roles/keepalived/{files,templates,tasks,handlers,vars,meta,default}
mkdir: 已创建目录 "/etc/ansible/roles/keepalived"
mkdir: 已创建目录 "/etc/ansible/roles/keepalived/files"
mkdir: 已创建目录 "/etc/ansible/roles/keepalived/templates"
mkdir: 已创建目录 "/etc/ansible/roles/keepalived/tasks"
mkdir: 已创建目录 "/etc/ansible/roles/keepalived/handlers"
mkdir: 已创建目录 "/etc/ansible/roles/keepalived/vars"
mkdir: 已创建目录 "/etc/ansible/roles/keepalived/meta"
mkdir: 已创建目录 "/etc/ansible/roles/keepalived/default"

接着复制对应的配置文件到指定的模板目录下,并编辑:

[root@ansible ~]# cp /etc/keepalived/keepalived.conf /etc/ansible/roles/keepalived/templates/

[root@ansible ~]# vim /etc/ansible/roles/keepalived/templates/keepalived.conf
global_defs {
   notification_email {
        root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id {{ ansible_nodename }}
   vrrp_mcast_group4 224.1.101.33
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state {{ keepalived_role }}
    interface ens33
    virtual_router_id 51
    priority {{ keepalived_pri }}
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass IKHN^2(1
    }
    virtual_ipaddress {
        192.168.0.99/24 dev ens33 label ens33:0
    }
}

编辑/etc/ansible/hosts文件,给nginx主机添加指定的对应变量:

[root@ansible ~]# vim /etc/ansible/hosts
[nginx]
192.168.0.87 keepalived_role=MASTER keepalived_pri=100
192.168.0.89 keepalived_role=BACKUP keepalived_pri=98

接着配置nginx服务的task服务:

[root@ansible ~]# vim /etc/ansible/roles/keepalived/tasks/main.yml
- name: install keepalived
  yum: name=keepalived state=latest
- name: install config file
  template: src=/etc/ansible/roles/keepalived/templates/keepalived.conf dest=/etc/keepalived/keepalived.conf
- name: start keepalived
  service: name=keepalived state=started

至此所有相关的服务的playbook roles已经定义完毕。

四、配置playbook下发配置

接着我们就来定义相应的playbook调用roles下发配置。
在/etc/ansible目录下创建目录playbooks用于存放playbook文件:

[root@ansible ~]# mkdir /etc/ansible/playbooks

1、定义ap1的playbook并下发

在/etc/ansible/playbook目录下创建ap1.yaml文件:

[root@ansible ~]# vim /etc/ansible/playbooks/ap1.yaml
#因为ap1又是apache服务器,也php-fpm服务器,所以调用apache和php-fpm两个role
- hosts: php
  remote_user: root
  roles:
  - apache
  - php-fpm

检查配置语法是否正确:

[root@ansible ~]# ansible-playbook --syntax-check /etc/ansible/playbooks/ap1.yaml

playbook: /etc/ansible/playbooks/ap1.yaml

下发安装ap1.yaml:

[root@ansible ~]# ansible-playbook /etc/ansible/playbooks/ap1.yaml

PLAY [php] ***************************************************************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************************************************
ok: [192.168.0.83]

TASK [apache : install apache] *******************************************************************************************************************************
changed: [192.168.0.83]

TASK [apache : install vhost file] ***************************************************************************************************************************
ok: [192.168.0.83]

TASK [apache : install index.html] ***************************************************************************************************************************
ok: [192.168.0.83]

TASK [apache : install index.php] ****************************************************************************************************************************
ok: [192.168.0.83]

TASK [apache : start httpd] **********************************************************************************************************************************
changed: [192.168.0.83]

TASK [php-fpm : install epel repo] ***************************************************************************************************************************
ok: [192.168.0.83]

TASK [php-fpm : install php package] *************************************************************************************************************************
changed: [192.168.0.83] => (item=[u'php-fpm', u'php-mysql', u'php-mbstring', u'php-mcrypt'])

TASK [php-fpm : install config file] *************************************************************************************************************************
changed: [192.168.0.83]

TASK [php-fpm : install session directory] *******************************************************************************************************************
changed: [192.168.0.83]

TASK [php-fpm : start php-fpm] *******************************************************************************************************************************
changed: [192.168.0.83]

PLAY RECAP ***************************************************************************************************************************************************
192.168.0.83               : ok=11   changed=6    unreachable=0    failed=0   

此时在ap1上的apache服务和php-fpm服务已经已经正常启动并监控了。


相关端口已经监听启用
正常访问ap1的php主页

2、 定义ap2的playbook并下发

编辑配置ap2.yaml:

[root@ansible ~]# vim /etc/ansible/playbooks/ap2.yaml
- hosts: mysql
  remote_user: root
  roles:
  - apache
  - mysql

检查是否有语法错误:

[root@ansible ~]# ansible-playbook --syntax-check /etc/ansible/playbooks/ap2.yaml

playbook: /etc/ansible/playbooks/ap2.yaml

下发安装ap2.yaml:

[root@ansible ~]# ansible-playbook /etc/ansible/playbooks/ap2.yaml

PLAY [mysql] *************************************************************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************************************************
ok: [192.168.0.84]

TASK [apache : install apache] *******************************************************************************************************************************
changed: [192.168.0.84]

TASK [apache : install vhost file] ***************************************************************************************************************************
ok: [192.168.0.84]

TASK [apache : install index.html] ***************************************************************************************************************************
ok: [192.168.0.84]

TASK [apache : install index.php] ****************************************************************************************************************************
ok: [192.168.0.84]

TASK [apache : start httpd] **********************************************************************************************************************************
changed: [192.168.0.84]

TASK [mysql : install mysql] *********************************************************************************************************************************
changed: [192.168.0.84]

TASK [mysql : install config file] ***************************************************************************************************************************
changed: [192.168.0.84]

TASK [mysql : start mysql] ***********************************************************************************************************************************
changed: [192.168.0.84]

PLAY RECAP ***************************************************************************************************************************************************
192.168.0.84               : ok=9    changed=5    unreachable=0    failed=0   

此时ap2上的apache服务和mysql服务应该已经监听启用。


相关接口已监听启用

ap2的主页能正常访问

3、定义两台nginx服务器的playbook并下发

编辑创建loadbalance.yaml:

[root@ansible ~]# vim /etc/ansible/playbooks/loadbalance.yaml
- hosts: nginx
  remote_user: root
  roles:
  - nginx
  - keepalived

检查是否有语法错误:

[root@ansible ~]# ansible-playbook --syntax-check /etc/ansible/playbooks/loadbalance.yaml

playbook: /etc/ansible/playbooks/ap2.yaml

下发安装loadbalance.yaml:

[root@ansible ~]# ansible-playbook /etc/ansible/playbooks/loadbalance.yaml

PLAY [nginx] *************************************************************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************************************************
ok: [192.168.0.87]
ok: [192.168.0.89]

TASK [nginx : install epel] **********************************************************************************************************************************
changed: [192.168.0.87]
changed: [192.168.0.89]

TASK [nginx : install nginx] *********************************************************************************************************************************
changed: [192.168.0.87]
changed: [192.168.0.89]

TASK [nginx : install config file] ***************************************************************************************************************************
changed: [192.168.0.89]
changed: [192.168.0.87]

TASK [nginx : start nginx] ***********************************************************************************************************************************
changed: [192.168.0.89]
changed: [192.168.0.87]

TASK [keepalived : install keepalived] ***********************************************************************************************************************
changed: [192.168.0.89]
changed: [192.168.0.87]

TASK [keepalived : install config file] **********************************************************************************************************************
changed: [192.168.0.89]
changed: [192.168.0.87]

TASK [keepalived : start keepalived] *************************************************************************************************************************
changed: [192.168.0.89]
changed: [192.168.0.87]

PLAY RECAP ***************************************************************************************************************************************************
192.168.0.87               : ok=8    changed=7    unreachable=0    failed=0   
192.168.0.89               : ok=8    changed=7    unreachable=0    failed=0   

此时在两台nginx服务器上的keepalived和nginx应该都正常启动了。


nginx1上的keepalived服务状态及端口启动情况
nginx2上的keepalived服务状态及端口启动情况

4、测试访问

此时尝试通过vip访问后端ap1和ap2的主页:

[root@ansible ~]# for i in {1..10} ; do curl http://192.168.0.99/ ; done
<h1>This is ap2</h1>
<h1>This is ap1</h1>
<h1>This is ap2</h1>
<h1>This is ap1</h1>
<h1>This is ap2</h1>
<h1>This is ap1</h1>
<h1>This is ap2</h1>
<h1>This is ap1</h1>
<h1>This is ap2</h1>
<h1>This is ap1</h1>
#访问成功

把其中一个nginx主机的keepalived服务停用,观察主备是否切换:

[root@nginx2 ~]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2018-06-07 15:26:47 CST; 8min ago
 Main PID: 10857 (keepalived)
   CGroup: /system.slice/keepalived.service
           ├─10857 /usr/sbin/keepalived -D
           ├─10858 /usr/sbin/keepalived -D
           └─10859 /usr/sbin/keepalived -D

Jun 07 15:26:47 nginx2 Keepalived_healthcheckers[10858]: Opening file '/etc/keepalived/keepalived.conf'.
Jun 07 15:34:50 nginx2 Keepalived_vrrp[10859]: VRRP_Instance(VI_1) Transition to MASTER STATE
Jun 07 15:34:51 nginx2 Keepalived_vrrp[10859]: VRRP_Instance(VI_1) Entering MASTER STATE
Jun 07 15:34:51 nginx2 Keepalived_vrrp[10859]: VRRP_Instance(VI_1) setting protocol VIPs.
Jun 07 15:34:51 nginx2 Keepalived_vrrp[10859]: Sending gratuitous ARP on ens33 for 192.168.0.99
Jun 07 15:34:51 nginx2 Keepalived_vrrp[10859]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.0.99
Jun 07 15:34:51 nginx2 Keepalived_vrrp[10859]: Sending gratuitous ARP on ens33 for 192.168.0.99
Jun 07 15:34:51 nginx2 Keepalived_vrrp[10859]: Sending gratuitous ARP on ens33 for 192.168.0.99
Jun 07 15:34:51 nginx2 Keepalived_vrrp[10859]: Sending gratuitous ARP on ens33 for 192.168.0.99
Jun 07 15:34:51 nginx2 Keepalived_vrrp[10859]: Sending gratuitous ARP on ens33 for 192.168.0.99

keepalived主备切换成功,此时服务依旧能正常访问。

至此使用ansible部署管理高可用的LAMP环境就已经完成了,后续可在此环境上搭建相应的wordpress或其他的应用服务。(不得不说,ansible真方便。。。)

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

推荐阅读更多精彩内容

  • 一、inventory介绍 前面我们介绍过ansible的hosts文件是存放被管理主机的,被管理主机比较少的情况...
    GoGooGooo阅读 7,938评论 1 14
  • 1)安装2)常用模块3)inventory4)playbook(role\tag\template)5) yaml...
    秦记阅读 3,952评论 2 5
  • 一.ansible (1) ansible: ansible是一款新出现的自动化运维系统,基于python开发并集...
    楠人帮阅读 1,875评论 0 8
  • 作为背锅侠运维工作的基本流程 运维工具的分类 : ansible的模块化: ansible密钥登陆 ansible...
    二郎5阅读 4,086评论 0 10
  • ansible是一款自动化运维工具,基于python开发,他是基于各个模块来工作的,主要由以下几个组件: conn...
    fengkaipeng阅读 1,641评论 0 1