分类 系统运维 下的文章

Quagga是一个开源路由软件套件,可以将Linux变成支持如RIP、OSPF、BGP和IS-IS等主要路由协议的路由器。它具有对IPv4和IPv6的完整支持,并支持路由/前缀过滤。Quagga可以是你生命中的救星,以防你的生产路由器一旦宕机,而你没有备用的设备而只能等待更换。通过适当的配置,Quagga甚至可以作为生产路由器。

本教程中,我们将连接假设之间具有专线连接的两个分支机构网络(例如,192.168.1.0/24和172.17.1.0/24)。

我们的CentOS位于所述专用链路的两端。两台主机名分别设置为“site-A-RTR”和“site-B-RTR'。下面是IP地址的详细信息。

  • Site-A: 192.168.1.0/24
  • Site-B: 172.16.1.0/24
  • 两个 Linux 路由器之间的对等网络: 10.10.10.0/30

Quagga包括了几个协同工作的守护进程。在本教程中,我们将重点建立以下守护进程。

  1. Zebra: 核心守护进程,负责内核接口和静态路由。
  2. Ospfd: IPv4 OSPF 守护进程。

在CentOS上安装Quagga

我们使用yum安装Quagga。

# yum install quagga 

在CentOS7,SELinux默认会阻止quagga将配置文件写到/usr/sbin/zebra。这个SELinux策略会干扰我们接下来要介绍的安装过程,所以我们要禁用此策略。对于这一点,无论是关闭SELinux(这里不推荐),还是如下启用“zebrawriteconfig”都可以。如果你使用的是CentOS 6的请跳过此步骤。

# setsebool -P zebra_write_config 1 

如果没有做这个修改,在我们尝试在Quagga命令行中保存配置的时候看到如下错误。

Can't open configuration file /etc/quagga/zebra.conf.OS1Uu5.

安装完Quagga后,我们要配置必要的对等IP地址,并更新OSPF设置。Quagga自带了一个命令行称为vtysh。vtysh里面用到的Quagga命令与主要的路由器厂商如思科和Juniper是相似的。

步骤 1: 配置 Zebra

我们首先创建Zebra配置文件,并启用Zebra守护进程。

# cp /usr/share/doc/quagga-XXXXX/zebra.conf.sample /etc/quagga/zebra.conf
# service zebra start
# chkconfig zebra on 

启动vtysh命令行:

# vtysh 

首先,我们为Zebra配置日志文件。输入下面的命令进入vtysh的全局配置模式:

site-A-RTR# configure terminal

指定日志文件位置,接着退出模式:

site-A-RTR(config)# log file /var/log/quagga/quagga.log
site-A-RTR(config)# exit

永久保存配置:

site-A-RTR# write

接下来,我们要确定可用的接口并按需配置它们的IP地址。

site-A-RTR# show interface 

Interface eth0 is up, line protocol detection is disabled
. . . . .
Interface eth1 is up, line protocol detection is disabled
. . . . .

配置eth0参数:

site-A-RTR# configure terminal
site-A-RTR(config)# interface eth0
site-A-RTR(config-if)# ip address 10.10.10.1/30
site-A-RTR(config-if)# description to-site-B
site-A-RTR(config-if)# no shutdown 

继续配置eth1参数:

site-A-RTR(config)# interface eth1
site-A-RTR(config-if)# ip address 192.168.1.1/24
site-A-RTR(config-if)# description to-site-A-LAN
site-A-RTR(config-if)# no shutdown 

现在验证配置:

site-A-RTR(config-if)# do show interface 

Interface eth0 is up, line protocol detection is disabled
. . . . .
  inet 10.10.10.1/30 broadcast 10.10.10.3
. . . . .
Interface eth1 is up, line protocol detection is disabled
. . . . .
  inet 192.168.1.1/24 broadcast 192.168.1.255
. . . . .

site-A-RTR(config-if)# do show interface description 

Interface      Status  Protocol  Description
eth0           up      unknown   to-site-B
eth1           up      unknown   to-site-A-LAN

永久保存配置:

site-A-RTR(config-if)# do write

在site-B上重复上面配置IP地址的步骤。

如果一切顺利,你应该可以在site-A的服务器上ping通site-B上的对等IP地址10.10.10.2了。

注意:一旦Zebra的守护进程启动了,在vtysh命令行中的任何改变都会立即生效。因此没有必要在更改配置后重启Zebra守护进程。

步骤 2: 配置OSPF

我们首先创建OSPF配置文件,并启动OSPF守护进程:

# cp /usr/share/doc/quagga-XXXXX/ospfd.conf.sample /etc/quagga/ospfd.conf
# service ospfd start
# chkconfig ospfd on 

现在启动vtysh命令行来继续OSPF配置:

# vtysh

输入路由配置模式:

site-A-RTR# configure terminal
site-A-RTR(config)# router ospf

可选配置路由id:

site-A-RTR(config-router)# router-id 10.10.10.1

添加在OSPF中的网络:

site-A-RTR(config-router)# network 10.10.10.0/30 area 0
site-A-RTR(config-router)# network 192.168.1.0/24 area 0

永久保存配置:

site-A-RTR(config-router)# do write

在site-B上重复和上面相似的OSPF配置:

site-B-RTR(config-router)# network 10.10.10.0/30 area 0
site-B-RTR(config-router)# network 172.16.1.0/24 area 0
site-B-RTR(config-router)# do write 

OSPF的邻居现在应该启动了。只要ospfd在运行,通过vtysh的任何OSPF相关配置的改变都会立即生效而不必重启ospfd。

下一节,我们会验证我们的Quagga设置。

验证

1. 通过ping测试

首先你应该可以从site-A ping同site-B的LAN子网。确保你的防火墙没有阻止ping的流量。

[root@site-A-RTR ~]# ping 172.16.1.1 -c 2 

2. 检查路由表

必要的路由应该同时出现在内核与Quagga理由表中。

[root@site-A-RTR ~]# ip route 

10.10.10.0/30 dev eth0  proto kernel  scope link  src 10.10.10.1
172.16.1.0/30 via 10.10.10.2 dev eth0  proto zebra  metric 20
192.168.1.0/24 dev eth1  proto kernel  scope link  src 192.168.1.1

[root@site-A-RTR ~]# vtysh
site-A-RTR# show ip route 

Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
       I - ISIS, B - BGP, > - selected route, * - FIB route

O   10.10.10.0/30 [110/10] is directly connected, eth0, 00:14:29
C>* 10.10.10.0/30 is directly connected, eth0
C>* 127.0.0.0/8 is directly connected, lo
O>* 172.16.1.0/30 [110/20] via 10.10.10.2, eth0, 00:14:14
C>* 192.168.1.0/24 is directly connected, eth1

3. 验证OSPF邻居和路由

在vtysh命令行中,你可以检查必要的邻居是否在线与是否已经学习了合适的路由。

[root@site-A-RTR ~]# vtysh
site-A-RTR# show ip ospf neighbor 

