文章目录

  • 配置文件概述
  • 管理配置文件中的设置
    • 基本操作配置
    • 配置说明
    • 连接设置
    • 升级特权
  • 例子:使管理主机可以通过密钥登录受管主机
    • 环境介绍
    • 配置要求
    • 过程
      • 在管理主机上创建普通用户
      • 为用户启用完整的sudo访问权限
      • 使用普通用户生成SSH密钥对
      • 配置管理主机hosts文件
      • 自定义ansible目录,并创建配置文件和主机清单
        • 配置并修改ansible.cfg
        • 创建inventory主机清单
        • 创建playbook
        • 执行playbook
        • 测试
        • 最后配置ansible.cfg,实现普通用户免密登录系统后免密切换超级用户
        • 最终测试

配置文件概述

可以通过修改ansible.cfg配置文件的设置定义Ansible安装的行为。

  • 默认全局配置文件为/etc/ansible/ansible.cfg
  • 如果自行创建ansible.cfg文件取代/etc/ansible/ansible.cfg,需要将/etc/ansible/ansible.cfg所有设置复制到创建的文件中,文件中未定义的设置将保持内置默认值,即使在全局配置文件/etc/ansible/ansible.cfg设为某个其他值也是如此。

ansible获取ansible.cfg文件的优先级顺序

  1. ansible运行时会先检查ansible命令的目录中是否有ansible.cfg文件,如果不存在该文件,则检查用户的主目录(~/.)中是否有ansible.cfg文件,在找不到其他配置文件时,使用全局/etc/ansible/ansible.cfg文件,如果都不存在,ansible包含它使用的默认值。

  2. 使用ANSIBLE_CONFIG环境变量指定配置文件位置,而此时指定的任何文件将覆盖所有其他配置文件。

管理配置文件中的设置

  • 配置文件中标题使用方括号[ ]括起
  • 标题中部分都以键值对定义

基本操作配置

  • [default]
  • [privilege_escalation]

例子:

[default]
inventory = ./inventory
remote_user = user
ask_pass = false[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false

配置说明

值(描述)
inventory 指定清单文件(inventory)的路径
remote_user 要在受管主机上登录的用户的名称。如果未指定,则使用当前用户的名称。
ask_pass 是否提示输入SSH密码。如果使用SSH公钥身份验证,则可以时false。
become 连接后是否自动在受管主机上切换用户(通常切换为root)。也可以通过play来指定。
become_method 如何切换用户(通常为sudo,这也是默认设置,但也可选su)。
become_user 要在受管主机上切换到的用户(通常时root,这也是默认值)。
become_ask_pass 是否需要为become_method提示输入密码。默认为false。

Ansible要与受管主机通信,通常更改配置文件是为了控制Ansible要用什么方法和用户来管理受管主机。

  • 主机清单inventory中包含主机组和受管主机,所以要指定清单的位置。

  • 要用哪种连接协议与受管理主机进行通信,默认采用SSH,以及是否需要非标准网络端口来连接服务器。

  • 要在受管主机使用哪一个远程用户,可以是root或者某一个特权用户。

  • 如果为非特权用户,是否尝试将特权升级为root以及如何进行升级。

  • 是否提示输入ssh密码或sudo密码进行登录或获取特权。

连接设置

  • 在[defaults]部分,inventory指定可以直接指向单个或者多个静态清单文件和动态清单文件的某一目录。

  • 默认情况下Ansible连接受管主机使用的用户名与运行Ansible命令的本地用户相同;如果指定不同的远程用户,请设置remote_user的参数为该用户名。

  • Ansible默认采用SSH远程登录,如果为运行ansible的本地用户配置了ssh密钥,且可以在受管主机上进行远程用户身份验证,则ansible将自动登录;否则,可以通过设置ask_pass = true,将ansible配置为:提示本地用户输入由远程用户使用的密码。

升级特权

鉴于安全性和审计原因,可以在Ansible配置文件的[privilege_escalation]部分中设置以非特权用户身份连接远程主机,然后再通过特权升级获得root用户身份的管理权限。

  • 要默认启用特权升级,可以在配置文件中设置指令become = true;当然如果运行临时命令或playbook时,可以通过各种方式覆盖它。

  • become_method指令设置如何升级特权,有多个选项可用,但默认使用sudo。

  • become_user指令设置要升级到的用户,默认为root。

  • 如果所选的become_method机制要求用户输入密码才能升级特权,可以在配置文件中设置become_ask_pass = true指令。

例子:使管理主机可以通过密钥登录受管主机

环境介绍

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nudiyNFJ-1637849631633)(C:\Users\17611\AppData\Roaming\Typora\typora-user-images\image-20211115214927198.png)]

  1. 各主机间处于同一个网络环境,主机之前可以互相通信,且可以使用root用户远程连接。
  2. 每个主机只有一个用户存在,为root超级用户。

