Ansible基础(一)

前言:

1、ansible输出结果颜色含义:
绿色: 命令执行成功 没有对远程主机做任何修改
黄色: 命令执行成功 大部分情况表示对远程主机做了改动
红色: 命令执行失败
粉色: 建议进行操作的方法
蓝色: 显示命令或剧本执行的过程

2、ansible帮助文档如何查看:
ansible-doc -l --- 查看所有ansible模块信息
ansible-doc -s 模块 --- 查看指定模块详细说明
ansible-doc 模块 --- 查看指定模块更加详细说明

一、ansible简介:

1、ansible 是基于sshd服务实现的
2、功能简介:

批量管理服务
批量部署服务
批量分发数据
批量采集数据信息

3、ansible软件并行批量管理

二、软件特点

优点

1、被管理端不需要启动服务程序
2、被管理端不需要编写配置文件
3、功能强大

缺点:

模块太多了

三、ansible程序功能组成

1、主机清单
2、模块功能
3、剧本编写

四、ansible使用前准备

1、基于ssh秘钥方式,将主机秘钥分发至个被管理主机,确保管理主机能直接登录(不用输入密码)
2、确认epel源更新完毕
3、安装ansible (yum install ansible -y)

==============================================================

五、ansible 主机清单配置5种方式的(/etc/ansible/hosts)

1、简单配置

172.16.1.7
172.16.1.31
172.16.1.41

2、分组配置

[web]
172.16.1.31
172.16.1.41
[nfs]
172.16.1.7
172.16.1.6

3、符号匹配主机信息

172.16.1.1 172.16.1.2 .. 172.16.1.200
[data]
172.16.1.[30:45]

4、配置特殊变量信息

特殊变量参照官方文档:https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
[web]
172.16.1.7 ansible_user=root ansible_password=123456 ansible_port=22
[web]
web01 ansible_host=172.16.1.7 ansible_user=root ansible_password=123456 ansible_port=22

5、嵌入式胚子

5.1嵌入子组

[rsync:children]
rsync_server
rsync_client

[rsync_server]
172.16.1.41
[rsync_client]
172.16.1.7
172.16.1.31

5.2嵌入变量(剧本)

第二种嵌入式:嵌入变量 (剧本)
[rsync_client]
172.16.1.7
172.16.1.31
[rsync_client:vars]
ansible_user=root
ansible_password=123456

六、管理多台主机语法格式:

ansible 主机信息(可以是组) -m 模块名称 -a "完成动作"
举例:

[root@web01 ~]# ansible server -m command -a "hostname"
172.16.1.41 | CHANGED | rc=0 >>
backup-41

172.16.1.31 | CHANGED | rc=0 >>
nfs01-31

[root@web01 ~]# 

七、常用模块介绍

在ansible中 使用ansible-doc <模块名称> 来查看单独模块用法

1、command模块--可批量管理主机执行命令(默认模块)

常用参数
官方模块说明:https://docs.ansible.com/ansible/latest/modules/command_module.html#command-module

参数:chdir--在执行命令操作前进行切换目录

[root@web01 ~]# ansible server -m command -a "chdir=/tmp pwd"

参数:creates--判断一个文件是否存在,如果存在后面的命令就不会执行

[root@web01 ~]# ansible server -m command -a "creates=/tmp/hosts touch /tmp/hosts "

参数:removes--判断一个文件是否存在,如果不存在,后续的命令不会被执行

[root@web01 ~]# ansible server -m command -a "removes=/tmp/test touch /tmp/test"

2、shell模块--可以批量管理主机执行命令(万能模块)

官方模块说明:https://docs.ansible.com/ansible/latest/modules/shell_module.html#shell-module
参数chdir:在执行命令前进行目录切换

[root@web01 ~]# ansible server -m shell -a "chdir=/tmp ls"
172.16.1.41 | CHANGED | rc=0 >>
ansible_command_payload_yJt3M6
hosts
ls

172.16.1.31 | CHANGED | rc=0 >>
ansible_command_payload_G06CEK
hosts
ls

参数:creates----判断一个文件是否存在,如果存在,后续命令不会执行

[root@web01 ~]# ansible server -m shell -a "creates=/tmp/test touch /tmp/test"
 [WARNING]: Consider using the file module with state=touch rather than running 'touch'.  If you need to use command because file is
insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this
message.

172.16.1.31 | CHANGED | rc=0 >>


172.16.1.41 | CHANGED | rc=0 >>

参数:removes--判断一个文件是否存在,如果不存在则候命的命令不会执行

[root@web01 ~]# ansible server -m shell -a  "removes=/tmp/test chdir=/tmp ls"
172.16.1.41 | CHANGED | rc=0 >>
ansible_command_payload_RhVulC
hosts
ls
test