本教程中,我们将重点放在使用Quagga配置基本的OSPF。在一般情况下,Quagga能让我们能够轻松在一台普通的Linux机器上配置动态路由协议,如OSPF、RIP或BGP。启用了Quagga的机器可以与你网络中的其他路由器进行通信和交换路由信息。由于它支持主要的开放标准的路由协议,它或许是许多情况下的首选。更重要的是,Quagga的命令行界面与主要路由器厂商如思科和Juniper几乎是相同的,这使得部署和维护Quagga机器变得非常容易。

希望这些对你们有帮助。


via: http://xmodulo.com/turn-centos-box-into-ospf-router-quagga.html

作者:Sarmed Rahman 译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

今天我来谈谈 ansible,一个由 Python 编写的强大的配置管理解决方案。尽管市面上已经有很多可供选择的配置管理解决方案,但他们各有优劣,而 ansible 的特点就在于它的简洁。让 ansible 在主流的配置管理系统中与众不同的一点便是,它并不需要你在想要配置的每个节点上安装自己的组件。同时提供的一个优点在于,如果需要的话,你可以在不止一个地方控制你的整个基础架构。最后一点是它的正确性,或许这里有些争议,但是我认为在大多数时候这仍然可以作为它的一个优点。说得足够多了,让我们来着手在 RHEL/CentOS 和基于 Debian/Ubuntu 的系统中安装和配置 Ansible。

准备工作

  1. 发行版:RHEL/CentOS/Debian/Ubuntu Linux
  2. Jinja2:Python 的一个对设计师友好的现代模板语言
  3. PyYAML:Python 的一个 YAML 编码/反编码函数库
  4. paramiko:纯 Python 编写的 SSHv2 协议函数库 (译者注:原文对函数库名有拼写错误)
  5. httplib2:一个功能全面的 HTTP 客户端函数库
  6. 本文中列出的绝大部分操作已经假设你将在 bash 或者其他任何现代的 shell 中以 root 用户执行。

Ansible 如何工作

Ansible 工具并不使用守护进程,它也不需要任何额外的自定义安全架构,因此它的部署可以说是十分容易。你需要的全部东西便是 SSH 客户端和服务器了。

 +-----------------+                    +---------------+
 |安装了 Ansible 的|       SSH          | 文件服务器1   |
 |Linux/Unix 工作站|<------------------>| 数据库服务器2 | 在本地或远程
 +-----------------+       模块         | 代理服务器3   | 数据中心的
    192.168.1.100                       +---------------+ Unix/Linux 服务器

其中:

  1. 192.168.1.100 - 在你本地的工作站或服务器上安装 Ansible。
  2. 文件服务器1到代理服务器3 - 使用 192.168.1.100 和 Ansible 来自动管理所有的服务器。
  3. SSH - 在 192.168.1.100 和本地/远程的服务器之间设置 SSH 密钥。

Ansible 安装教程

ansible 的安装轻而易举,许多发行版的第三方软件仓库中都有现成的软件包,可以直接安装。其他简单的安装方法包括使用 pip 安装它,或者从 github 里获取最新的版本。若想使用你的软件包管理器安装,在基于 RHEL/CentOS Linux 的系统里你很可能需要 EPEL 仓库

在基于 RHEL/CentOS Linux 的系统中安装 ansible

输入如下 yum 命令:

$ sudo yum install ansible

在基于 Debian/Ubuntu Linux 的系统中安装 ansible

输入如下 apt-get 命令:

$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible

使用 pip 安装 ansible

pip 命令是一个安装和管理 Python 软件包的工具,比如它能管理 Python Package Index 中的那些软件包。如下方式在 Linux 和类 Unix 系统中通用:

$ sudo pip install ansible

从源代码安装最新版本的 ansible

你可以通过如下命令从 github 中安装最新版本:

$ cd ~
$ git clone git://github.com/ansible/ansible.git
$ cd ./ansible
$ source ./hacking/env-setup

当你从一个 git checkout 中运行 ansible 的时候,请记住你每次用它之前都需要设置你的环境,或者你可以把这个设置过程加入你的 bash rc 文件中:

# 加入 BASH RC
$ echo "export ANSIBLE_HOSTS=~/ansible_hosts" >> ~/.bashrc
$ echo "source ~/ansible/hacking/env-setup" >> ~/.bashrc

ansible 的 hosts 文件包括了一系列它能操作的主机。默认情况下 ansible 通过路径 /etc/ansible/hosts 查找 hosts 文件,不过这个行为也是可以更改的,这样当你想操作不止一个 ansible 或者针对不同的数据中心的不同客户操作的时候也是很方便的。你可以通过命令行参数 -i 指定 hosts 文件:

$ ansible all -m shell -a "hostname" --ask-pass -i /etc/some/other/dir/ansible_hosts

不过我更倾向于使用一个环境变量,这可以在你想要通过 source 一个不同的文件来切换工作目标的时候起到作用。这里的环境变量是 $ANSIBLE\_HOSTS,可以这样设置:

$ export ANSIBLE_HOSTS=~/ansible_hosts

一旦所有需要的组件都已经安装完毕,而且你也准备好了你的 hosts 文件,你就可以来试一试它了。为了快速测试,这里我把 127.0.0.1 写到了 ansible 的 hosts 文件里:

$ echo "127.0.0.1" > ~/ansible_hosts

现在来测试一个简单的 ping:

$ ansible all -m ping

或者提示 ssh 密码:

$ ansible all -m ping --ask-pass

我在刚开始的设置中遇到过几次问题,因此这里强烈推荐为 ansible 设置 SSH 公钥认证。不过在刚刚的测试中我们使用了 --ask-pass,在一些机器上你会需要安装 sshpass 或者像这样指定 -c paramiko:

$ ansible all -m ping --ask-pass -c paramiko

当然你也可以安装 sshpass,然而 sshpass 并不总是在标准的仓库中提供,因此 paramiko 可能更为简单。

设置 SSH 公钥认证

于是我们有了一份配置,以及一些基础的其他东西。现在让我们来做一些实用的事情。ansible 的强大很大程度上体现在 playbooks 上,后者基本上就是一些写好的 ansible 脚本(大部分来说),不过在制作一个 playbook 之前,我们将先从一些一句话脚本开始。现在让我们创建和配置 SSH 公钥认证,以便省去 -c 和 --ask-pass 选项:

$ ssh-keygen -t rsa

样例输出:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/mike/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/mike/.ssh/id_rsa.
Your public key has been saved in /home/mike/.ssh/id_rsa.pub.
The key fingerprint is:
94:a0:19:02:ba:25:23:7f:ee:6c:fb:e8:38:b4:f2:42 [email protected]
The key's randomart image is:
+--[ RSA 2048]----+
|... . .          |
|.  . + . .       |
|= . o   o        |
|.*     .         |
|. . .   S        |
| E.o             |
|.. ..            |
|o o+..           |
| +o+*o.          |
+-----------------+

现在显然有很多种方式来把它放到远程主机上应该的位置。不过既然我们正在使用 ansible,就用它来完成这个操作吧:

$ ansible all -m copy -a "src=/home/mike/.ssh/id_rsa.pub dest=/tmp/id_rsa.pub" --ask-pass -c paramiko

样例输出:

SSH password:
127.0.0.1 | success >> {
    "changed": true,
    "dest": "/tmp/id_rsa.pub",
    "gid": 100,
    "group": "users",
    "md5sum": "bafd3fce6b8a33cf1de415af432774b4",
    "mode": "0644",
    "owner": "mike",
    "size": 410,
    "src": "/home/mike/.ansible/tmp/ansible-tmp-1407008170.46-208759459189201/source",
    "state": "file",
    "uid": 1000
}

下一步,把公钥文件添加到远程服务器里。输入:

$ ansible all -m shell -a "cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys" --ask-pass -c paramiko

样例输出:

SSH password:
127.0.0.1 | FAILED | rc=1 >>
/bin/sh: /root/.ssh/authorized_keys: Permission denied

矮油,我们需要用 root 来执行这个命令,所以还是加上一个 -u 参数吧:

$ ansible all -m shell -a "cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys" --ask-pass -c paramiko -u root

样例输出:

SSH password:
127.0.0.1 | success | rc=0 >>

请注意,我刚才这是想要演示通过 ansible 来传输文件的操作。事实上 ansible 有一个更加方便的内置 SSH 密钥管理支持:

$ ansible all -m authorized_key -a "user=mike key='{{ lookup('file', '/home/mike/.ssh/id_rsa.pub') }}' path=/home/mike/.ssh/authorized_keys manage_dir=no" --ask-pass -c paramiko

样例输出:

SSH password:
127.0.0.1 | success >> {
    "changed": true,
    "gid": 100,
    "group": "users",
    "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCq+Z8/usprXk0aCAPyP0TGylm2MKbmEsHePUOd7p5DO1QQTHak+9gwdoJJavy0yoUdi+C+autKjvuuS+vGb8+I+8mFNu5CvKiZzIpMjZvrZMhHRdNud7GuEanusTEJfi1pUd3NA2iXhl4a6S9a/4G2mKyf7QQSzI4Z5ddudUXd9yHmo9Yt48/ASOJLHIcYfSsswOm8ux1UnyeHqgpdIVONVFsKKuSNSvZBVl3bXzhkhjxz8RMiBGIubJDBuKwZqNSJkOlPWYN76btxMCDVm07O7vNChpf0cmWEfM3pXKPBq/UBxyG2MgoCGkIRGOtJ8UjC/daadBUuxg92/u01VNEB [email protected]",
    "key_options": null,
    "keyfile": "/home/mike/.ssh/authorized_keys",
    "manage_dir": false,
    "mode": "0600",
    "owner": "mike",
    "path": "/home/mike/.ssh/authorized_keys",
    "size": 410,
    "state": "file",
    "uid": 1000,
    "unique": false,
    "user": "mike"
}

现在这些密钥已经设置好了。我们来试着随便跑一个命令,比如 hostname,希望我们不会被提示要输入密码

$ ansible all -m shell -a "hostname" -u root

样例输出:

127.0.0.1 | success | rc=0 >>

成功!!!现在我们可以用 root 来执行命令,并且不会被输入密码的提示干扰了。我们现在可以轻易地配置任何在 ansible hosts 文件中的主机了。让我们把 /tmp 中的公钥文件删除:

$ ansible all -m file -a "dest=/tmp/id_rsa.pub state=absent" -u root

样例输出:

127.0.0.1 | success >> {
    "changed": true,
    "path": "/tmp/id_rsa.pub",
    "state": "absent"
}

下面我们来做一些更复杂的事情,我要确定一些软件包已经安装了,并且已经是最新的版本:

$ ansible all -m zypper -a "name=apache2 state=latest" -u root

样例输出:

127.0.0.1 | success >> {
    "changed": false,
    "name": "apache2",
    "state": "latest"
}

很好,我们刚才放在 /tmp 中的公钥文件已经消失了,而且我们已经安装好了最新版的 apache。下面我们来看看前面命令中的 -m zypper,一个让 ansible 非常灵活,并且给了 playbooks 更多能力的功能。如果你不使用 openSuse 或者 Suse enterprise 你可能还不熟悉 zypper, 它基本上就是 suse 世界中相当于 yum 的存在。在上面所有的例子中,我的 hosts 文件中都只有一台机器。除了最后一个命令外,其他所有命令都应该在任何标准的 *nix 系统和标准的 ssh 配置中使用,这造成了一个问题。如果我们想要同时管理多种不同的机器呢?这便是 playbooks 和 ansible 的可配置性闪闪发光的地方了。首先我们来少许修改一下我们的 hosts 文件:

$ cat ~/ansible_hosts

样例输出:

[RHELBased]
10.50.1.33
10.50.1.47

[SUSEBased]
127.0.0.1

首先,我们创建了一些分组的服务器,并且给了他们一些有意义的标签。然后我们来创建一个为不同类型的服务器执行不同操作的 playbook。你可能已经发现这个 yaml 的数据结构和我们之前运行的命令行语句中的相似性了。简单来说,-m 是一个模块,而 -a 用来提供模块参数。在 YAML 表示中你可以先指定模块,然后插入一个冒号 :,最后指定参数。

---
- hosts: SUSEBased
  remote_user: root
  tasks:
    - zypper: name=apache2 state=latest
- hosts: RHELBased
  remote_user: root
  tasks:
    - yum: name=httpd state=latest

现在我们有一个简单的 playbook 了,我们可以这样运行它:

$ ansible-playbook testPlaybook.yaml -f 10

样例输出:

PLAY [SUSEBased] **************************************************************

GATHERING FACTS ***************************************************************
ok: [127.0.0.1]

TASK: [zypper name=apache2 state=latest] **************************************
ok: [127.0.0.1]

PLAY [RHELBased] **************************************************************

GATHERING FACTS ***************************************************************
ok: [10.50.1.33]
ok: [10.50.1.47]

TASK: [yum name=httpd state=latest] *******************************************
changed: [10.50.1.33]
changed: [10.50.1.47]

PLAY RECAP ********************************************************************
10.50.1.33                 : ok=2    changed=1    unreachable=0    failed=0
10.50.1.47                 : ok=2    changed=1    unreachable=0    failed=0
127.0.0.1                  : ok=2    changed=0    unreachable=0    failed=0

注意,你会看到 ansible 联系到的每一台机器的输出。-f 参数让 ansible 在多台主机上同时运行指令。除了指定全部主机,或者一个主机分组的名字以外,你还可以把导入 ssh 公钥的操作从命令行里转移到 playbook 中,这将在设置新主机的时候提供很大的方便,甚至让新主机直接可以运行一个 playbook。为了演示,我们把我们之前的公钥例子放进一个 playbook 里:

---
- hosts: SUSEBased
  remote_user: mike
  sudo: yes
  tasks:
    - authorized_key: user=root key="{{ lookup('file', '/home/mike/.ssh/id_rsa.pub') }}" path=/root/.ssh/authorized_keys manage_dir=no
