我们已经写了两篇关于 Ansible 的文章，这是第三篇。如果你是 Ansible 新手，我建议你阅读下面这两篇文章，它会教你一些 Ansible 的基础以及它是什么。第一篇: Ansible 自动化工具安装、配置和快速入门指南第二篇: Ansible 点对点命令快速入门指南示例如果你已经阅读过了，那么在阅读本文时你才不会感到突兀。什么是 Ansible 剧本? 剧本 playbook 比点对点命令模式更强大，而且完全不同。它使用了 /usr/bin/ansible-playbook 二进制文件，并且提供丰富的特性使得复杂的任务变得更容易。如果你想经常运行一个任务，剧本是非常有用的。此外，如果你想在服务器组上执行多个任务，它也是非常有用的。剧本是由 YAML 语言编写。YAML 代表一种标记语言，它比其它常见的数据格式（如 XML 或 JSON）更容易读写。下面这张 Ansible 剧本流程图将告诉你它的详细结构。理解 Ansible 剧本的术语 控制节点 Control node ：Ansible 安装的机器，它负责管理客户端节点。 受控节点 Managed node ：控制节点管理的主机列表。 剧本 playbook ：一个剧本文件包含一组自动化任务。 主机清单 Inventory ：这个文件包含有关管理的服务器的信息。 任务 Task ：每个剧本都有大量的任务。任务在指定机器上依次执行（一个主机或多个主机）。 模块 Module ： 模块是一个代码单元，用于从客户端节点收集信息。 角色 Role ：角色是根据已知文件结构自动加载一些变量文件、任务和处理程序的方法。 动作 Play ：每个剧本含有大量的动作，一个动作从头到尾执行一个特定的自动化。 处理程序 Handler ： 它可以帮助你减少在剧本中的重启任务。处理程序任务列表实际上与常规任务没有什么不同，更改由通知程序通知。如果处理程序没有收到任何通知，它将不起作用。基本的剧本是怎样的？下面是一个剧本的模板：--- [YAML 文件应该以三个破折号开头] - name: [脚本描述] hosts: group [添加主机或主机组] become: true [如果你想以 root 身份运行任务，则标记它] tasks: [你想在任务下执行什么动作] - name: [输入模块选项] module: [输入要执行的模块] module_options-1: value [输入模块选项] module_options-2: value . module_options-N: value 如何理解 Ansible 的输出Ansible 剧本的输出有四种颜色，下面是具体含义：绿色：ok 代表成功，关联的任务数据已经存在，并且已经根据需要进行了配置。黄色：changed 指定的数据已经根据任务的需要更新或修改。红色：FAILED 如果在执行任务时出现任何问题，它将返回一个失败消息，它可能是任何东西，你需要相应地修复它。白色：表示有多个参数。为此，创建一个剧本目录，将它们都放在同一个地方。$ sudo mkdir /etc/ansible/playbooks 剧本-1：在 RHEL 系统上安装 Apache Web 服务器这个示例剧本允许你在指定的目标机器上安装 Apache Web 服务器：$ sudo nano /etc/ansible/playbooks/apache.yml --- - hosts: web become: yes name: "Install and Configure Apache Web server" tasks: - name: "Install Apache Web Server" yum: name: httpd state: latest - name: "Ensure Apache Web Server is Running" service: name: httpd state: started $ ansible-playbook apache1.yml 如何理解 Ansible 中剧本的执行使用以下命令来查看语法错误。如果没有发现错误，它只显示剧本文件名。如果它检测到任何错误，你将得到一个如下所示的错误，但内容可能根据你的输入文件而有所不同。$ ansible-playbook apache1.yml --syntax-check ERROR! Syntax Error while loading YAML. found a tab character that violate indentation The error appears to be in '/etc/ansible/playbooks/apache1.yml': line 10, column 1, but may be elsewhere in the file depending on the exact syntax problem. The offending line appears to be: state: latest ^ here There appears to be a tab character at the start of the line. YAML does not use tabs for formatting. Tabs should be replaced with spaces. For example: - name: update tooling vars: version: 1.2.3 # ^--- there is a tab there. Should be written as: - name: update tooling vars: version: 1.2.3 # ^--- all spaces here. 或者，你可以使用这个 URL YAML Lint 在线检查 Ansible 剧本内容。执行以下命令进行“演练”。当你运行带有 --check 选项的剧本时，它不会对远程机器进行任何修改。相反，它会告诉你它将要做什么改变但不是真的执行。$ ansible-playbook apache.yml --check PLAY [Install and Configure Apache Webserver] ******************************************************************** TASK [Gathering Facts] ******************************************************************************************* ok: [node2.2g.lab] ok: [node1.2g.lab] TASK [Install Apache Web Server] ********************************************************************************* changed: [node2.2g.lab] changed: [node1.2g.lab] TASK [Ensure Apache Web Server is Running] *********************************************************************** changed: [node1.2g.lab] changed: [node2.2g.lab] PLAY RECAP ******************************************************************************************************* node1.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 node2.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 如果你想要知道 ansible 剧本实现的详细信息，使用 -vv 选项，它会展示如何收集这些信息。$ ansible-playbook apache.yml --check -vv ansible-playbook 2.9.2 config file = /etc/ansible/ansible.cfg configured module search path = ['/home/daygeek/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3.8/site-packages/ansible executable location = /usr/bin/ansible-playbook python version = 3.8.1 (default, Jan 8 2020, 23:09:20) [GCC 9.2.0] Using /etc/ansible/ansible.cfg as config file PLAYBOOK: apache.yml ***************************************************************************************************** 1 plays in apache.yml PLAY [Install and Configure Apache Webserver] **************************************************************************** TASK [Gathering Facts] *************************************************************************************************** task path: /etc/ansible/playbooks/apache.yml:2 ok: [node2.2g.lab] ok: [node1.2g.lab] META: ran handlers TASK [Install Apache Web Server] ***************************************************************************************** task path: /etc/ansible/playbooks/apache.yml:6 changed: [node2.2g.lab] => {"changed": true, "msg": "Check mode: No changes made, but would have if not in check mod e", "rc": 0, "results": ["Installed: httpd"]} changed: [node1.2g.lab] => {"changed": true, "changes": {"installed": ["httpd"], "updated": []}, "msg": "", "obsolet es": {"urw-fonts": {"dist": "noarch", "repo": "@anaconda", "version": "2.4-16.el7"}}, "rc": 0, "results": []} TASK [Ensure Apache Web Server is Running] ******************************************************************************* task path: /etc/ansible/playbooks/apache.yml:10 changed: [node1.2g.lab] => {"changed": true, "msg": "Service httpd not found on host, assuming it will exist on full run"} changed: [node2.2g.lab] => {"changed": true, "msg": "Service httpd not found on host, assuming it will exist on full run"} META: ran handlers META: ran handlers PLAY RECAP *************************************************************************************************************** node1.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 node2.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 剧本-2：在 Ubuntu 系统上安装 Apache Web 服务器这个示例剧本允许你在指定的目标节点上安装 Apache Web 服务器。$ sudo nano /etc/ansible/playbooks/apache-ubuntu.yml --- - hosts: web become: yes name: "Install and Configure Apache Web Server" tasks: - name: "Install Apache Web Server" yum: name: apache2 state: latest - name: "Start the Apache Web Server" service: name: apaceh2 state: started - name: "Enable mod_rewrite module" apache2_module: name: rewrite state: present notify: - start apache handlers: - name: "Ensure Apache Web Server is Running" service: name: apache2 state: restarted enabled: yes 剧本-3：在 Red Hat 系统上安装软件包列表这个示例剧本允许你在指定的目标节点上安装软件包。方法-1：$ sudo nano /etc/ansible/playbooks/packages-redhat.yml --- - hosts: web become: yes name: "Install a List of Packages on Red Hat Based System" tasks: - name: "Installing a list of packages" yum: name: - curl - httpd - nano - htop 方法-2：$ sudo nano /etc/ansible/playbooks/packages-redhat-1.yml --- - hosts: web become: yes name: "Install a List of Packages on Red Hat Based System" tasks: - name: "Installing a list of packages" yum: name={{ item }} state=latest with_items: - curl - httpd - nano - htop 方法-3：使用数组变量$ sudo nano /etc/ansible/playbooks/packages-redhat-2.yml --- - hosts: web become: yes name: "Install a List of Packages on Red Hat Based System" vars: packages: [ 'curl', 'git', 'htop' ] tasks: - name: Install a list of packages yum: name={{ item }} state=latest with_items: "{{ packages }}" 剧本-4：在 Linux 系统上安装更新这个示例剧本允许你在基于 Red Hat 或 Debian 的 Linux 系统上安装更新。$ sudo nano /etc/ansible/playbooks/security-update.yml --- - hosts: web become: yes name: "Install Security Update" tasks: - name: "Installing Security Update on Red Hat Based System" yum: name=* update_cache=yes security=yes state=latest when: ansible_facts['distribution'] == "CentOS" - name: "Installing Security Update on Ubuntu Based System" apt: upgrade=dist update_cache=yes when: ansible_facts['distribution'] == "Ubuntu" via: https://www.2daygeek.com/ansible-playbooks-quick-start-guide-with-examples/作者：Magesh Maruthamuthu 选题：lujun9972 译者：MjSeven 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
之前，我们写了一篇有关 Ansible 安装和配置 的文章。在那个教程中只包含了一些使用方法的示例。如果你是 Ansible 新手，建议你阅读上篇文章。一旦你熟悉了，就可以继续阅读本文了。默认情况下，Ansible 仅使用 5 个并行进程。如果要在多个主机上执行任务，需要通过添加 -f [进程数] 选项来手动设置进程数。什么是 点对点 ad-hoc 命令？点对点命令用于在一个或多个受控节点上自动执行任务。它非常简单，但是不可重用。它使用 /usr/bin/ansible 二进制文件执行所有操作。点对点命令最适合运行一次的任务。例如，如果要检查指定用户是否可用，你可以使用一行命令而无需编写剧本。为什么你要了解点对点命令？点对点命令证明了 Ansible 的简单性和强大功能。从 2.9 版本开始，它支持 3389 个模块，因此你需要了解和学习要定期使用的 Ansible 模块列表。如果你是一个 Ansible 新手，可以借助点对点命令轻松地练习这些模块及参数。你在这里学习到的概念将直接移植到剧本中。点对点命令的一般语法：ansible [模式] -m [模块] -a "[模块选项]" 点对点命令包含四个部分，详细信息如下：部分描述ansible命令模式输入清单或指定组模块运行指定的模块名称模块选项指定模块参数如何使用 Ansible 清单文件如果使用 Ansible 的默认清单文件 /etc/ansible/hosts，你可以直接调用它。否则你可以使用 -i 选项指定 Ansible 清单文件的路径。什么是模式以及如何使用它？Ansible 模式可以代指某个主机、IP 地址、清单组、一组主机或者清单中的所有主机。它允许你对它们运行命令和剧本。模式非常灵活，你可以根据需要使用它们。例如，你可以排除主机、使用通配符或正则表达式等等。下表描述了常见的模式以及用法。但是，如果它不能满足你的需求，你可以在 ansible-playbook 中使用带有 -e 参数的模式中的变量。描述模式目标所有主机all（或 *）对清单中的所有服务器运行 Ansible一台主机host1只针对给定主机运行 Ansible多台主机host1:host2（或 host1,host2）对上述多台主机运行 Ansible一组webservers在 webservers 群组中运行 Ansible多组webservers:dbserverswebservers 中的所有主机加上 dbservers 中的所有主机排除组webservers:!atlantawebservers 中除 atlanta 以外的所有主机组之间的交集webservers:&stagingwebservers 中也在 staging 的任何主机什么是 Ansible 模块，它干了什么？模块，也称为“任务插件”或“库插件”，它是一组代码单元，可以直接或通过剧本在远程主机上执行指定任务。Ansible 在远程目标节点上执行指定模块并收集其返回值。每个模块都支持多个参数，可以满足用户的需求。除少数模块外，几乎所有模块都采用 key=value 参数。你可以一次添加带有空格的多个参数，而 command 或 shell 模块会直接运行你输入的字符串。我们将添加一个包含最常用的“模块选项”参数的表。列出所有可用的模块，运行以下命令：$ ansible-doc -l 运行以下命令来阅读指定模块的文档：$ ansible-doc [模块] 1）如何在 Linux 上使用 Ansible 列出目录的内容可以使用 Ansible command 模块来完成这项操作，如下所示。我们列出了 node1.2g.lab 和 nod2.2g.lab* 远程服务器上 daygeek 用户主目录的内容。$ ansible web -m command -a "ls -lh /home/daygeek" node1.2g.lab | CHANGED | rc=0 >> total 12K drwxr-xr-x. 2 daygeek daygeek 6 Feb 15 2019 Desktop drwxr-xr-x. 2 daygeek daygeek 6 Feb 15 2019 Documents drwxr-xr-x. 2 daygeek daygeek 6 Feb 15 2019 Downloads drwxr-xr-x. 2 daygeek daygeek 6 Feb 15 2019 Music -rwxr-xr-x. 1 daygeek daygeek 159 Mar 4 2019 passwd-up.sh drwxr-xr-x. 2 daygeek daygeek 6 Feb 15 2019 Pictures drwxr-xr-x. 2 daygeek daygeek 6 Feb 15 2019 Public drwxr-xr-x. 2 daygeek daygeek 6 Feb 15 2019 Templates -rwxrwxr-x. 1 daygeek daygeek 138 Mar 10 2019 user-add.sh -rw-rw-r--. 1 daygeek daygeek 18 Mar 10 2019 user-list1.txt drwxr-xr-x. 2 daygeek daygeek 6 Feb 15 2019 Videos node2.2g.lab | CHANGED | rc=0 >> total 0 drwxr-xr-x. 2 daygeek daygeek 6 Nov 9 09:55 Desktop drwxr-xr-x. 2 daygeek daygeek 6 Nov 9 09:55 Documents drwxr-xr-x. 2 daygeek daygeek 6 Nov 9 09:55 Downloads drwxr-xr-x. 2 daygeek daygeek 6 Nov 9 09:55 Music drwxr-xr-x. 2 daygeek daygeek 6 Nov 9 09:55 Pictures drwxr-xr-x. 2 daygeek daygeek 6 Nov 9 09:55 Public drwxr-xr-x. 2 daygeek daygeek 6 Nov 9 09:55 Templates drwxr-xr-x. 2 daygeek daygeek 6 Nov 9 09:55 Videos 2）如何在 Linux 使用 Ansible 管理文件Ansible 的 copy 模块将文件从本地系统复制到远程系统。使用 Ansible command 模块将文件移动或复制到远程计算机。$ ansible web -m copy -a "src=/home/daygeek/backup/CentOS7.2daygeek.com-20191025.tar dest=/home/u1" --become node1.2g.lab | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "checksum": "ad8aadc0542028676b5fe34c94347829f0485a8c", "dest": "/home/u1/CentOS7.2daygeek.com-20191025.tar", "gid": 0, "group": "root", "md5sum": "ee8e778646e00456a4cedd5fd6458cf5", "mode": "0644", "owner": "root", "secontext": "unconfined_u:object_r:user_home_t:s0", "size": 30720, "src": "/home/daygeek/.ansible/tmp/ansible-tmp-1579726582.474042-118186643704900/source", "state": "file", "uid": 0 } node2.2g.lab | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "checksum": "ad8aadc0542028676b5fe34c94347829f0485a8c", "dest": "/home/u1/CentOS7.2daygeek.com-20191025.tar", "gid": 0, "group": "root", "md5sum": "ee8e778646e00456a4cedd5fd6458cf5", "mode": "0644", "owner": "root", "secontext": "unconfined_u:object_r:user_home_t:s0", "size": 30720, "src": "/home/daygeek/.ansible/tmp/ansible-tmp-1579726582.4793239-237229399335623/source", "state": "file", "uid": 0 } 我们可以运行以下命令进行验证：$ ansible web -m command -a "ls -lh /home/u1" --become node1.2g.lab | CHANGED | rc=0 >> total 36K -rw-r--r--. 1 root root 30K Jan 22 14:56 CentOS7.2daygeek.com-20191025.tar -rw-r--r--. 1 root root 25 Dec 9 03:31 user-add.sh node2.2g.lab | CHANGED | rc=0 >> total 36K -rw-r--r--. 1 root root 30K Jan 23 02:26 CentOS7.2daygeek.com-20191025.tar -rw-rw-r--. 1 u1 u1 18 Jan 23 02:21 magi.txt 要将文件从一个位置复制到远程计算机上的另一个位置，使用以下命令：$ ansible web -m command -a "cp /home/u2/magi/ansible-1.txt /home/u2/magi/2g" --become 移动文件，使用以下命令：$ ansible web -m command -a "mv /home/u2/magi/ansible.txt /home/u2/magi/2g" --become 在 u1 用户目录下创建一个名为 ansible.txt 的新文件，运行以下命令：$ ansible web -m file -a "dest=/home/u1/ansible.txt owner=u1 group=u1 state=touch" --become 在 u1 用户目录下创建一个名为 magi 的新目录，运行以下命令：$ ansible web -m file -a "dest=/home/u1/magi mode=755 owner=u2 group=u2 state=directory" --become 将 u1 用户目录下的 ansible.txt* 文件权限更改为 777，运行以下命令：$ ansible web -m file -a "dest=/home/u1/ansible.txt mode=777" --become 删除 u1 用户目录下的 ansible.txt 文件，运行以下命令：$ ansible web -m file -a "dest=/home/u2/magi/ansible-1.txt state=absent" --become 使用以下命令删除目录，它将递归删除指定目录：$ ansible web -m file -a "dest=/home/u2/magi/2g state=absent" --become 3）用户管理你可以使用 Ansible 轻松执行用户管理活动。例如创建、删除用户以及向一个组添加用户。$ ansible all -m user -a "name=foo password=[crypted password here]" 运行以下命令删除用户：$ ansible all -m user -a "name=foo state=absent" 4）管理包使用合适的 Ansible 包管理器模块可以轻松地管理安装包。例如，我们将使用 yum 模块来管理 CentOS 系统上的软件包。安装最新的 Apache（httpd）：$ ansible web -m yum -a "name=httpd state=latest" 卸载 Apache（httpd） 包：$ ansible web -m yum -a "name=httpd state=absent" 5）管理服务使用以下 Ansible 模块命令可以在 Linux 上管理任何服务。停止 httpd 服务：$ ansible web -m service -a "name=httpd state=stopped" 启动 httpd 服务：$ ansible web -m service -a "name=httpd state=started" 重启 httpd 服务：$ ansible web -m service -a "name=httpd state=restarted" via: https://www.2daygeek.com/ansible-ad-hoc-command-quick-start-guide-with-examples/作者：Magesh Maruthamuthu 选题：lujun9972 译者：MjSeven 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
Ansible 自动化工具安装、配置和快速入门指南
市面上有很多自动化工具。我可以举几个例子，例如 Puppet、Chef、CFEngine、Foreman、Katello、Saltstock、Space Walk，它们被许多组织广泛使用。自动化工具可以做什么？自动化工具可以自动执行例行任务，无需人工干预，从而使 Linux 管理员的工作变得更加轻松。这些工具允许用户执行配置管理，应用程序部署和资源调配。为什么喜欢 Ansible？Ansible 是一种无代理的自动化工具，使用 SSH 执行所有任务，但其它工具需要在客户端节点上安装代理。什么是 Ansible？Ansible 是一个开源、易于使用的功能强大的 IT 自动化工具，通过 SSH 在客户端节点上执行任务。它是用 Python 构建的，这是当今世界上最流行、最强大的编程语言之一。两端都需要使用 Python 才能执行所有模块。它可以配置系统、部署软件和安排高级 IT 任务，例如连续部署或零停机滚动更新。你可以通过 Ansible 轻松执行任何类型的自动化任务，包括简单和复杂的任务。在开始之前，你需要了解一些 Ansible 术语，这些术语可以帮助你更好的创建任务。Ansible 如何工作？Ansible 通过在客户端节点上推送称为 ansible 模块的小程序来工作，这些模块临时存储在客户端节点中，通过 JSON 协议与 Ansible 服务器进行通信。Ansible 通过 SSH 运行这些模块，并在完成后将其删除。模块是用 Python 或 Perl 等编写的一些脚本。控制节点，用于控制剧本的全部功能，包括客户端节点（主机）。 控制节点 Control node ：使用 Ansible 在受控节点上执行任务的主机。你可以有多个控制节点，但不能使用 Windows 系统主机当作控制节点。 受控节点 Managed node ：控制节点配置的主机列表。 清单 Inventory ：控制节点管理的一个主机列表，这些节点在 /etc/ansible/hosts 文件中配置。它包含每个节点的信息，比如 IP 地址或其主机名，还可以根据需要对这些节点进行分组。 模块 Module ：每个模块用于执行特定任务，目前有 3387 个模块。 点对点 ad-hoc ：它允许你一次性运行一个任务，它使用 /usr/bin/ansible 二进制文件。 任务 Task ：每个 动作 Play 都有一个任务列表。任务按顺序执行，在受控节点中一次执行一个任务。 剧本 Playbook ：你可以使用剧本同时执行多个任务，而使用点对点只能执行一个任务。剧本使用 YAML 编写，易于阅读。将来，我们将会写一篇有关剧本的文章，你可以用它来执行复杂的任务。测试环境此环境包含一个控制节点（server.2g.lab）和三个受控节点（node1.2g.lab、node2.2g.lab、node3.2g.lab），它们均在虚拟环境中运行，操作系统分别为：System PurposeHostnameIP AddressOSAnsible Control Nodeserver.2g.lab192.168.1.7Manjaro 18Managed Node1node1.2g.lab192.168.1.6CentOS7Managed Node2node2.2g.lab192.168.1.5CentOS8Managed Node3node3.2g.lab192.168.1.9Ubuntu 18.04User: daygeek 前置条件在 Ansible 控制节点和受控节点之间启用无密码身份验证。控制节点必须是 Python 2（2.7 版本） 或 Python 3（3.5 或更高版本）。受控节点必须是 Python 2（2.6 或更高版本） 或 Python 3（3.5 或更高版本）。如果在远程节点上启用了 SELinux，则在 Ansible 中使用任何与复制、文件、模板相关的功能之前，还需要在它们上安装 libselinux-python。如何在控制节点上安装 Ansible对于 Fedora/RHEL 8/CentOS 8 系统，使用 DNF 命令 来安装 Ansible。注意：你需要在 RHEL/CentOS 系统上启用 EPEL 仓库，因为 Ansible 软件包在发行版官方仓库中不可用。$ sudo dnf install ansible 对于 Debian/Ubuntu 系统，使用 APT-GET 命令 或 APT 命令 来安装 Ansible。配置下面的 PPA 以便在 Ubuntu 上安装最新稳定版本的 Ansible。$ sudo apt update $ sudo apt install software-properties-common $ sudo apt-add-repository --yes --update ppa:ansible/ansible $ sudo apt install ansible 对于 Debian 系统，配置以下源列表：$ echo "deb http://ppa.launchpad.net/ansible/ansible/ubuntu trusty main" | sudo tee -a /etc/apt/sources.list.d/ansible.list $ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 93C4A3FD7BB9C367 $ sudo apt update $ sudo apt install ansible 对于 Arch Linux 系统，使用 Pacman 命令 来安装 Ansible：$ sudo pacman -S ansible 对于 RHEL/CentOS 系统，使用 YUM 命令 来安装 Ansible：$ sudo yum install ansible 对于 openSUSE 系统，使用 Zypper 命令 来安装 Ansible：$ sudo zypper install ansible 或者，你可以使用 Python PIP 包管理工具 来安装：$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py $ sudo python get-pip.py $ sudo pip install ansible 在控制节点上检查安装的 Ansible 版本：$ ansible --version ansible 2.9.2 config file = /etc/ansible/ansible.cfg configured module search path = ['/home/daygeek/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3.8/site-packages/ansible executable location = /usr/bin/ansible python version = 3.8.1 (default, Jan 8 2020, 23:09:20) [GCC 9.2.0] 如何在受控节点上安装 Python？使用以下命令在受控节点上安装 python：$ sudo yum install -y python $ sudo dnf install -y python $ sudo zypper install -y python $ sudo pacman -S python $ sudo apt install -y python 如何在 Linux 设置 SSH 密钥身份验证（无密码身份验证）使用以下命令创建 ssh 密钥，然后将其复制到远程计算机。$ ssh-keygen $ ssh-copy-id daygeek@node1.2g.lab $ ssh-copy-id daygeek@node2.2g.lab $ ssh-copy-id daygeek@node3.2g.lab 具体参考这篇文章《在 Linux 上设置 SSH 密钥身份验证（无密码身份验证）》。如何创建 Ansible 主机清单在 /etc/ansible/hosts 文件中添加要管理的节点列表。如果没有该文件，则可以创建一个新文件。以下是我的测试环境的主机清单文件：$ sudo vi /etc/ansible/hosts [web] node1.2g.lab node2.2g.lab [app] node3.2g.lab 让我们看看是否可以使用以下命令查找所有主机。$ ansible all --list-hosts hosts (3): node1.2g.lab node2.2g.lab node3.2g.lab 对单个组运行以下命令：$ ansible web --list-hosts hosts (2): node1.2g.lab node2.2g.lab 如何使用点对点命令执行任务一旦完成主机清单验证检查后，你就可以上路了。干的漂亮！语法：ansible [pattern] -m [module] -a "[module options]" Details: ======== ansible: A command pattern: Enter the entire inventory or a specific group -m [module]: Run the given module name -a [module options]: Specify the module arguments 使用 Ping 模块对主机清单中的所有节点执行 ping 操作：$ ansible all -m ping node3.2g.lab | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } node1.2g.lab | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } node2.2g.lab | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "ping": "pong" } 所有系统都返回了成功，但什么都没有改变，只返回了 pong 代表成功。你可以使用以下命令获取可用模块的列表。$ ansible-doc -l 当前有 3387 个内置模块，它们会随着 Ansible 版本的递增而增加：$ ansible-doc -l | wc -l 3387 使用 command 模块对主机清单中的所有节点执行命令：$ ansible all -m command -a "uptime" node3.2g.lab | CHANGED | rc=0 >> 18:05:07 up 1:21, 3 users, load average: 0.12, 0.06, 0.01 node1.2g.lab | CHANGED | rc=0 >> 06:35:06 up 1:21, 4 users, load average: 0.01, 0.03, 0.05 node2.2g.lab | CHANGED | rc=0 >> 18:05:07 up 1:25, 3 users, load average: 0.01, 0.01, 0.00 对指定组执行 command 模块。检查 app 组主机的内存使用情况：$ ansible app -m command -a "free -m" node3.2g.lab | CHANGED | rc=0 >> total used free shared buff/cache available Mem: 1993 1065 91 6 836 748 Swap: 1425 0 1424 要对 web 组运行 hostnamectl 命令，使用以下格式：$ ansible web -m command -a "hostnamectl" node1.2g.lab | CHANGED | rc=0 >> Static hostname: CentOS7.2daygeek.com Icon name: computer-vm Chassis: vm Machine ID: 002f47b82af248f5be1d67b67e03514c Boot ID: dc38f9b8089d4b2d9304e526e00c6a8f Virtualization: kvm Operating System: CentOS Linux 7 (Core) CPE OS Name: cpe:/o:centos:centos:7 Kernel: Linux 3.10.0-957.el7.x86_64 Architecture: x86-64 node2.2g.lab | CHANGED | rc=0 >> Static hostname: node2.2g.lab Icon name: computer-vm Chassis: vm Machine ID: e39e3a27005d44d8bcbfcab201480b45 Boot ID: 27b46a09dde546da95ace03420fe12cb Virtualization: oracle Operating System: CentOS Linux 8 (Core) CPE OS Name: cpe:/o:centos:centos:8 Kernel: Linux 4.18.0-80.el8.x86_64 Architecture: x86-64 参考：Ansible 文档。via: https://www.2daygeek.com/install-configure-ansible-automation-tool-linux-quick-start-guide/作者：Magesh Maruthamuthu 选题：lujun9972 译者：MjSeven 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
如何在电池充满或低电量时获得电池状态通知
对于类 Unix 用户来说，Linux 笔记本是不错的选择，但它经常会耗尽电池。我试过很多 Linux 操作系统，但没有像 Windows 那样电池寿命长。充电时间长了会对电池造成损害，所以在电池 100% 充满时要拔掉电源线。电池充电或放电时没有默认的应用程序来通知，需要安装第三方应用来通知你。为此，我通常会安装 Battery Monitor，但它已经被废弃，所以我创建了一个 shell 脚本来获取通知。笔记本电池充放电状态可以通过以下两个命令来识别。使用 acpi 命令。$ acpi -b Battery 0: Discharging, 71%, 00:58:39 remaining 使用 upower 命令。$ upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep -w 'state|percentage' | awk '{print $2}' discharging 64% 方法 1：当电池电量高于 95% 或低于 20% 时，用 Shell 脚本发送警报这个脚本在启动时在后台运行，每分钟检查一次电池状态，然后在电池电量超过 95% 或放电时电量低于 20% 时发送通知。警报会直到你的电池电量超过 20% 或低于 95% 时才会停止。$ sudo vi /opt/scripts/battery-status.sh #!/bin/bash while true do battery_level=`acpi -b | grep -P -o '[0-9]+(?=%)'` if [ $battery_level -ge 95 ]; then notify-send "Battery Full" "Level: ${battery_level}%" paplay /usr/share/sounds/freedesktop/stereo/suspend-error.oga elif [ $battery_level -le 20 ]; then notify-send --urgency=CRITICAL "Battery Low" "Level: ${battery_level}%" paplay /usr/share/sounds/freedesktop/stereo/suspend-error.oga fi sleep 60 done 脚本完成后，设置可执行权限：$ sudo chmod +x /opt/scripts/battery-status.sh 最后，将该脚本添加到用户配置文件的底部。对于全局范围来说，你需要在 /etc/profile 文件中添加该脚本。$ vi /home/magi/.profile /opt/scripts/battery-status.sh & 重启你的 Linux 系统来检查这点。$ sudo reboot 方法 2：当电池充电（高于 95%）或放电（低于 20%）时发送通知的 Shell 脚本这个脚本与上面的脚本类似，但它是由交流适配器负责。如果你插上了交流适配器，而且电池的电量超过 95%，它就会发出一个带有声音的通知，但是这个通知不会停止，直到你拔掉交流适配器。如果你拔掉交流适配器，你将永远不会再看到通知，直到你的电池电量下降到 20%。$ sudo vi /opt/scripts/battery-status-1.sh #!/bin/bash while true do export DISPLAY=:0.0 battery_level=`acpi -b | grep -P -o '[0-9]+(?=%)'` if on_ac_power; then if [ $battery_level -ge 95 ]; then notify-send "Battery Full" "Level: ${battery_level}% " paplay /usr/share/sounds/freedesktop/stereo/suspend-error.oga fi else if [ $battery_level -le 20 ]; then notify-send --urgency=CRITICAL "Battery Low" "Level: ${battery_level}%" paplay /usr/share/sounds/freedesktop/stereo/suspend-error.oga fi fi sleep 60 done 脚本完成后，设置执行权限：$ sudo chmod +x /opt/scripts/battery-status-1.sh 最后将脚本添加到用户配置文件的底部。对于全局范围来说，你需要在 /etc/profile 文件中添加该脚本。$ vi /home/magi/.profile /opt/scripts/battery-status-1.sh & 重启系统来检查：$ sudo reboot 参考： stackexchangevia: https://www.2daygeek.com/linux-low-full-charge-discharge-battery-notification/作者：Magesh Maruthamuthu 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
Linux 有很多用于查看图像的 GUI 应用。但我从来没有尝试过用任何命令行应用来查看它。幸运的是，在使用 ImageMagick 工具时，我得到了一个从终端查看图像的命令。命令名是 “display，它是 ImageMagick 工具的一部分。这是一个很好的工具，允许类 UNIX 用户从终端查看图像。此外，我还为此用途得到了另一个很好的工具，叫做 FIM。我们将向你展示如何安装并使用它从 Linux 终端查看图像。这些命令使用系统的 帧缓冲 framebuffer 直接从命令行显示图像。如何使用 display 命令从终端查看图像ImageMagick 是一个自由开源、功能丰富、基于命令行的图像处理工具。它用于创建、编辑、合成或转换位图图像。它可以读取和写入各种格式（超过 200 种）的图像，包括 PNG、JPEG、GIF、PDF、SVG 等。它可以调整图像的大小、镜像、旋转、转换图像、调整图像颜色、应用各种特殊效果等。它支持批处理，允许你一次处理所有图像。如何安装 ImageMagick？ImageMagick 软件包包含在大多数 Linux 发行版的官方仓库中。使用发行版软件包管理器来安装它。**需要注意的是：**确保你的 Linux 系统上已经安装了 “Development Tools” 包，这是安装的前提条件。对于 RHEL/CentOS 6/7 系统，请使用 yum 命令 安装 ImageMagick：$ sudo yum install -y ImageMagick ImageMagick-devel 在 RHEL/CentOS 8 和 Fedora 系统，使用 dnf 命令 安装 ImageMagick：$ sudo dnf install -y ImageMagick ImageMagick-devel 对于 Debian/Ubuntu 系统，使用 apt 命令 或 apt-get 命令 安装 ImageMagick：$ sudo apt-get update $ sudo apt-get install imagemagick 对于 openSUSE 系统，使用 zypper 命令 安装 ImageMagick：$ sudo zypper install -y ImageMagick 要查看任何图像文件，请运行 display 命令，如下所示。你可以按下 Esc/q 按钮关闭图像：$ display bird.jpg 如果你想用指定的窗口大小打开图像，请使用 -geometry 标志：$ display -geometry 1000x600 ~/Downloads/bird.jpg 你也可以通过 display 命令输入图像的位置信息。下面的命令可以从桌面的距顶部 800 像素和据左上角 800 像素处打开图像：$ display -geometry 1000x600+800+800 ~/Downloads/bird.jpg 如果你想用 display 命令调整图像的大小，请使用以下格式：$ display -resize 600x400 ~/Downloads/bird.jp 另外，你也可以使用百分比来调整图片的大小：$ display -resize 50% ~/Downloads/bird.jpg 如何使用 fim 命令从终端查看图像FIM 是一个专门为 Linux 设计的轻量级全局图像查看器。但它并不局限于 Linux，它也可配置在其他操作系统上运行，如 MS-Windows。对于熟悉 VIM 文本编辑器等软件的用户来说，它是高度可定制和可脚本化的图像查看器。它可以全屏显示图像，并且可以使用键盘快捷键轻松控制。它是一款非常轻量级的工具，因为它只依赖于某些库。它可以打开许多文件格式，它可以在以下视频模式下显示图像：使用 Linux 帧缓冲设备图形化。在 X/Xorg 下，使用 SDL 库图形化在 X/Xorg 下，使用 Imlib2 库图形化。使用 AAlib 库，在任意文本控制台中以 ASCII 艺术形式呈现。运行时自动检测或选择正确的视频模式，如果需要，可以在构建前配置时选择加入或去除。FIM 是 “Fbi IMproved” 的缩写，是 Fbi Image Viewer 的复刻版本。FIM 可以很容易地安装在基于 Debian/Ubuntu 的系统上，因为该软件包在发行版的官方仓库中是可用的。对于其他发行版，你可能需要从源码编译它：$ sudo apt install fim 安装完毕后，你可以使用以下命令显示图像：$ fim bird.jpg 你可以使用 -a 选项自动缩放图像：$ fim -a bird.jpg 如果你要打开当前目录中的多个图像文件，请使用通配符将它们全部打开。使用 PageUp/PageDown 键盘快捷键移动到下一张或上一张图像：$ fim -a *.jpg 要以 ASCII 格式查看图像，可以使用 -t 标志：$ fim -t bird.jpg 下面的键盘快捷键可以让你控制图像：PageUp/PageDown：上一张/下一张图片。+/-：放大/缩小a：自动缩放w：适应宽度ESC/q：退出via: https://www.2daygeek.com/how-to-view-display-images-from-linux-terminal/作者：Magesh Maruthamuthu 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
当 Linux 系统连接到 SAN（存储区域网络）后，你需要重新扫描 iSCSI 服务以发现新的 LUN。要做到这一点，你必须向存储团队提供 Linux 主机的 WWN 号和所需的 LUN 大小。这篇文章将帮助你查找 Linux 主机的 WWN 号。当存储团队将 LUN 与给定的 Linux 主机进行了映射，他们将为你提供新的 LUN 详细信息。LUN 在存储术语中被称为 LUN 的串行十六进制。你需要扫描 SCSI 主机来寻找存储团队分配的新 LUN。这可以通过两种方式进行，扫描每个 scsi 主机设备或运行 rescan-scsi-bus.sh 脚本来检测新磁盘。扫描后可以在 /dev/disk/by-id 目录下找到它们。# ll /dev/disk/by-id total 0 lrwxrwxrwx 1 root root 10 Jul 9 17:52 scsi-60a98000486e542d4f5a2f47694d684b -> ../../sdah lrwxrwxrwx 1 root root 9 Jul 9 17:52 scsi-60a98000486e542d4f5a2f47694d684c -> ../../sdw . . lrwxrwxrwx 1 root root 10 Jul 9 17:52 scsi-60a98000486e542d4f5a2f47694d684d -> ../../sdjk lrwxrwxrwx 1 root root 10 Jul 9 17:52 scsi-60a98000486e542d4f5a2f47694d684e -> ../../sdaa lrwxrwxrwx 1 root root 9 Jul 9 17:52 scsi-60a98000486e542d4f5a2f47694d684f -> ../../sdh 另外，如果你已经用 multipath 配置了它们，那么可以用 multipath 命令找到。`multipath 主要是配置到 Oracle 数据库服务器中，以提高性能。# multipath -ll 60a98000486e542d4f5a2f47694d684b dm-37 NETAPP,LUN C-Mode size=512G features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 alua' wp=rw |-+- policy='round-robin 0' prio=50 status=active | |- 1:0:4:18 sdoe 128:416 active ready running | |- 0:0:4:18 sdpq 131:256 active ready running | |- 0:0:5:18 sdsr 135:496 active ready running | `- 1:0:5:18 sdsq 135:480 active ready running `-+- policy='round-robin 0' prio=10 status=enabled |- 1:0:1:18 sdfw 131:32 active ready running |- 1:0:0:18 sdci 69:96 active ready running |- 0:0:1:18 sdbz 68:208 active ready running |- 0:0:0:18 sds 65:32 active ready running |- 1:0:3:18 sdmd 69:336 active ready running |- 1:0:2:18 sdjj 8:464 active ready running |- 0:0:3:34 sdjt 65:368 active ready running `- 0:0:2:34 sdgi 131:224 active ready running 这个过程适用于基于 Red Hat 6.x、7.x 和 8.x（RHEL - Red Hat Enterprise Linux）的系统，如 CentOS 和 Oracle Linux。方法 1：如何使用 /sys 类文件在 Linux 上扫描新的 LUN 和 SCSI 磁盘sysfs 文件系统是一个伪文件系统，它为内核数据结构提供了一个接口。sysfs 下的文件提供了关于设备、内核模块、文件系统和其他内核组件的信息。sysfs 文件系统通常被挂载在 /sys。通常，它是由系统自动挂载的。你可以使用 echo 命令来扫描每个 SCSI 主机设备，如下所示：# echo "- - -" > /sys/class/scsi_host/host[n]/scan 当你运行上面的重新扫描所有的命令时，三个破折号（- – -）指的是通配符选项。这些值如下：# echo "c t l" > /sys/class/scsi_host/host[n]/scan 这里：c：HBA 上的通道t：SCSI 目标 IDl：LUN IDn：HBA 编号运行下面的命令来查找系统中所有的主机总线编号：# ls /sys/class/scsi_host host0 host1 host2 得到主机总线编号后，运行以下命令来发现新的磁盘：# echo "- - -" > /sys/class/scsi_host/host0/scan # echo "- - -" > /sys/class/scsi_host/host1/scan # echo "- - -" > /sys/class/scsi_host/host2/scan 另外，还可以用 for 循环用一条命令进行扫描。# for host in ls /sys/class/scsi_host/;do echo "- - -" >/sys/class/scsi_host/${host}/scan; done 你可以使用文章开头提到的 ls 命令来检查它们。# ls /dev/disk/by-id | grep -i "serial-hex of LUN" 方法 2：如何使用 rescan-scsi-bus.sh 脚本在 Linux 上扫描新的 LUN 和 SCSI 磁盘确保你已经安装了 sg3_utils 包来使用这个脚本。否则，运行以下命令来安装它。对于 RHEL/CentOS 6/7 系统，使用 yum 命令安装 sg3_utils。# yum install -y sg3_utils 对于 RHEL/CentOS 8 和 Fedora 系统，使用 dnf 命令安装 sg3\_utils。# dnf install -y sg3_utils 现在你可以使用 rescan-scsi-bus.sh 脚本重新扫描 LUN。# ./rescan-scsi-bus.sh via: https://www.2daygeek.com/scan-detect-luns-scsi-disks-on-redhat-centos-oracle-linux/作者：Magesh Maruthamuthu 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
如果你的 LVM 不再需要使用某个设备，你可以使用 vgreduce 命令从卷组中删除物理卷。vgreduce 命令可以通过删除物理卷来缩小卷组的容量。但要确保该物理卷没有被任何逻辑卷使用，请使用 pvdisplay 命令查看。如果物理卷仍在使用，你必须使用 pvmove 命令将数据转移到另一个物理卷。数据转移后，它就可以从卷组中删除。最后使用 pvremove 命令删除空物理卷上的 LVM 标签和 LVM 元数据。第一部分：如何在 Linux 中创建/配置 LVM（逻辑卷管理）第二部分：如何在 Linux 中扩展/增加 LVM 大小（逻辑卷调整）第三部分：如何在 Linux 中减少/缩小 LVM 大小（逻辑卷调整）将扩展块移动到现有物理卷上使用 pvs 命令检查是否使用了所需的物理卷（我们计划删除 LVM 中的 /dev/sdc 磁盘）。# pvs -o+pv_used PV VG Fmt Attr PSize PFree Used /dev/sda myvg lvm2 a- 75.00G 14.00G 61.00G /dev/sdb myvg lvm2 a- 50.00G 45.00G 5.00G /dev/sdc myvg lvm2 a- 17.15G 12.15G 5.00G 如果使用了，请检查卷组中的其他物理卷是否有足够的空闲 扩展块 extent 。如果有的话，你可以在需要删除的设备上运行 pvmove 命令。扩展块将被分配到其他设备上。# pvmove /dev/sdc /dev/sdc: Moved: 2.0% … /dev/sdc: Moved: 79.2% … /dev/sdc: Moved: 100.0% 当 pvmove 命令完成后。再次使用 pvs 命令检查物理卷是否有空闲。# pvs -o+pv_used PV VG Fmt Attr PSize PFree Used /dev/sda myvg lvm2 a- 75.00G 1.85G 73.15G /dev/sdb myvg lvm2 a- 50.00G 45.00G 5.00G /dev/sdc myvg lvm2 a- 17.15G 17.15G 0 如果它是空闲的，使用 vgreduce 命令从卷组中删除物理卷 /dev/sdc。# vgreduce myvg /dev/sdc Removed "/dev/sdc" from volume group "vg01" 最后，运行 pvremove 命令从 LVM 配置中删除磁盘。现在，磁盘已经完全从 LVM 中移除，可以用于其他用途。# pvremove /dev/sdc Labels on physical volume "/dev/sdc" successfully wiped. 移动扩展块到新磁盘如果你在卷组中的其他物理卷上没有足够的可用扩展。使用以下步骤添加新的物理卷。向存储组申请新的 LUN。分配完毕后，运行以下命令来在 Linux 中发现新添加的 LUN 或磁盘。# ls /sys/class/scsi_host host0 # echo "- - -" > /sys/class/scsi_host/host0/scan # fdisk -l 操作系统中检测到磁盘后，使用 pvcreate 命令创建物理卷。# pvcreate /dev/sdd Physical volume "/dev/sdd" successfully created 使用以下命令将新的物理卷 /dev/sdd 添加到现有卷组 vg01 中。# vgextend vg01 /dev/sdd Volume group "vg01" successfully extended 现在，使用 pvs 命令查看你添加的新磁盘 /dev/sdd。# pvs -o+pv_used PV VG Fmt Attr PSize PFree Used /dev/sda myvg lvm2 a- 75.00G 14.00G 61.00G /dev/sdb myvg lvm2 a- 50.00G 45.00G 5.00G /dev/sdc myvg lvm2 a- 17.15G 12.15G 5.00G /dev/sdd myvg lvm2 a- 60.00G 60.00G 0 使用 pvmove 命令将数据从 /dev/sdc 移动到 /dev/sdd。# pvmove /dev/sdc /dev/sdd /dev/sdc: Moved: 10.0% … /dev/sdc: Moved: 79.7% … /dev/sdc: Moved: 100.0% 数据移动到新磁盘后。再次使用 pvs 命令检查物理卷是否空闲。# pvs -o+pv_used PV VG Fmt Attr PSize PFree Used /dev/sda myvg lvm2 a- 75.00G 14.00G 61.00G /dev/sdb myvg lvm2 a- 50.00G 45.00G 5.00G /dev/sdc myvg lvm2 a- 17.15G 17.15G 0 /dev/sdd myvg lvm2 a- 60.00G 47.85G 12.15G 如果空闲，使用 vgreduce 命令从卷组中删除物理卷 /dev/sdc。# vgreduce myvg /dev/sdc Removed "/dev/sdc" from volume group "vg01" 最后，运行 pvremove 命令从 LVM 配置中删除磁盘。现在，磁盘已经完全从 LVM 中移除，可以用于其他用途。# pvremove /dev/sdc Labels on physical volume "/dev/sdc" successfully wiped. via: https://www.2daygeek.com/linux-remove-delete-physical-volume-pv-from-volume-group-vg-in-lvm/作者：Magesh Maruthamuthu 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
如何在 Linux 中减少/缩小 LVM 大小（逻辑卷调整）
减少/缩小逻辑卷是数据损坏的最高风险。所以，如果可能的话，尽量避免这种情况，但如果没有其他选择的话，那就继续。缩减 LVM 之前，建议先做一个备份。当你在 LVM 中的磁盘空间耗尽时，你可以通过缩小现有的没有使用全部空间的 LVM，而不是增加一个新的物理磁盘，在卷组上腾出一些空闲空间。需要注意的是： 在 GFS2 或者 XFS 文件系统上不支持缩小。如果你是逻辑卷管理 （LVM） 的新手，我建议你从我们之前的文章开始学习。第一部分：如何在 Linux 中创建/配置 LVM（逻辑卷管理）第二部分：如何在 Linux 中扩展/增加 LVM（逻辑卷调整）减少逻辑卷涉及以下步骤：卸载文件系统检查文件系统是否有任何错误缩小文件系统的大小缩小逻辑卷的大小重新检查文件系统是否存在错误（可选）挂载文件系统检查减少后的文件系统大小比如： 你有一个 100GB 的没有使用全部空间的 LVM，你想把它减少到 80GB，这样 20GB 可以用于其他用途。# df -h /testlvm1 Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg01-lv002 100G 15G 85G 12% /testlvm1 卸载文件系统使用 umount 命令卸载文件系统：# umount /testlvm1 检查文件系统是否有任何错误使用 e2fsck 命令检查文件系统是否有错误：# e2fsck -f /dev/mapper/vg01-lv002 e2fsck 1.42.9 (28-Dec-2013) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/mapper/vg01-lv002: 13/6553600 files (0.0% non-contiguous), 12231854/26212352 blocks 缩小文件系统下面的命令将把 testlvm1 文件系统从 100GB 缩小到 80GB。文件系统大小调整的常用语法（resize2fs）：resize2fs [现有逻辑卷名] [新的文件系统大小] 实际命令如下：# resize2fs /dev/mapper/vg01-lv002 80G resize2fs 1.42.9 (28-Dec-2013) Resizing the filesystem on /dev/mapper/vg01-lv002 to 28321400 (4k) blocks. The filesystem on /dev/mapper/vg01-lv002 is now 28321400 blocks long. 减少逻辑卷 （LVM） 容量现在使用 lvreduce 命令缩小逻辑卷（LVM） 的大小。通过下面的命令， /dev/mapper/vg01-lv002 将把逻辑卷 （LVM） 从 100GB 缩小到 80GB。LVM 缩减 （lvreduce） 的常用语法：lvreduce [新的 LVM 大小] [现有逻辑卷名称] 实际命令如下：# lvreduce -L 80G /dev/mapper/vg01-lv002 WARNING: Reducing active logical volume to 80.00 GiB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce lv002? [y/n]: y Reducing logical volume lv002 to 80.00 GiB Logical volume lv002 successfully resized 可选：检查文件系统是否有错误缩减 LVM 后再次检查文件系统是否有错误：# e2fsck -f /dev/mapper/vg01-lv002 e2fsck 1.42.9 (28-Dec-2013) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/mapper/vg01-lv002: 13/4853600 files (0.0% non-contiguous), 1023185/2021235 blocks 挂载文件系统并检查缩小后的大小最后挂载文件系统，并检查缩小后的文件系统大小。使用 mount 命令挂载逻辑卷：# mount /testlvm1 使用 df 命令检查挂载的卷。# df -h /testlvm1 Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg01-lv002 80G 15G 65G 18% /testlvm1 via: https://www.2daygeek.com/reduce-shrink-decrease-resize-lvm-logical-volume-in-linux/作者：Magesh Maruthamuthu 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
如何在 Linux 中扩展/增加 LVM 大小（逻辑卷调整）
扩展逻辑卷非常简单，只需要很少的步骤，而且不需要卸载某个逻辑卷就可以在线完成。LVM 的主要目的是灵活的磁盘管理，当你需要的时候，可以很方便地调整、扩展和缩小逻辑卷的大小。如果你是逻辑卷管理（LVM） 新手，我建议你从我们之前的文章开始学习。第一部分：如何在 Linux 中创建/配置 LVM（逻辑卷管理）扩展逻辑卷涉及到以下步骤：检查逻辑卷（LV）所在的卷组中是否有足够的未分配磁盘空间如果有，你可以使用这些空间来扩展逻辑卷如果没有，请向系统中添加新的磁盘或 LUN将物理磁盘转换为物理卷（PV）扩展卷组增加逻辑卷大小扩大文件系统检查扩展的文件系统大小如何创建 LVM 物理卷？使用 pvcreate 命令创建 LVM 物理卷。当在操作系统中检测到磁盘，使用 pvcreate 命令初始化 LVM 物理卷：# pvcreate /dev/sdc Physical volume "/dev/sdc" successfully created 请注意：上面的命令将删除磁盘 /dev/sdc 上的所有数据。物理磁盘可以直接添加到 LVM 物理卷中，而不是磁盘分区。使用 pvdisplay 命令来显示你所创建的物理卷：# pvdisplay /dev/sdc "/dev/sdc" is a new physical volume of "10.00 GiB" --- NEW Physical volume --- PV Name /dev/sdc VG Name PV Size 10.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID 69d9dd18-36be-4631-9ebb-78f05fe3217f 如何扩展卷组使用以下命令在现有的卷组（VG）中添加一个新的物理卷：# vgextend vg01 /dev/sdc Volume group "vg01" successfully extended 使用 vgdisplay 命令来显示你所创建的物理卷：# vgdisplay vg01 --- Volume group --- VG Name vg01 System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 1 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 2 Act PV 2 VG Size 14.99 GiB PE Size 4.00 MiB Total PE 3840 Alloc PE / Size 1280 / 4.99 Free PE / Size 2560 / 9.99 GiB VG UUID d17e3c31-e2c9-4f11-809c-94a549bc43b7 如何扩展逻辑卷？使用以下命令增加现有逻辑卷大小。逻辑卷扩展（lvextend）的常用语法：lvextend [要增加的额外空间] [现有逻辑卷名称] 使用下面的命令将现有的逻辑卷增加 10GB：# lvextend -L +10G /dev/mapper/vg01-lv002 Rounding size to boundary between physical extents: 5.90 GiB Size of logical volume vg01/lv002 changed from 5.00 GiB (1280 extents) to 15.00 GiB (3840 extents). Logical volume var successfully resized 使用 PE 大小来扩展逻辑卷：# lvextend -l +2560 /dev/mapper/vg01-lv002 要使用百分比（%）扩展逻辑卷，请使用以下命令：# lvextend -l +40%FREE /dev/mapper/vg01-lv002 现在，逻辑卷已经扩展，你需要调整文件系统的大小以扩展逻辑卷内的空间：对于基于 ext3 和 ext4 的文件系统，运行以下命令：# resize2fs /dev/mapper/vg01-lv002 对于 xfs 文件系统，使用以下命令：# xfs_growfs /dev/mapper/vg01-lv002 使用 df 命令查看文件系统大小：# df -h /lvmtest1 Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg01-lv002 15360M 34M 15326M 4% /lvmtest1 via: https://www.2daygeek.com/extend-increase-resize-lvm-logical-volume-in-linux/作者：Magesh Maruthamuthu 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
逻辑卷管理 Logical Volume Management （LVM）在 Linux 系统中扮演着重要的角色，它可以提高可用性、磁盘 I/O、性能和磁盘管理的能力。LVM 是一种被广泛使用的技术，对于磁盘管理来说，它是非常灵活的。它在物理磁盘和文件系统之间增加了一个额外的层，允许你创建一个逻辑卷而不是物理磁盘。LVM 允许你在需要的时候轻松地调整、扩展和减少逻辑卷的大小。如何创建 LVM 物理卷？你可以使用任何磁盘、RAID 阵列、SAN 磁盘或分区作为 LVM 物理卷 Physical Volume （PV）。让我们想象一下，你已经添加了三个磁盘，它们是 /dev/sdb、/dev/sdc 和 /dev/sdd。运行以下命令来发现 Linux 中新添加的 LUN 或磁盘：# ls /sys/class/scsi_host host0 # echo "- - -" > /sys/class/scsi_host/host0/scan # fdisk -l 创建物理卷 （pvcreate） 的一般语法：pvcreate [物理卷名] 当在系统中检测到磁盘，使用 pvcreate 命令初始化 LVM PV：# pvcreate /dev/sdb /dev/sdc /dev/sdd Physical volume "/dev/sdb" successfully created Physical volume "/dev/sdc" successfully created Physical volume "/dev/sdd" successfully created 请注意：上面的命令将删除给定磁盘 /dev/sdb、/dev/sdc 和 /dev/sdd 上的所有数据。物理磁盘可以直接添加到 LVM PV 中，而不必是磁盘分区。使用 pvdisplay 和 pvs 命令来显示你创建的 PV。pvs 命令显示的是摘要输出，pvdisplay 显示的是 PV 的详细输出：# pvs PV VG Fmt Attr PSize PFree /dev/sdb lvm2 a-- 15.00g 15.00g /dev/sdc lvm2 a-- 15.00g 15.00g /dev/sdd lvm2 a-- 15.00g 15.00g # pvdisplay "/dev/sdb" is a new physical volume of "15.00 GiB" --- NEW Physical volume --- PV Name /dev/sdb VG Name PV Size 15.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID 69d9dd18-36be-4631-9ebb-78f05fe3217f "/dev/sdc" is a new physical volume of "15.00 GiB" --- NEW Physical volume --- PV Name /dev/sdc VG Name PV Size 15.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID a2092b92-af29-4760-8e68-7a201922573b "/dev/sdd" is a new physical volume of "15.00 GiB" --- NEW Physical volume --- PV Name /dev/sdd VG Name PV Size 15.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID d92fa769-e00f-4fd7-b6ed-ecf7224af7faS 如何创建一个卷组 卷组 Volume Group （VG）是 LVM 结构中的另一层。基本上，卷组由你创建的 LVM 物理卷组成，你可以将物理卷添加到现有的卷组中，或者根据需要为物理卷创建新的卷组。创建卷组 （vgcreate） 的一般语法：vgcreate [卷组名] [物理卷名] 使用以下命令将一个新的物理卷添加到新的卷组中：# vgcreate vg01 /dev/sdb /dev/sdc /dev/sdd Volume group "vg01" successfully created 请注意：默认情况下，它使用 4MB 的 物理范围 Physical Extent （PE），但你可以根据你的需要改变它。使用 vgs 和 vgdisplay 命令来显示你创建的 VG 的信息：# vgs vg01 VG #PV #LV #SN Attr VSize VFree vg01 3 0 0 wz--n- 44.99g 44.99g # vgdisplay vg01 --- Volume group --- VG Name vg01 System ID Format lvm2 Metadata Areas 3 Metadata Sequence No 1 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 3 Act PV 3 VG Size 44.99 GiB PE Size 4.00 MiB Total PE 11511 Alloc PE / Size 0 / 0 Free PE / Size 11511 / 44.99 GiB VG UUID d17e3c31-e2c9-4f11-809c-94a549bc43b7 如何扩展卷组如果 VG 没有空间，请使用以下命令将新的物理卷添加到现有卷组中。卷组扩展 （vgextend）的一般语法：vgextend [已有卷组名] [物理卷名] # vgextend vg01 /dev/sde Volume group "vg01" successfully extended 如何以 GB 为单位创建逻辑卷？ 逻辑卷 Logical Volume （LV）是 LVM 结构中的顶层。逻辑卷是由卷组创建的块设备。它作为一个虚拟磁盘分区，可以使用 LVM 命令轻松管理。你可以使用 lvcreate 命令创建一个新的逻辑卷。创建逻辑卷（lvcreate） 的一般语法：lvcreate –n [逻辑卷名] –L [逻辑卷大小] [要创建的 LV 所在的卷组名称] 运行下面的命令，创建一个大小为 10GB 的逻辑卷 lv001：# lvcreate -n lv001 -L 10G vg01 Logical volume "lv001" created 使用 lvs 和 lvdisplay 命令来显示你所创建的 LV 的信息：# lvs /dev/vg01/lvol01 LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert lv001 vg01 mwi-a-m-- 10.00g lv001_mlog 100.00 # lvdisplay /dev/vg01/lv001 --- Logical volume --- LV Path /dev/vg01/lv001 LV Name lv001 VG Name vg01 LV UUID ca307aa4-0866-49b1-8184-004025789e63 LV Write Access read/write LV Creation host, time localhost.localdomain, 2020-09-10 11:43:05 -0700 LV Status available # open 0 LV Size 10.00 GiB Current LE 2560 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:4 如何以 PE 大小创建逻辑卷？或者，你可以使用物理范围（PE）大小创建逻辑卷。如何计算 PE 值？很简单，例如，如果你有一个 10GB 的卷组，那么 PE 大小是多少？默认情况下，它使用 4MB 的物理范围，但可以通过运行 vgdisplay 命令来检查正确的 PE 大小，因为这可以根据需求进行更改。10GB = 10240MB / 4MB （PE 大小） = 2560 PE 用 PE 大小创建逻辑卷 （lvcreate） 的一般语法：lvcreate –n [逻辑卷名] –l [物理扩展 （PE） 大小] [要创建的 LV 所在的卷组名称] 要使用 PE 大小创建 10GB 的逻辑卷，命令如下：# lvcreate -n lv001 -l 2560 vg01 如何创建文件系统在创建有效的文件系统之前，你不能使用逻辑卷。创建文件系统的一般语法：mkfs –t [文件系统类型] /dev/[LV 所在的卷组名称]/[LV 名称] 使用以下命令将逻辑卷 lv001 格式化为 ext4 文件系统：# mkfs -t ext4 /dev/vg01/lv001 对于 xfs 文件系统：# mkfs -t xfs /dev/vg01/lv001 挂载逻辑卷最后，你需要挂载逻辑卷来使用它。确保在 /etc/fstab 中添加一个条目，以便系统启动时自动加载。创建一个目录来挂载逻辑卷：# mkdir /lvmtest 使用挂载命令挂载逻辑卷：# mount /dev/vg01/lv001 /lvmtest 在 /etc/fstab 文件中添加新的逻辑卷详细信息，以便系统启动时自动挂载：# vi /etc/fstab /dev/vg01/lv001 /lvmtest xfs defaults 0 0 使用 df 命令检查新挂载的卷：# df -h /lvmtest Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg01-lv001 15360M 34M 15326M 4% /lvmtest via: https://www.2daygeek.com/create-lvm-storage-logical-volume-manager-in-linux/作者：Magesh Maruthamuthu 选题：lujun9972 译者：geekpi 校对：校对者ID本文由 LCTT 原创编译，Linux中国 荣誉推出