配置要求

  1. 在控制节点创建普通用户,并生成SSH密钥对。
  2. 创建并修改ansible.cfg配置文件,配置超级用户通过输入密码登录受管主机,进行用户创建。
  3. 创建并配置playbook,创建普通用户,并复制公钥到受管主机,实现普通用户通过SSH密钥登录受管主机。
  4. 实现受管主机中普通用户免密切换root超级用户,以获取最高权限。
  5. 配置ansible.cfg,使用普通用户以密钥登录受管主机,然后免密切换到root用户。

过程

在管理主机上创建普通用户
[root@controller ~]# useradd sunyinpeng
[root@controller ~]# passwd sunyinpeng
Changing password for user sunyinpeng.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
为用户启用完整的sudo访问权限
# 在/etc/sudoers.d/目录中创建用户文件,并加入以下内容
[root@controller ~]# cd /etc/sudoers.d/
[root@controller sudoers.d]# touch user
[root@controller sudoers.d]# vim user
sunyinpeng      ALL=(ALL)       NOPASSWD:ALL# 测试
[sunyinpeng@controller ~]$ sudo su - root
[root@controller ~]#
使用普通用户生成SSH密钥对
[sunyinpeng@controller ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/sunyinpeng/.ssh/id_rsa):
Created directory '/home/sunyinpeng/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/sunyinpeng/.ssh/id_rsa.
Your public key has been saved in /home/sunyinpeng/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:KHPrUtve9VZwKplgUfYwWHeCBMTwhhTZEZIqlcHG1vA sunyinpeng@controller
The key's randomart image is:
+---[RSA 3072]----+
|     oo==O=OB.o .|
|      Bo++=..= o |
|     + .E o.  .  |
|    . .. .o   . .|
|    o.o S. . o + |
|     +..    + . .|
|     ..o    .. . |
|    ... .. . ..  |
|     .... .  ..  |
+----[SHA256]-----+
-----------------------------------------------------------------------------------------
# 查找公钥地址,并记住位置
# 注意上面显示的public即为公钥地址的位置,进入目录确认
[sunyinpeng@controller ~]$ cd /home/sunyinpeng/.ssh/
[sunyinpeng@controller .ssh]$ ls
id_rsa  id_rsa.pub
配置管理主机hosts文件
[sunyinpeng@controller demo]$ sudo vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.101   servera
192.168.1.102   serverb
192.168.1.103   serverc
192.168.1.104   serverd
192.168.1.105   servere
自定义ansible目录,并创建配置文件和主机清单

在编写ansible playbook时,由于环境复杂,项目繁多,也就导致使用的功能和配置量大,难以管理;这个时候可以使用自定义目录,并在该目录配置ansible.cfg文件,执行ansible playbook任务,以便于管理。