- hosts: RHELBased
  remote_user: mdonlon
  sudo: yes
  tasks:
    - authorized_key: user=root key="{{ lookup('file', '/home/mike/.ssh/id_rsa.pub') }}" path=/root/.ssh/authorized_keys manage_dir=no

除此之外还有很多可以做的事情,比如在启动的时候把公钥配置好,或者引入其他的流程来让你按需配置一些机器。不过只要 SSH 被配置成接受密码登陆,这些几乎可以用在所有的流程中。在你准备开始写太多 playbook 之前,另一个值得考虑的事情是,代码管理可以有效节省你的时间。机器需要不断变化,然而你并不需要在每次机器发生变化时都重新写一个 playbook,只需要更新相关的部分并提交这些修改。与此相关的另一个好处是,如同我之前所述,你可以从不同的地方管理你的整个基础结构。你只需要将你的 playbook 仓库 git clone 到新的机器上,就完成了管理所有东西的全部设置流程。

现实中的 ansible 例子

我知道很多用户经常使用 pastebin 这样的服务,以及很多公司基于显而易见的理由配置了他们内部使用的类似东西。最近,我遇到了一个叫做 showterm 的程序,巧合之下我被一个客户要求配置它用于内部使用。这里我不打算赘述这个应用程序的细节,不过如果你感兴趣的话,你可以使用 Google 搜索 showterm。作为一个合理的现实中的例子,我将会试图配置一个 showterm 服务器,并且配置使用它所需要的客户端应用程序。在这个过程中我们还需要一个数据库服务器。现在我们从配置客户端开始:

---
- hosts: showtermClients
  remote_user: root
  tasks:
    - yum: name=rubygems state=latest
    - yum: name=ruby-devel state=latest
    - yum: name=gcc state=latest
    - gem: name=showterm state=latest user_install=no

这部分很简单。下面是主服务器:

---
- hosts: showtermServers
  remote_user: root
  tasks:
    - name: ensure packages are installed
      yum: name={{item}} state=latest
      with_items:
        - postgresql
        - postgresql-server
        - postgresql-devel
        - python-psycopg2
        - git
        - ruby21
        - ruby21-passenger
    - name: showterm server from github
      git: repo=https://github.com/ConradIrwin/showterm.io dest=/root/showterm
    - name: Initdb
      command: service postgresql initdb
               creates=/var/lib/pgsql/data/postgresql.conf

    - name: Start PostgreSQL and enable at boot
      service: name=postgresql
               enabled=yes
               state=started
    - gem: name=pg state=latest user_install=no
  handlers:
   - name: restart postgresql
     service: name=postgresql state=restarted

- hosts: showtermServers
  remote_user: root
  sudo: yes
  sudo_user: postgres
  vars:
    dbname: showterm
    dbuser: showterm
    dbpassword: showtermpassword
  tasks:
    - name: create db
      postgresql_db: name={{dbname}}

    - name: create user with ALL priv
      postgresql_user: db={{dbname}} name={{dbuser}} password={{dbpassword}} priv=ALL
- hosts: showtermServers
  remote_user: root
  tasks:
    - name: database.yml
      template: src=database.yml dest=/root/showterm/config/database.yml
- hosts: showtermServers
  remote_user: root
  tasks:
    - name: run bundle install
      shell: bundle install
      args:
        chdir: /root/showterm
- hosts: showtermServers
  remote_user: root
  tasks:
    - name: run rake db tasks
      shell: 'bundle exec rake db:create db:migrate db:seed'
      args:
        chdir: /root/showterm
- hosts: showtermServers
  remote_user: root
  tasks:
    - name: apache config
      template: src=showterm.conf dest=/etc/httpd/conf.d/showterm.conf

还凑合。请注意,从某种意义上来说这是一个任意选择的程序,然而我们现在已经可以持续地在任意数量的机器上部署它了,这便是配置管理的好处。此外,在大多数情况下这里的定义语法几乎是不言而喻的,wiki 页面也就不需要加入太多细节了。当然在我的观点里,一个有太多细节的 wiki 页面绝不会是一件坏事。

扩展配置

我们并没有涉及到这里所有的细节。Ansible 有许多选项可以用来配置你的系统。你可以在你的 hosts 文件中内嵌变量,而 ansible 将会把它们应用到远程节点。如:

[RHELBased]
10.50.1.33  http_port=443
10.50.1.47  http_port=80  ansible_ssh_user=mdonlon

[SUSEBased]
127.0.0.1  http_port=443

尽管这对于快速配置来说已经非常方便,你还可以将变量分成存放在 yaml 格式的多个文件中。在你的 hosts 文件路径里,你可以创建两个子目录 groupvars 和 hostvars。在这些路径里放置的任何文件,只要能对得上一个主机分组的名字,或者你的 hosts 文件中的一个主机名,它们都会在运行时被插入进来。所以前面的一个例子将会变成这样:

ultrabook:/etc/ansible # pwd
/etc/ansible
ultrabook:/etc/ansible # tree
.
├── group_vars
│   ├── RHELBased
│   └── SUSEBased
├── hosts
└── host_vars
├── 10.50.1.33
└── 10.50.1.47

2 directories, 5 files
ultrabook:/etc/ansible # cat hosts
[RHELBased]
10.50.1.33
10.50.1.47

[SUSEBased]
127.0.0.1
ultrabook:/etc/ansible # cat group_vars/RHELBased
ultrabook:/etc/ansible # cat group_vars/SUSEBased
---
http_port: 443
ultrabook:/etc/ansible # cat host_vars/10.50.1.33
---
http_port: 443
ultrabook:/etc/ansible # cat host_vars/10.50.1.47
---
http_port:80
ansible_ssh_user: mdonlon

改善 Playbooks

组织 playbooks 也已经有很多种现成的方式。在前面的例子中我们用了一个单独的文件,因此这方面被大幅地简化了。组织这些文件的一个常用方式是创建角色。简单来说,你将一个主文件加载为你的 playbook,而它将会从其它文件中导入所有的数据,这些其他的文件便是角色。举例来说,如果你有了一个 wordpress 网站,你需要一个 web 前端,和一个数据库。web 前端将包括一个 web 服务器,应用程序代码,以及任何需要的模块。数据库有时候运行在同一台主机上,有时候运行在远程的主机上,这时候角色就可以派上用场了。你创建一个目录,并对每个角色创建对应的小 playbook。在这个例子中我们需要一个 apache 角色,mysql 角色,wordpress 角色,mod\_php,以及 php 角色。最大的好处是,并不是每个角色都必须被应用到同一台机器上。在这个例子中,mysql 可以被应用到一台单独的机器。这同样为代码重用提供了可能,比如你的 apache 角色还可以被用在 python 和其他相似的 php 应用程序中。展示这些已经有些超出了本文的范畴,而且做一件事总是有很多不同的方式,我建议搜索一些 ansible 的 playbook 例子。有很多人在 github 上贡献代码,当然还有其他一些网站。

模块