172.16.1.31 | CHANGED | rc=0 >>
ansible_command_payload_WVfVC2
hosts
ls
test

3、script模块--批量执行脚本信息

官网模块说明:https://docs.ansible.com/ansible/latest/modules/script_module.html#script-module
使用这个模块需要注意的

1、保证本地(需要执行脚本的设备端)有脚本文件
2、脚本有执行权限

[root@web01 ~]# ansible server -m script -a "/web_data/install.sh" 

4、yum模块--批量部署软件程序

官方模块说明:https://docs.ansible.com/ansible/latest/modules/yum_module.html#yum-module
参数:name--指定安装软件的名称
参数:state--指定软件安装或卸载
在这个模块中卸载使用 removed 安装使用installed;注意看示例

[root@web01 ~]# ansible server -m yum -a "name=ansible state=installed"

5、service模块--批量管理服务的运行状态

官网模块说明:https://docs.ansible.com/ansible/latest/modules/service_module.html#service-module

参数

name:指定服务名称
enabled:设置服务是否开机自动运行 yes:开启开机自动运行 no:关闭开机自动运行
state:指定服务的运行状态(有以下几个状态)

restarted 重启
reloaded 重读配置文件(部分服务可用)
stopped 关闭服务
started 开启服务

[root@web01 ~]# ansible server -m service -a "name=sshd state=started"

6、copy模块--将管理端的主机数据文件,分发给被管理端;将管理端目录中的数据移动到其他目录

官网模块说明:https://docs.ansible.com/ansible/latest/modules/copy_module.html#copy-module
参数:src--指定管理端源数据
参数:dest--分发到远程主机的目标路径下
参数:owner--专属文件之后修改文件属主
参数:group--传输文件之后修改文件属组
参数:mode--修改文件的读、写、执行权限

[root@web01 ~]# ansible server -m copy -a "src=/tmp/rsyncd.conf dest=/tmp owner=rsync group=rsync mode=666"

参数:backup--在分发传输文件之前,将源文件进行备份,按照时间信息进行备份
参数remote_src--no表示从管理端找寻数据进行分发;yes 默认从被管理端找寻数据进行分发
参数content--分发文件时在文件中穿件简单信息

[root@web01 /tmp]# ansible server -m copy -a "content='xianjian'  dest=/tmp/xianjian  remote_src=no  mode=666"

注意:在copy模块中不能同时使用content 参数和src参数,否则会出现互斥,报错如下

[root@web01 /tmp]# ansible server -m copy -a "content='xianjian'   src=/tmp/xinjian dest=/tmp/xianjian  remote_src=no  mode=666"
172.16.1.41 | FAILED! => {
    "changed": false, 
    "msg": "src and content are mutually exclusive"
}
172.16.1.31 | FAILED! => {
    "changed": false, 
    "msg": "src and content are mutually exclusive"
}

7、fetch模块--将远程主机数据进行拉取

官网模块说明:https://docs.ansible.com/ansible/latest/modules/fetch_module.html#fetch-module
参数:src--要拉取的远程数据
参数:dest--要保存本地的文件路径

[root@web01 /tmp]# ansible 172.16.1.41 -m fetch -a "src=/tmp/xinjian dest=/tmp/"
172.16.1.41 | CHANGED => {
    "changed": true, 
    "checksum": "d5c2fe81c8a4fc3f532ab2617e6623dc46ce85a8", 
    "dest": "/tmp/172.16.1.41/tmp/xinjian", 
    "md5sum": "295b4c158e20855fb1fc47ec8f60600f", 
    "remote_checksum": "d5c2fe81c8a4fc3f532ab2617e6623dc46ce85a8", 
    "remote_md5sum": null
}

使用这个模块时注意src=/tmp/xinjian 不得加/;否则会出现如下报错

[root@web01 /tmp]# ansible 172.16.1.41 -m fetch -a "src=/tmp/xinjian/ dest=/tmp/"
172.16.1.41 | FAILED! => {
    "changed": false, 
    "file": "/tmp/xinjian/", 
    "msg": "unable to calculate the checksum of the remote file"
}


8、file模块--修改文件属性信息用于创建数据信息(文件、目录、连接文件、删除数据)

官方说明:https://docs.ansible.com/ansible/latest/modules/file_module.html#file-module
path:指定路径信息
owner:传输文件之后修改文件属主权限
group:传输文件后修改属组权限
mode:直接修改文件读、写、执行权限
state:touch(创建文件)、directory(创建目录)、hard(创建硬链接文件) link(创建软链接文件)、absent(删除数据)

创建件目录:

[root@web01 /]# ansible 172.16.1.31 -m file -a "path=/mnt/test/  state=directory"
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "gid": 65534, 
    "group": "nfsnobody", 
    "mode": "0755", 
    "owner": "nfsnobody", 
    "path": "/mnt/test/", 
    "secontext": "system_u:object_r:nfs_t:s0", 
    "size": 6, 
    "state": "directory", 
    "uid": 65534
}
[root@web01 /]# 

创建文件:

[root@web01 /]# ansible 172.16.1.31 -m file -a "path=/mnt/test/test state=touch"
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "dest": "/mnt/test/test", 
    "gid": 65534, 
    "group": "nfsnobody", 
    "mode": "0644", 
    "owner": "nfsnobody", 
    "secontext": "system_u:object_r:nfs_t:s0", 
    "size": 0, 
    "state": "file", 
    "uid": 65534
}
[root@web01 /]# 

删除数据信息:

[root@web01 /]# ansible 172.16.1.31 -m file -a "path=/tmp/test  state=absent"
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "path": "/tmp/test", 
    "state": "absent"
}

9、mount模块--挂载模块

官方说明:https://docs.ansible.com/ansible/latest/modules/mount_module.html#mount-module
参数:src--指定要挂载数据
参数:path--指定挂载点
**参数:fstype--指定挂载后,文件系统类型 如:ext3、ext4、xfs、nfs **
参数:state--指定动作 如:mounted(挂载)、present(永久挂载)、umounted(临时卸载) absent(永久卸载)

动作 功能 特点
mounted 挂载 1、会立即进行挂载操作2、可实现永久挂载
present 挂载 只能永久挂载不会临时挂载
unmounted 卸载 只能进行临时卸载
absent 卸载 1. 进行临时卸载 2. 进行永久卸载 3. 挂载点目录会被删除

挂载:

[root@web01 /]# ansible server -m mount -a "src=172.16.1.31:/web_data path=/mnt fstype=nfs state=mounted"
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "dump": "0", 
    "fstab": "/etc/fstab", 
    "fstype": "nfs", 
    "name": "/mnt", 
    "opts": "defaults", 
    "passno": "0", 
    "src": "172.16.1.31:/web_data"
}
172.16.1.41 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "dump": "0", 
    "fstab": "/etc/fstab", 
    "fstype": "nfs", 
    "name": "/mnt", 
    "opts": "defaults", 
    "passno": "0", 
    "src": "172.16.1.31:/web_data"
}

10、 cron模块--定时任务模块

官方说明:https://docs.ansible.com/ansible/latest/modules/cron_module.html#cron-module
name: 定义定时任务注释信息
参数:minute --表示分钟信息
参数:hour --表示小时信息
参数:day --表示日期信息
参数:month --表示月份信息
参数:weekday --表示星期信息
参数:job --表示定义任务信息
参数:state --指定动作 如:present(创建定时任务)、absent(删除定时任务)
参数:disabled: 让定时任务临时失效

利用ansible编写时间同步定时任务:每隔5分钟,进行时间同步:

[root@web01 /]# ansible server  -m cron -a "name='date sync' minute=*/5  job='ntpdate ntp1.aliyun.com &>/dev/null'"
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "date sync"
    ]
}
172.16.1.41 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "date sync"
    ]
}

删除定时任务:

[root@web01 /]# ansible 172.16.1.31 -m cron -a "name='date sync' state=absent"
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": []
}

注释定时任务:

[root@web01 /]# ansible 172.16.1.31 -m cron -a "name='date sync' minute=*/5  job='ntpdate ntp1.aliyun.com &>/dev/null'  disabled=yes" 
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "date sync"
    ]
}

11、 group模块--批量创建用户组

官网说明:https://docs.ansible.com/ansible/latest/modules/group_module.html#group-module
参数:name--指点组名
参数:gid--指定gid
参数:state--指定动作 present(创建) absent(删除)

[root@web01 /]# ansible server -m group -a  "name=tese gid=777 state=present"
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "gid": 777, 
    "name": "tese", 
    "state": "present", 
    "system": false
}
172.16.1.41 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "gid": 777, 
    "name": "tese", 
    "state": "present", 
    "system": false
}

12、user模块--批量创建用户模块

官方说明:https://docs.ansible.com/ansible/latest/modules/user_module.html#user-module
参数:name--指定用户名称
参数:uid--指定用户uid信息
参数:group--指定属组
参数:groups--指定属于附加组
参数:password—-指定用户密码信息(必须密文的信息)
参数:shell—-指定用户shell信息 /sbin/nologin
参数:create_home--no表示不创建家目录

创建用户:

[root@web01 /]# ansible server -m user -a "name=girl uid=888 group=tese  shell=/sbin/nologin create_home=no"
172.16.1.41 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "comment": "", 
    "create_home": false, 
    "group": 777, 
    "home": "/home/girl", 
    "name": "girl", 
    "shell": "/sbin/nologin", 
    "state": "present", 
    "system": false, 
    "uid": 888
}
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "comment": "", 
    "create_home": false, 
    "group": 777, 
    "home": "/home/girl", 
    "name": "girl", 
    "shell": "/sbin/nologin", 
    "state": "present", 
    "system": false, 
    "uid": 888
}

删除用户:

[root@web01 /]# ansible server -m user -a "name=girl state=absent"
172.16.1.41 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "force": false, 
    "name": "girl", 
    "remove": false, 
    "state": "absent"
}
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "force": false, 
    "name": "girl", 
    "remove": false, 
    "state": "absent"
}
[root@web01 /]# 

ansible创建用户密文密码

**方法一:利用ansible模块功能
ansible all -i localhost, -m debug -a "msg={{ 'mypassword' | password_hash('sha512', 'mysecretsalt') }}"
mypassword: 指定明文密码信息
mysecretsalt:加密计算方式(辅助加密)

[root@web01 ~]# ansible all -i localhost, -m debug -a "msg={{ '123456' | password_hash('sha512', 'mysecretsalt') }}"
localhost | SUCCESS => {
    "msg": "$6$mysecretsalt$ZB9R8AirQYAXhtfhOo2qdJz52FyNI6v3L6Uc3KNRP.arBKIYpcuEyQewT5qBAHoyQFwHkW6Z551Ql.cZ53GeY0"
}

方法二:利用python模块功能
使用这种方法需要安装python-pip
如果安装不上需要更新pip源,更新方法:
更新pip源:

配置方法:在文件
~/.pip/pip.conf
中添加或修改:

[global]
index-url = https://mirrors.aliyun.com/pypi/simple/

[install]
trusted-host=mirrors.aliyun.com

==============================================================

安装好 :yum install python-pip 后
执行 pip install passlib
然后执行(什么也不用改,直接执行即可) :
python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"

[root@m01 ~]# pip install passlib
Collecting passlib
  Downloading https://files.pythonhosted.org/packages/ee/a7/d6d238d927df355d4e4e000670342ca4705a72f0bf694027cf67d9bcf5af/passlib-1.7.1-py2.py3-none-any.whl (498kB)
    100% |████████████████████████████████| 501kB 13kB/s 
Installing collected packages: passlib
Successfully installed passlib-1.7.1
You are using pip version 8.1.2, however version 19.1.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
[root@m01 ~]# python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
Password: 
$6$pYHuK3LNv3OwCytH$MnGUAzTXLH9TdU/Xz.9u9FY2QaZfEtH5l.kEE9hID9sZPrug6fm0M3BWMVjUk81uemTHkZhtg7i982M.05x8T1
[root@m01 ~]# ansible nfs01 -m user -a 'name=test password="$6$pYHuK3LNv3OwCytH$MnGUAzTXLH9TdU/Xz.9u9FY2QaZfEtH5l.kEE9hID9sZPrug6fm0M3BWMVjUk81uemTHkZhtg7i982M.05x8T1"'
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "comment": "", 
    "create_home": true, 
    "group": 1001, 
    "home": "/home/test", 
    "name": "test", 
    "password": "NOT_LOGGING_PASSWORD", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": false, 
    "uid": 1000
}
[root@m01 ~]# ansible nfs01 -m command -a "id test"
172.16.1.31 | CHANGED | rc=0 >>
uid=1000(test) gid=1001(test) groups=1001(test)
[root@m01 ~]# 

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

推荐阅读更多精彩内容

  • 1)安装2)常用模块3)inventory4)playbook(role\tag\template)5) yaml...
    秦记阅读 4,142评论 2 5
  • 本文作者: wuXing QQ: 1226032602 E-mail: 1226032602@qq.com ht...
    五行哥阅读 2,394评论 0 0
  • 1.ssh-keygen非交互式创建秘钥对: 具体命令:ssh-keygen -f ~/.ssh/id_rsa -...
    一关_e438阅读 381评论 0 0
  • 1.ssh-keygen非交互式创建秘钥对: 具体命令:ssh-keygen -f ~/.ssh/id_rsa ...
    1220阅读 981评论 0 0
  • 盛夏隆隆 像她充满欲望的眸 灼烧我每一寸、每一寸的肌肤 妆发凌乱 喉咙发干 汗水直流 只想 脱掉所有骄傲 在卷曲的...
    她的J阅读 326评论 1 4