配置并修改ansible.cfg
[sunyinpeng@controller ~]$ sudo mkdir -p /etc/opt/ansible/demo
[sunyinpeng@controller ~]$ sudo cp /etc/ansible/ansible.cfg /etc/opt/ansible/demo/
[sunyinpeng@controller demo]$ ls
ansible.cfg
[sunyinpeng@controller demo]$ sudo vim ansible.cfg
[defaults]
inventory   = ./inventory
remote_user = root
ask_pass = true[privilege_escalation]
become = false
创建inventory主机清单
[sunyinpeng@controller demo]$ sudo vim inventory
[client]
servera
serverb
serverc
serverd
servere
创建playbook
[sunyinpeng@controller demo]$ sudo vim create_user.yml
---
- name: create usershosts: clienttasks:- name: create useruser:name: "{{ item.user }}"shell: /bin/bashpassword: "{{ 'item.pass' | password_hash('sha512')}}"loop:- { user: sunyinpeng, pass: 123}- name: Public keyauthorized_key:user: sunyinpengstate: presentkey: '{{ item }}'with_file:- /home/sunyinpeng/.ssh/id_rsa.pub- name: configure user-free authorizationcopy:content: "sunyinpeng  ALL=(ALL)   NOPASSWD:ALL"dest: /etc/sudoers.d/user
执行playbook
[sunyinpeng@controller demo]$ ls
ansible.cfg  create_user.yml  inventory
[sunyinpeng@controller demo]$ sudo ansible-playbook create_user.yml
SSH password:PLAY [create users] ****************************************************************************************************TASK [Gathering Facts] *************************************************************************************************
ok: [serverd]
ok: [serverb]
ok: [servere]
ok: [serverc]
ok: [servera]TASK [create user] *****************************************************************************************************
changed: [servera] => (item={'user': 'sunyinpeng', 'pass': 123})
changed: [serverd] => (item={'user': 'sunyinpeng', 'pass': 123})
changed: [servere] => (item={'user': 'sunyinpeng', 'pass': 123})
changed: [serverc] => (item={'user': 'sunyinpeng', 'pass': 123})
changed: [serverb] => (item={'user': 'sunyinpeng', 'pass': 123})TASK [Public key] ******************************************************************************************************
changed: [serverd] => (item=ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDl/O95paWA8lyYVy90d39k/iZsqt+G8wT51vSWjqiu5CLRBpe02y+Llo3c8nZzYJP1x8GCK9OUp1QI9VWGYZHLEN8Haw9OWCr0Ava9jyiTITiCylCvCPXu0FADwkLnqogofVehivt5OQDr7lriTLoqSarn/5ZeDGsBq3yo2p1Ki1/clZFKX4FocV5UmbkBm1+RNKUv8bIxqgjUo/u+BGmNGs5FTVy/wt71IZ0MuPvimy4p5nSsum2nh1OwtpXMJ1c2531NM6WILMB3hvTjStq/hzUmeEpKSdvMoBGCDPhBCeYhqCYArj+3nMoBNXkFt4rzHpF7UnUJAJ8W/l/3i0XAMYBUflayUc1KKsEJEhccwams5jb2num6uoTaBJ+sSeMogMEz7EAGQJEclWyDqmkRYM4WZssZD6HcgDpu55y4kV9fAFwzyTlnvegCMBBor+Z61rDj0gqRbiH/Ji9UcJ+Cxqj6lTbnQaypQpQOgAX5XEKpABcs53+nJnbITPJ0BVk= sunyinpeng@controller)
changed: [serverc] => (item=ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDl/O95paWA8lyYVy90d39k/iZsqt+G8wT51vSWjqiu5CLRBpe02y+Llo3c8nZzYJP1x8GCK9OUp1QI9VWGYZHLEN8Haw9OWCr0Ava9jyiTITiCylCvCPXu0FADwkLnqogofVehivt5OQDr7lriTLoqSarn/5ZeDGsBq3yo2p1Ki1/clZFKX4FocV5UmbkBm1+RNKUv8bIxqgjUo/u+BGmNGs5FTVy/wt71IZ0MuPvimy4p5nSsum2nh1OwtpXMJ1c2531NM6WILMB3hvTjStq/hzUmeEpKSdvMoBGCDPhBCeYhqCYArj+3nMoBNXkFt4rzHpF7UnUJAJ8W/l/3i0XAMYBUflayUc1KKsEJEhccwams5jb2num6uoTaBJ+sSeMogMEz7EAGQJEclWyDqmkRYM4WZssZD6HcgDpu55y4kV9fAFwzyTlnvegCMBBor+Z61rDj0gqRbiH/Ji9UcJ+Cxqj6lTbnQaypQpQOgAX5XEKpABcs53+nJnbITPJ0BVk= sunyinpeng@controller)
changed: [servere] => (item=ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDl/O95paWA8lyYVy90d39k/iZsqt+G8wT51vSWjqiu5CLRBpe02y+Llo3c8nZzYJP1x8GCK9OUp1QI9VWGYZHLEN8Haw9OWCr0Ava9jyiTITiCylCvCPXu0FADwkLnqogofVehivt5OQDr7lriTLoqSarn/5ZeDGsBq3yo2p1Ki1/clZFKX4FocV5UmbkBm1+RNKUv8bIxqgjUo/u+BGmNGs5FTVy/wt71IZ0MuPvimy4p5nSsum2nh1OwtpXMJ1c2531NM6WILMB3hvTjStq/hzUmeEpKSdvMoBGCDPhBCeYhqCYArj+3nMoBNXkFt4rzHpF7UnUJAJ8W/l/3i0XAMYBUflayUc1KKsEJEhccwams5jb2num6uoTaBJ+sSeMogMEz7EAGQJEclWyDqmkRYM4WZssZD6HcgDpu55y4kV9fAFwzyTlnvegCMBBor+Z61rDj0gqRbiH/Ji9UcJ+Cxqj6lTbnQaypQpQOgAX5XEKpABcs53+nJnbITPJ0BVk= sunyinpeng@controller)
changed: [serverb] => (item=ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDl/O95paWA8lyYVy90d39k/iZsqt+G8wT51vSWjqiu5CLRBpe02y+Llo3c8nZzYJP1x8GCK9OUp1QI9VWGYZHLEN8Haw9OWCr0Ava9jyiTITiCylCvCPXu0FADwkLnqogofVehivt5OQDr7lriTLoqSarn/5ZeDGsBq3yo2p1Ki1/clZFKX4FocV5UmbkBm1+RNKUv8bIxqgjUo/u+BGmNGs5FTVy/wt71IZ0MuPvimy4p5nSsum2nh1OwtpXMJ1c2531NM6WILMB3hvTjStq/hzUmeEpKSdvMoBGCDPhBCeYhqCYArj+3nMoBNXkFt4rzHpF7UnUJAJ8W/l/3i0XAMYBUflayUc1KKsEJEhccwams5jb2num6uoTaBJ+sSeMogMEz7EAGQJEclWyDqmkRYM4WZssZD6HcgDpu55y4kV9fAFwzyTlnvegCMBBor+Z61rDj0gqRbiH/Ji9UcJ+Cxqj6lTbnQaypQpQOgAX5XEKpABcs53+nJnbITPJ0BVk= sunyinpeng@controller)
changed: [servera] => (item=ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDl/O95paWA8lyYVy90d39k/iZsqt+G8wT51vSWjqiu5CLRBpe02y+Llo3c8nZzYJP1x8GCK9OUp1QI9VWGYZHLEN8Haw9OWCr0Ava9jyiTITiCylCvCPXu0FADwkLnqogofVehivt5OQDr7lriTLoqSarn/5ZeDGsBq3yo2p1Ki1/clZFKX4FocV5UmbkBm1+RNKUv8bIxqgjUo/u+BGmNGs5FTVy/wt71IZ0MuPvimy4p5nSsum2nh1OwtpXMJ1c2531NM6WILMB3hvTjStq/hzUmeEpKSdvMoBGCDPhBCeYhqCYArj+3nMoBNXkFt4rzHpF7UnUJAJ8W/l/3i0XAMYBUflayUc1KKsEJEhccwams5jb2num6uoTaBJ+sSeMogMEz7EAGQJEclWyDqmkRYM4WZssZD6HcgDpu55y4kV9fAFwzyTlnvegCMBBor+Z61rDj0gqRbiH/Ji9UcJ+Cxqj6lTbnQaypQpQOgAX5XEKpABcs53+nJnbITPJ0BVk= sunyinpeng@controller)TASK [configure user-free authorization] *******************************************************************************
changed: [serverd]
changed: [servere]
changed: [servera]
changed: [serverb]
changed: [serverc]PLAY RECAP *************************************************************************************************************
servera                    : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverb                    : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverc                    : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverd                    : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
servere                    : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
测试
# 此时普通用户的公钥已经复制到受管机器中,可以测试免密登录了
[sunyinpeng@controller demo]$ ssh sunyinpeng@servera
Activate the web console with: systemctl enable --now cockpit.socketLast login: Fri Nov 19 05:27:35 2021 from 192.168.1.100
最后配置ansible.cfg,实现普通用户免密登录系统后免密切换超级用户
# 配置ansible.cfg
[sunyinpeng@controller demo]$ sudo vim ansible.cfg
[defaults]
inventory   = ./inventory
remote_user = sunyinpeng
ask_pass = false[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
# 为结果更明显,再编写一个playbook,使用root向受管主机安装apache httpd服务,写入welcome to apache
[sunyinpeng@controller demo]$ sudo vim install_httpd.yml
---
- name: install apachehosts: clienttasks:- name: stop firewalldservice:name: firewalldstate: stoppedenabled: no- name: setenforce 0shell: "setenforce 0"failed_when: false- name: installer apacheyum:name: httpdstate: latest- name: write index.htmlcopy:content: " Welcome to apache!"dest: /var/www/html/index.html- name: restart httpdservice:name: httpdstate: restarted
# 执行该playbook
[sunyinpeng@controller demo]$ ls
ansible.cfg  create_user.yml  install_httpd.yml  inventory
[sunyinpeng@controller demo]$ ansible-playbook install_httpd.ymlPLAY [install apache] **************************************************************************************************TASK [Gathering Facts] *************************************************************************************************
ok: [serverd]
ok: [servere]
ok: [serverb]
ok: [serverc]
ok: [servera]TASK [stop firewalld] **************************************************************************************************
ok: [servere]
ok: [servera]
ok: [serverc]
ok: [serverb]
ok: [serverd]TASK [setenforce 0] ****************************************************************************************************
changed: [serverd]
changed: [servere]
changed: [serverc]
changed: [serverb]
changed: [servera]TASK [installer apache] ************************************************************************************************
changed: [servera]
changed: [serverb]
changed: [servere]
changed: [serverc]
changed: [serverd]TASK [write index.html] ************************************************************************************************
changed: [servera]
changed: [serverb]
changed: [serverc]
changed: [serverd]
changed: [servere]TASK [restart httpd] ***************************************************************************************************
changed: [serverb]
changed: [servere]
changed: [serverc]
changed: [serverd]
changed: [servera]PLAY RECAP *************************************************************************************************************
servera                    : ok=6    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverb                    : ok=6    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverc                    : ok=6    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
serverd                    : ok=6    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
servere                    : ok=6    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
最终测试
[sunyinpeng@controller demo]$ curl http://serveraWelcome to apache!
[sunyinpeng@controller demo]$ curl http://serverbWelcome to apache!
[sunyinpeng@controller demo]$ curl http://servercWelcome to apache!
[sunyinpeng@controller demo]$ curl http://serverdWelcome to apache!
[sunyinpeng@controller demo]$ curl http://servereWelcome to apache!

Ansible之ansible.cfg相关推荐

  1. Ansible配置文件ansible.cfg

    通常每个应用程序都会有相应的配置文件去设置应用程序运行时需要使用的一些参数,如数据存储地址,日志存储地址,客户端连接端口或者集群数据同步端口等等,ansible也不另外,他也有一个配置文件ansibl ...

  2. [Ansible 概述]Ansible 的自动化运维

    一.Ansible 概述加粗样式 Ansible 是目前最受运维欢迎的自动化运维工具,基于Python开发,集合了众多运维工具(SaltStack puppet.chef.func.fabric)的优 ...

  3. Seventh5: YAML syntax Ansible Playbook Ansible variables summaries and QQS | Cloud computing

    云计算专题目录 Catalogue | Cloud computing Seventh5: YAML syntax & Ansible Playbook & Ansible varia ...

  4. [Ansible系列]ansible tag介绍

    目录 简介 task      tag 1.  执行指定tag的task 2.  排除指定tag的task 3.   查看playbook中的所有tag 4.  打tag的方式 4.1   一个tas ...

  5. Ansible、Ansible Tower 下载安装

    Centos 7 环境下Ansible.Ansible Tower 下载 安装 访问 破解 1.安装环境 CentOS Linux release 7.8.2003 (Core) 最小4G内存,20G ...

  6. Ansible配置文件ansible.cfg详解

    Ansible是一个系列文章,我会尽量以通俗易懂.诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些. 前言 此时外面小雨淅淅沥沥的下着,周末,慵懒的周末,无聊到极点才打开电脑,回头一看 ...

  7. [ansible系列③]Ansible Inventory配置及详解

    简介 Inventory是ansible管理主机信息的配置文件,相当于我们系统的hosts文化的功能,默认存放在/etc/ansible/hosts.为了批量管理主机,便捷使用其中的主机分组,ansi ...

  8. [Ansible系列②]Ansible使用说明

    一.    简介 我们在安装主控端安装好ansible之后需要对被控端下发指令进行操作,前面说过现在的ansible的版本是通过ssh连接操作被控端的,在ssh的使用过程中我们是需要交互输入用户和密码 ...

  9. 【Ansible】 Ansible 模块 setup 与 stat 模块用法

    setup模块 1 通过setup模块获取主机信息 # 执行命令 ansible webserver -m setup # 返回信息192.168.138.137 | SUCCESS => {& ...

最新文章

  1. SQL DEVELOPER 打不开了
  2. Spring Cloud Alibaba 之 服务通信 REST消息通信:如何使用 OpenFeign 简化服务间通信
  3. 2020-10-13 多智能体基本图论
  4. VTK:相互作用之ShiftAndControl
  5. java print int_java – 在printin输入int
  6. 关于 Orbeon form PE 版本使用 JavaScript Embedding API 的一个例子
  7. numpy 和tensorflow 中的乘法
  8. 自定义封装 banner 组件
  9. jQuery中绑定事件的命名空间详解
  10. Eclipse查看java源代码
  11. ASP.NET AJAX学习笔记之:CollapsiblePanel---可折叠的面板
  12. 2019,谢谢曾经努力的自己| 个人年度总结
  13. Node-Red UI界面基础设计
  14. 程序员如何快速上手一个自己不太熟悉的新项目
  15. Android:自动点击屏幕
  16. COERCE_DOUBLE的含义
  17. STM8系列单片机程序的下载方式
  18. Go 并发 | 数据竞争及竞争条件
  19. LVS的Tun模式(隧道模式)的实现
  20. Bochs编程环境安装

热门文章

  1. esc键 qt 退出菜单_【Qt】QDialog之屏蔽Esc键【转】
  2. 德巴赫猜想python_哥德巴赫猜想问题基于Python的验证方法研究
  3. 燕山大学计算机历年拟录取分数线,燕山大学录取分数线2021是多少分(附历年录取分数线)...
  4. 查看家庭组组计算机用户名密码,win7系统查看家庭组密码的办法介绍
  5. python版FlappyBird代码解析
  6. linux权限管理详解
  7. Ubuntu桌面消失后重装你桌面系统教程
  8. Python学习基础方便查询
  9. HR面/综合面系列:职业相关
  10. WEB前端期末大作业——关于酒店主题网站设计——高级酒店公寓网页(4页)