在 ansible 中,对于所有完成的工作,幕后的工作都是由模块主导的。Ansible 有一个非常丰富的内置模块仓库,其中包括软件包安装,文件传输,以及我们在本文中做的所有事情。但是对一部分人来说,这些并不能满足他们的配置需求,ansible 也提供了方法让你添加自己的模块。Ansible 的 API 有一个非常棒的事情是,它并没有限制模块也必须用编写它的语言 Python 来编写,也就是说,你可以用任何语言来编写模块。Ansible 模块通过传递 JSON 数据来工作,因此你只需要用想用的语言生成一段 JSON 数据。我很确定任何脚本语言都可以做到这一点,因此你现在就可以开始写点什么了。在 Ansible 的网站上有很多的文档,包括模块的接口是如何工作的,以及 Github 上也有很多模块的例子。注意一些小众的语言可能没有很好的支持,不过那只可能是因为没有多少人在用这种语言贡献代码。试着写点什么,然后把你的结果发布出来吧!

总结

总的来说,虽然在配置管理方面已经有很多解决方案,我希望本文能显示出 ansible 简单的设置过程,在我看来这是它最重要的一个要点。请注意,因为我试图展示做一件事的不同方式,所以并不是前文中所有的例子都是适用于你的个别环境或者对于普遍情况的最佳实践。这里有一些链接能让你对 ansible 的了解进入下一个层次:


via: http://www.cyberciti.biz/python-tutorials/linux-tutorial-install-ansible-configuration-management-and-it-automation-tool/

作者:Nix Craft 译者:felixonmars 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

保留、维护和分析日志(如某个特定时期内发生过的,或正在发生的帐号事件),是Linux系统管理员最基础和最重要的任务之一。对于用户管理,检查用户的登入和登出日志(不管是失败的,还是成功的)可以让我们对任何潜在的安全隐患或未经授权使用系统的情况保持警惕。例如,工作时间之外或放假期间的来自未知IP地址或帐号的远程登录应当发出红色警报。

在CentOS系统上,用户登录历史存储在以下这些文件中:

  • /var/run/utmp(用于记录当前打开的会话)被who和w工具用来记录当前有谁登录以及他们正在做什么,而uptime用来记录系统启动时间。
  • /var/log/wtmp (用于存储系统连接历史记录)被last工具用来记录最后登录的用户的列表。
  • /var/log/btmp(记录失败的登录尝试)被lastb工具用来记录最后失败的登录尝试的列表。

在本文中,我将介绍如何使用utmpdump,这个小程序来自sysvinit-tools包,可以用于转储二进制日志文件到文本格式的文件以便检查。此工具默认在CentOS 6和7系列上可用。utmpdump收集到的信息比先前提到过的工具的输出要更全面,这让它成为一个胜任该工作的很不错的工具。除此之外,utmpdump可以用于修改utmp或wtmp。如果你想要修复二进制日志中的任何损坏条目,它会很有用(LCTT 译注:我怎么觉得这像是做坏事的前奏?)。

Utmpdump的使用及其输出说明

正如我们之前提到的,这些日志文件,与我们大多数人熟悉的其它日志相比(如/var/log/messages,/var/log/cron,/var/log/maillog),是以二进制格式存储的,因而我们不能使用像less或more这样的文件命令来查看它们的内容。所以,utmpdump的出现拯救了世界。

为了要显示/var/run/utmp的内容,请运行以下命令:

# utmpdump /var/run/utmp 

同样要显示/var/log/wtmp的内容:

# utmpdump /var/log/wtmp | tail -15

最后,对于/var/log/btmp:

# utmpdump /var/log/btmp 

正如你所能看到的,三种情况下的输出结果是一样的,除了utmp和btmp的记录是按时间排序,而wtmp的顺序是颠倒的这个原因外(LCTT 译注:此处原文有误,实际上都是按照时间顺序排列的)。

每个日志行格式化成了多列,说明如下。第一个字段显示了会话识别符,而第二个字段则是PID。第三个字段可以是以下值:--(表示运行等级改变或系统重启),bw(启动守候进程),数字(表示TTY编号),或者字符和数字(表示伪终端)。第四个字段可以为空或用户名、重启或运行级别。第五个字段是主TTY或PTY(伪终端),如果此信息可获得的话。第六个字段是远程主机名(如果是本地登录,该字段为空,运行级别信息除外,它会返回内核版本)。第七个字段是远程系统的IP地址(如果是本地登录,该字段为0.0.0.0)。如果没有提供DNS解析,第六和第七字段会显示相同的信息(远程系统的IP地址)。最后一个(第八)字段指明了该记录创建的日期和时间。

Utmpdump使用样例

下面提供了一些utmpdump的简单使用情况。

1、 检查8月18日到9月17日之间某个特定用户(如gacanepa)的登录次数。

# utmpdump /var/log/wtmp | grep gacanepa 

如果你需要回顾先前日期的登录信息,你可以检查/var/log下的wtmp-YYYYMMDD(或wtmp.[1...N])和btmp-YYYYMMDD(或btmp.[1...N])文件,这些是由logrotate生成的旧wtmp和btmp的归档文件。

2、 统计来自IP地址192.168.0.101的登录次数。

# utmpdump /var/log/wtmp | grep 192.168.0.101 

3、 显示失败的登录尝试。

# utmpdump /var/log/btmp 

在/var/log/btmp输出中,每个日志行都与一个失败的登录尝试相关(如使用不正确的密码,或者一个不存在的用户ID)。上面图片中高亮部分显示了使用不存在的用户ID登录,这警告你有人尝试猜测常用帐号名来闯入系统。这在使用tty1的情况下是个极其严重的问题,因为这意味着某人对你机器上的终端具有访问权限(该检查一下谁拿到了进入你数据中心的钥匙了,也许吧?)

4、 显示每个用户会话的登入和登出信息

# utmpdump /var/log/wtmp 

在/var/logwtmp中,一次新的登录事件的特征是,第一个字段为‘7’,第三个字段是一个终端编号(或伪终端id),第四个字段为用户名。相关的登出事件会在第一个字段显示‘8’,第二个字段显示与登录一样的PID,而终端编号字段空白。例如,仔细观察上面图片中PID 1463的行。

  • 在 [Fri Sep 19 11:57:40 2014 ART],TTY1上显示登录提示符。
  • 在 [Fri Sep 19 12:04:21 2014 ART],用户 root 登入。
  • 在 [Fri Sep 19 12:07:24 2014 ART],用户 root 登出。

旁注:第四个字段的LOGIN意味着出现了一次登录到第五字段指定的终端的提示。

到目前为止,我介绍一些有点琐碎的例子。你可以将utmpdump和其它一些文本处理工具,如awk、sed、grep或cut组合,来产生过滤和加强的输出。

例如,你可以使用以下命令来列出某个特定用户(如gacanepa)的所有登录事件,并发送输出结果到.csv文件,它可以用像LibreOffice Calc或Microsoft Excel之类的文字或工作簿应用程序打开查看。让我们只显示PID、用户名、IP地址和时间戳:

 # utmpdump /var/log/wtmp | grep -E "\[7].*gacanepa" | awk -v OFS="," 'BEGIN {FS="] "}; {print $2,$4,$7,$8}' | sed -e 's/\[//g' -e 's/\]//g' 

就像上面图片中三个高亮区域描绘的那样,过滤逻辑操作是由三个管道步骤组成的。第一步用于查找由用户gacanepa触发的登录事件([7]);第二步和第三部用于选择期望的字段,移除utmpdump输出的方括号并设置输出字段分隔符为逗号。

当然,如果你想要在以后打开来看,你需要重定向上面的命令输出到文件(添加“>[文件名].csv”到命令后面)。

在更为复杂的例子中,如果你想要知道在特定时间内哪些用户(在/etc/passwd中列出)没有登录,你可以从/etc/passwd中提取用户名,然后运行grep命令来获取/var/log/wtmp输出中对应用户的列表。就像你看到的那样,有着无限可能。

在进行总结之前,让我们简要地展示一下utmpdump的另外一种使用情况:修改utmp或wtmp。由于这些都是二进制日志文件,你不能像编辑文件一样来编辑它们。取而代之是,你可以将其内容输出成为文本格式,并修改文本输出内容,然后将修改后的内容导入回二进制日志中。如下:

# utmpdump /var/log/utmp > tmp_output
<使用文本编辑器修改 tmp_output>
# utmpdump -r tmp_output > /var/log/utmp 

这在你想要移除或修复二进制日志中的任何伪造条目时很有用。

下面小结一下,utmpdump从utmp、wtmp和btmp日志文件或轮循的旧归档文件来读取详细的登录事件,来补充如who,w,uptime,last,lastb之类的标准工具的不足,这也使得它成为一个很棒的工具。

你可以随意添加评论以加强本帖的含金量。


via: http://xmodulo.com/2014/09/monitor-user-login-history-centos-utmpdump.html

作者:Gabriel Cánepa 译者:GOLinux 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

想要更清晰的了解你的网络吗?没有比这几个免费的工具更好用的了。

网络和系统监控是一个很宽的范畴。有监控服务器、网络设备、应用正常工作的方案,也有跟踪这些系统和设备性能,提供趋势性能分析的解决方案。有些工具像个闹钟一样,当发现问题的时候就会报警,而另外的一些工具甚至可以在警报响起的时候触发一些动作。这里,收集了一些开源的工具,旨在解决上述的一些甚至大部分问题。

Cacti

Cacti是一个性能广泛的图表和趋势分析工具,可以用来跟踪并几乎可以绘制出任何可监测指标,描绘出图表。从硬盘的利用率到风扇的转速,在一个电脑管理系统中,只要是可以被监测的指标,Cacti都可以监测,并快速的转换成可视化的图表。

Nagios

Nagios是一个经典的老牌系统和网络监测工具。运行速度快,可靠,需要针对应用定制。Nagios对于初学者是一个挑战。但是它的极其复杂的配置正好也反应出它的强大,因为它几乎可以适用于任何监控任务。要说缺点的话就是不怎么耐看,但是其强劲的功能和可靠性弥补了这个缺点。

Icinga

Icinga 是一个正在重建的Nagios的分支,它提供了一个全面的监控和警报的框架,致力于设计一个像Nagios一样的开放和可扩展性的平台。但是和Nagios拥有不一样的Web界面。Icinga 1 和 Nagios非常的相近,不过Icinga 2就重写了。两个版本都能很好的兼容,而且,Nagios用户可以很轻松的转到Icinga 1平台。

NeDi

NeDi可能不如其他的工具一样闻名全世界,但它确是一个跟踪网络接入的一个强大的解决方案。它可以很流畅的运行网络基础设施和设备目录,保持对任何事件的跟踪。并且可以提供任意设备的当前地点,也包括历史地点。

NeDi可以被用于定位被偷的,或者是丢失掉的设备,只要设备出现在网络上。它甚至可以在地图上显示所有已发现的节点。并且很清晰的告诉人们网络是怎么互联的到物理设备端口的。

Observium

Observium 综合了系统和网路监控,在性能趋势监测上有很好的表现,它支持静态和动态发现来确认服务器和网络设备,利用多种监测方法,可以监测任何可用的指标。Web界面非常的整洁,易用。

就如我们看到的,Observium也可以在地图上显示任何被监测节点的实际地点。需要注意的是面板上关于活跃设备和警报的计数。

Zabbix

Zabbix 利用一系列的工具监测服务器和网络。Zabbix的监控代理支持大多数的操作系统,你可以被动的或者是使用外部检查,包括SNMP来监控主机和网络设备。你也会发现很多提醒和通知设施,和一个非常人性化的Web界面,适用于不同的面板,此外,Zabbix还拥有一些特殊的管理工具来监测Web应用和虚拟化的管理程序。

Zabbix 还可以提供详细的互联图,以便于我们了解某些对象是怎么连接的。这些图是可以定制的,并且,图也可以以被监测的服务器和主机的分组形式被创建。

Ntop

Ntop是一个数据包嗅探工具。有一个整洁的Web界面,用来显示被监测网络的实时数据。即时的网络数据通过一个高级的绘图工具可以可视化。主机数据流和与之对应的主机通信信息可以被实时的进行可视化显示。


via: http://www.networkworld.com/article/2686794/asset-management/164219-7-killer-open-source-monitoring-tools.html

作者:Paul Venezia 译者:barney-ro 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

本教程将指引你直接通过使用DNSMASQ作为PXE服务器(预启动执行环境),以网络方式安装Debian 7(Wheezy),此种情况是假定你的服务器不提供任何CD/DVD/USB介质驱动器,或者它只能通过相连的监视器、键盘和鼠标操作。

Debian 7 Network Installation on Client Machines

客户机上的Debian 7网络安装

DNSMASQ是一个轻量级网络基础架构服务器,它可以通过内建的DNS、DHCP和TFTP服务器提供如DNS、DHCP和网络启动等关键服务。

一旦PXE服务器启动并运行,你可以指示你所有的客户机直接从网络启动,前提是你的客户机必须拥有一张支持网络启动的网卡,网络启动可以从BIOS的网络启动或启动服务选项中启用。

前置阅读

步骤1: 安装及配置DNSMASQ服务器

1. 首先,在安装Debian服务器后,要确保你的系统使用的是静态IP地址。因为除了网络启动之外,也要为你的整个网段提供DHCP服务。设置好静态IP地址后,以root帐号或具有root权力的用户来运行以下命令,进行DNSMASQ服务器的安装。

# apt-get install dnsmasq

Install Dnsmasq Package

安装Dnsmasq包

2. 安装好DNSMASQ包后,你可以开始编辑配置文件。首先创建一个主配置文件的备份,然后使用下面的命令对dnsmasq.conf文件进行编辑。

# mv /etc/dnsmasq.conf  /etc/dnsmasq.conf.backup
# nano /etc/dnsmasq.conf

Backup Dnsmasq Configuration

备份Dnsmasq配置

3. 上面的备份过程适合重命名配置文件,所以新的文件应该是空,你可以使用以下描述的DNSMASQ配置文件节录。

interface=eth0
domain=debian.lan
dhcp-range=192.168.1.3,192.168.1.253,255.255.255.0,1h
dhcp-boot=pxelinux.0,pxeserver,192.168.1.100
pxe-prompt="Press F8 for menu.", 60
#pxe-service types: x86PC, PC98, IA64_EFI, Alpha, Arc_x86, Intel_Lean_Client, IA32_EFI, BC_EFI, Xscale_EFI and X86-64_EFI
pxe-service=x86PC, "Install Debian 7 Linux from network server 192.168.1.100", pxelinux
enable-tftp
tftp-root=/srv/tftp

Configuration of Dnsmasq

Dnsmasq配置

  • interface – 服务器监听的网络接口。
  • domain – 用你自己的域名替换。
  • dhcp-range – 用你自己的网络掩码定义的网络IP地址范围。
  • dhcp-boot – 保持默认,但使用你自己的服务器IP地址替换IP声明。
  • pxe-prompt – 保持默认 – 要求在敲击F8键 进入菜单时等待60秒。
  • pxe=service – 使用x86PC作为32位/64位架构,并进入引号字符串的菜单描述提示。其它值类型可能是:PC98,IA64EFI,Alpha,Arcx86,IntelLeanClient,IA32EFI, BCEFI,XscaleEFI和 X86-64EFI。
  • enable-tftp – 启用内建TFTP服务器。
  • tftp-root – 使用/srv/tftp作为Debian网络启动文件的存放位置。

步骤2: 下载Debian网络启动文件并打开防火墙连接

4. 现在,该下载Debian网络启动文件了。首先,修改你当前工作目录路径到TFTP根目录位置,此位置由最后的配置语句定义(/srv/tftp系统路径)。

转到Debian网络安装网络启动部分的官方页面镜像,抓取以下文件,要抓取的文件取决于你想要安装到客户端的系统架构。

下载好netboot.tar.gz文件后,同时提取归档(该过程描述只适用于64位,但对于其它系统架构也基本相同)。

# cd /srv/tftp/
# wget http://ftp.nl.debian.org/debian/dists/wheezy/main/installer-amd64/current/images/netboot/netboot.tar.gz
# tar xfz netboot.tar.gz
# wget http://ftp.nl.debian.org/debian/dists/wheezy/main/installer-amd64/current/images/SHA256SUMS
# wget http://ftp.nl.debian.org/debian/dists/wheezy/Release
# wget http://ftp.nl.debian.org/debian/dists/wheezy/Release.gpg

同时,必须确保TFTP目录中的所有文件都可让TFTP服务器读取。

# chmod -R 755 /srv/tftp/

Download Debian NetBoot Files

下载Debian网络启动文件

使用以下变量用于Debian网络安装镜像和架构。

# wget http://"$YOURMIRROR"/debian/dists/wheezy/main/installer-"$ARCH"/current/images/netboot/netboot.tar.gz
# wget http://"$YOURMIRROR"/debian/dists/wheezy/main/installer-"$ARCH"/current/images/SHA256SUMS
# wget http://"$YOURMIRROR"/debian/dists/wheezy/Release
# wget http://"$YOURMIRROR"/debian/dists/wheezy/Release.gpg

5. 下一步,启动或重启DNSMASQ守护进程,并运行netstat命令来获取服务器监听的端口列表。

# service dnsmasq restart
# netstat -tulpn | grep dnsmasq

Start Dnsmasq Service

启动Dnsmasq服务

6. 基于Debian的发行版通常附带了UFW防火墙包。使用以下命令来打开需要的DNSMASQ端口号:67(Bootps),69(TFTP),53(DNS)4011(代理DHCP)udp和53 tcp(DNS)。

# ufw allow 69/udp
# ufw allow 4011/udp   ## Only if you have a ProxyDHCP on the network
# ufw allow 67/udp
# ufw allow 53/tcp
# ufw allow 53/udp

Open Dnsmasq Ports

开启Dnsmasq端口

现在,位于你的客户机网络接口上的PXE加载器将使用按以下顺序从/srv/tftp/pxelinux.cfg目录加载pxelinux配置文件。

  • GUID文件
  • MAC文件
  • 默认文件

步骤3: 配置客户端从网络启动

7. 要为你的客户端计算机启用网络启动,请进入系统BIOS配置(如何进入BIOS设置,请查阅硬件主板提供商的文档)。

转到启动菜单,然后选择网络启动作为首要启动设备(在某些系统上,你可以不用进入BIOS配置就能选择启动设备,只要在BIOS自检时按一个键就可以进行选择了)。

Select BIOS Settings

选择BIOS设置

8。 在编辑启动顺序后,通常按F10来保存BIOS设置。重启后,你的客户端计算机应该可以直接从网络启动了,应该会出第一个PXE提示,要求你按F8键进入菜单。

接下来,敲击F8键来进入,会出现一个新的提示。敲击回车键,屏幕上会出现Debian安装器主界面提示,如下图所示。

Boot Menu Selection

启动菜单选择

Select Debian Installer Boot

选择Debian安装器启动

Select Debian Install

选择Debian安装

从这里开始,你可以使用Debian 7 Wheezy安装进程将Debian安装到你的机器上了(安装链接见上面)。然而,为了能够完成安装进程,你也需要确保你的机器上互联网连接已经激活。

步骤4: DNSMASQ服务器排障并在系统范围内启用

9. 要诊断服务器以查询最终是否发生问题或要查询其它提供给客户端的信息,运行以下命令来打开日志文件。

# tailf /var/log/daemon.log

Debug DNSMASQ Server

DNSMASQ服务器排障

10. 如果服务器测试中已一切就绪,你现在可以在sysv-rc-conf包的帮助下,启用DNSMASQ守护进程自启动,以使该进程在系统重启后自动启动。

# apt-get install sysv-rc-conf
# sysv-rc-conf dnsmaq on

Enable DNSMASQ Daemon

启用DNSMASQ守护进程

到此为止吧!现在你的PXE服务器已经整装待发,随时准备好分配IP地址了(DHCP),并为你所有网段中的客户端提供需要的启动信息,这些信息配置用来从网络启动并安装Debian Wheezy。

使用PXE网络启动安装在服务器主机数量很多时很有优势,因为你可以在短时间内火同时设置整个网络基础架构,为版本升级提供了方便,也可以通过kickstart文件使整个安装的全自动化。


via: http://212.71.234.61/network-installation-of-debian-7-on-client-machines/

作者:Matei Cezar 译者:GOLinux 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

LVM快照是以空间换时间时间的方式制作的lvm卷副本。它只在lvm中工作,并只在源逻辑卷发生改变时占用快照卷的空间。如果源卷的变化达到1GB这么大,快照卷同样也会产生这样大的改变。因而,对于空间有效利用的最佳途径,就是总是进行小的修改。如果快照将存储空间消耗殆尽,我们可以使用lvextend来扩容。而如果我们需要缩减快照所占用卷的大小,可以使用lvreduce。

Take Snapshot in LVM

在LVM中录制快照

如果我们在创建快照后意外地删除了无论什么文件,我们没有必要担心,因为快照里包含了我们所删除的文件的原始文件。创建快照时,很有可能文件已经存在了。不要改变快照卷,保持创建时的样子,因为它用于快速恢复。

快照不可以用于备份选项。备份是某些数据的基础副本,因此我们不能使用快照作为备份的一个选择。

前置阅读

我的服务器设置

  • 操作系统 — 安装有LVM的CentOS 6.5
  • 服务器IP — 192.168.0.200

步骤1: 创建LVM快照

首先,使用‘vgs’命令检查卷组中的空闲空间以创建新的快照。

# vgs
# lvs

Check LVM Disk Space

检查LVM磁盘空间

正如你所见,在vgs命令输出中,我们可以看到有8GB的剩余空闲空间。所以,让我们为我的名为tecmint\_datas的卷创建快照。处于演示的目的,我将会使用以下命令来创建1GB的快照卷。

# lvcreate -L 1GB -s -n tecmint_datas_snap /dev/vg_tecmint_extra/tecmint_datas        

或者

# lvcreate --size 1G --snapshot --name tecmint_datas_snap /dev/vg_tecmint_extra/tecmint_datas

上面的两个命令都是干得同一件事:

  • -s – 创建快照
  • -n – 为快照命名

Create LVM Snapshot

创建LVM快照

此处,是对上面高亮要点的说明。

  1. 我在此创建的快照的大小。
  2. 创建快照。
  3. 创建快照名。
  4. 新的快照名。
  5. 要创建快照的卷。

如果你想要移除快照,可以使用‘lvremove’命令。

# lvremove /dev/vg_tecmint_extra/tecmint_datas_snap

Remove LVM Snapshot

移除LVM快照

现在,使用以下命令列出新创建的快照。

# lvs

Verify LVM Snapshot

验证LVM快照

上面的你看到了吧,成功创建了一个快照。上面我用箭头标出了快照创建的源,它就是tecmint\_datas。是的,因为我已经为tecmint\_datas l-volume创建了一个快照。

Check LVM Snapshot Space

检查LVM快照空间

让我们添加一些新文件到tecmint\_datas里头。现在卷里大概有650MB左右的数据,而我我们的快照有1GB大。因此,有足够的空间在快照卷里备份我们的修改。这里我们可以使用下面的命令来查看到,我们的快照当前的状态。

# lvs

Check Snapshot Status

检查快照状态

你看到了,现在已经用掉了51%的快照卷,你要对你的文件作更多的修改都没有问题。使用下面的命令来查看更多详细信息。

# lvdisplay vg_tecmint_extra/tecmint_data_snap

View Snapshot Information

查看快照信息

再来对上面图片中高亮的要点作个清楚的说明。

  1. 快照逻辑卷名称。
  2. 当前使用的卷组名。
  3. 读写模式下的快照卷,我们甚至可以挂载并使用该卷。
  4. 快照创建时间。这个很重要,因为快照将跟踪此时间之后的每个改变。
  5. 该快照属于tecmint\_datas逻辑卷。
  6. 逻辑卷在线并可用。
  7. 我们录制快照的源卷大小。
  8. 写时复制表大小,Cow = copy on Write,这是说对tecmint\_data卷所作的任何改变都会写入此快照。
  9. 当前使用的快照大小,我们的tecmintdata有10GB,而我们的快照大小是1GB,这就意味着我们的数据大概有650MB。所以,如果tecmintdatas中的文件增长到2GB,现在的51%中的内容将增加到超过所分配的快照的大小,当然,我们在创建快照时会出现问题。这就意味着我们需要扩展逻辑卷大小(快照逻辑卷)
  10. 给出快照组块的大小。

现在,让我们复制超过1GB的文件到tecmint\_datas。让我们看看会发生什么。如果你那么做了,你将会见到‘Input/output error’这样的错误信息,它告诉你快照超出空间大小了。

Add Files to Snapshot

添加文件到快照

如果该逻辑卷满了,它就会自动丢失新的数据,我们就不能再使用了,就算我们去扩展快照卷的大小也不行。最好的方法就是在创建快照时,创建一个和源一样大小的快照卷。tecmint\_datas的大小是10GB,如果我们创建一个10GB大小的快照,它就永远都不会像上面那样超载,因为它有足够的空间来录制你的逻辑卷的快照。

步骤2: 在LVM中扩展快照

如果我们需要在超过容量前扩展快照卷的大小,我们可以使用以下命令来完成此项任务。

# lvextend -L +1G /dev/vg_tecmint_extra/tecmint_data_snap

现在,那里有总计2GB大小的快照空间。

Extend LVM Snapshot

扩展LVM快照

接下来,使用以下命令来验证新的大小和写时复制表。

# lvdisplay /dev/vg_tecmint_extra/tecmint_data_snap

要知道快照卷的大小使用%

# lvs

Check Size of Snapshot

检查快照大小

然而,如果你的快照大小和源卷一样,我们就没有必要担心这些问题了。

步骤3: 恢复快照或合并

要恢复快照,我们首先需要卸载文件系统。

# unmount /mnt/tecmint_datas/

Un-mount File System

卸载文件系统

只想检查挂载点是否卸载成功,可以使用下面的命令。

# df -h

Check File System Mount Points

检查文件系统挂载点

这里,我们的挂载已经被卸载,所以我们可以继续恢复快照。要恢复快照,可以使用lvconvert命令。

# lvconvert --merge /dev/vg_tecmint_extra/tecmint_data_snap

Restore LVM Snapshot

恢复LVM快照

在合并完成后,快照卷将被自动移除。现在我们可以使用df命令来查看分区大小。

# df -Th

Check Size of Snapshot

在快照卷自动移除后,你可以用下面的命令查看逻辑卷大小。

# lvs

Check Size of Logical Volume

检查逻辑卷大小

重要:要自动扩展快照,我们可以通过修改配置文件来进行。对于手动扩展,我们可以使用lvextend。

使用你喜欢的编辑器打开lvm配置文件。

# vim /etc/lvm/lvm.conf

搜索单词autoextend。默认情况下,该值和下图中的类似。

LVM Configuration

LVM配置

修改此处的10075,这样自动扩展的起始点就是75,而自动扩展百分比为20,它将自动扩容百分之20

如果快照卷达到75%,它会自动为快照卷扩容20%。这样,我们可以自动扩容了。使用wq!来保存并退出。

这将把快照从超载导致下线事故中拯救出来,这也会帮助你节省更多时间。LVM是我们扩容以及获得其它众多特性如精简资源调配、拆卸、虚拟卷和使用精简池的唯一方法,让我们在下一个话题中来讨论吧。


via: http://212.71.234.61/take-snapshot-of-logical-volume-and-restore-in-lvm/

作者:Babin Lonston 译者:GOLinux 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出