189 8069 5689

linux如何使用Ansible让系统管理自动化

这篇文章给大家分享的是有关linux如何使用Ansible让系统管理自动化的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:国际域名空间、网站空间、营销软件、网站建设、恒山网站维护、网站推广。

什么是 Ansible?

Ansible 的网站上将之解释为 “一个超级简单的 IT 自动化引擎,可以自动进行云供给、配置管理、应用部署、服务内部编排,以及其他很多 IT 需求。” 通过在一个集中的位置定义好服务器集合,Ansible 可以在多个服务器上执行相同的任务。

如果你对 Bash 的 for 循环很熟悉,你会发现 Ansible 操作跟这很类似。区别在于 Ansible 是幕等的idempotent。通俗来说就是 Ansible 一般只有在确实会发生改变时才执行所请求的动作。比如,假设你执行一个 Bash 的 for 循环来为多个机器创建用户,像这样子:

for server in serverA serverB serverC; do ssh ${server} "useradd myuser"; done

这会在 serverA、serverB,以及 serverC 上创建 myuser 用户;然而不管这个用户是否存在,每次运行这个 for 循环时都会执行 useradd 命令。一个幕等的系统会首先检查用户是否存在,只有在不存在的情况下才会去创建它。当然,这个例子很简单,但是幕等工具的好处将会随着时间的推移变得越发明显。

Ansible 是如何工作的?

Ansible 会将 Ansible playbooks 转换成通过 SSH 运行的命令,这在管理类 UNIX 环境时有很多优势:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 绝大多数类 UNIX 机器默认都开了 SSH。

  3. 依赖 SSH 意味着远程主机不需要有代理。

  4. 大多数情况下都无需安装额外的软件,Ansible 需要 2.6 或更新版本的 Python。而绝大多数 Linux 发行版默认都安装了这一版本(或者更新版本)的 Python。

  5. Ansible 无需主节点。他可以在任何安装有 Ansible 并能通过 SSH 访问的主机上运行。

  6. 虽然可以在 cron 中运行 Ansible,但默认情况下,Ansible 只会在你明确要求的情况下运行。 

配置 SSH 密钥认证

使用 Ansible 的一种常用方法是配置无需密码的 SSH 密钥登录以方便管理。(可以使用 Ansible Vault 来为密码等敏感信息提供保护,但这不在本文的讨论范围之内)。现在只需要使用下面命令来生成一个 SSH 密钥,如示例 1 所示。

[09:44 user ~]$ ssh-keygenGenerating public/private rsa key pair。Enter file in which to save the key (/home/user/.ssh/id_rsa):Created directory '/home/user/.ssh'。Enter passphrase (empty for no passphrase):Enter same passphrase again:Your identification has been saved in /home/user/.ssh/id_rsa。Your public key has been saved in /home/user/.ssh/id_rsa.pub。The key fingerprint is:SHA256:TpMyzf4qGqXmx3aqZijVv7vO9zGnVXsh7dPbXAZ+LUQ user@user-fedoraThe key's randomart image is:+---[RSA 2048]----+|                 ||                 ||              E  ||       o .   .。||   .  + S    o+。||  . .o * .  .+ooo|| . .+o  o o oo+。*||。.ooo* o。*  .*+|| . o+*BO.o+    .o|+----[SHA256]-----+

示例 1 :生成一个 SSH 密钥

在示例 1 中,直接按下回车键来接受默认值。任何非特权用户都能生成 SSH 密钥,也能安装到远程系统中任何用户的 SSH 的 authorized_keys 文件中。生成密钥后,还需要将之拷贝到远程主机上去,运行下面命令:

ssh-copy-id root@servera

注意:运行 Ansible 本身无需 root 权限;然而如果你使用非 root 用户,你需要为要执行的任务配置合适的 sudo 权限。

输入 servera 的 root 密码,这条命令会将你的 SSH 密钥安装到远程主机上去。安装好 SSH 密钥后,再通过 SSH 登录远程主机就不再需要输入 root 密码了。

安装 Ansible

只需要在示例 1 中生成 SSH 密钥的那台主机上安装 Ansible。若你使用的是 Fedora,输入下面命令:

sudo dnf install ansible -y

若运行的是 CentOS,你需要为 EPEL 仓库配置额外的包:

sudo yum install epel-release -y

然后再使用 yum 来安装 Ansible:

sudo yum install ansible -y

对于基于 Ubuntu 的系统,可以从 PPA 上安装 Ansible:

sudo apt-get install software-properties-common -ysudo apt-add-repository ppa:ansible/ansiblesudo apt-get updatesudo apt-get install ansible -y

若你使用的是 macOS,那么推荐通过 Python PIP 来安装:

sudo pip install ansible

对于其他发行版,请参见 Ansible 安装文档 。

Ansible Inventory

Ansible 使用一个 INI 风格的文件来追踪要管理的服务器,这种文件被称之为库存清单Inventory。默认情况下该文件位于 /etc/ansible/hosts。本文中,我使用示例 2 中所示的 Ansible 库存清单来对所需的主机进行操作(为了简洁起见已经进行了裁剪):

[arch]nextcloudprometheusdesktop1desktop2vm-host15 [fedora]netflix [centos]conanconfluence7-repovm-server1gitlab [ubuntu]trusty-mirrornwnkids-tvmedia-centrenas [satellite]satellite [ocp]lb00ocp_DNSmaster01app01infra01

示例 2 : Ansible 主机文件

每个分组由中括号和组名标识(像这样 [group1] ),是应用于一组服务器的任意组名。一台服务器可以存在于多个组中,没有任何问题。在这个案例中,我有根据操作系统进行的分组(archubuntucentosfedora),也有根据服务器功能进行的分组(ocpsatellite)。Ansible 主机文件可以处理比这复杂的多的情况。详细内容,请参阅 库存清单文档。

运行命令

将你的 SSH 密钥拷贝到库存清单中所有服务器上后,你就可以开始使用 Ansible 了。Ansible 的一项基本功能就是运行特定命令。语法为:

ansible -a "some command"

例如,假设你想升级所有的 CentOS 服务器,可以运行:

ansible centos -a 'yum update -y'

注意:不是必须要根据服务器操作系统来进行分组的。我下面会提到,Ansible Facts 可以用来收集这一信息;然而,若使用 Facts 的话,则运行特定命令会变得很复杂,因此,如果你在管理异构环境的话,那么为了方便起见,我推荐创建一些根据操作系统来划分的组。

这会遍历 centos 组中的所有服务器并安装所有的更新。一个更加有用的命令应该是 Ansible 的 ping 模块了,可以用来验证服务器是否准备好接受命令了:

ansible all -m ping

这会让 Ansible 尝试通过 SSH 登录库存清单中的所有服务器。在示例 3 中可以看到 ping 命令的部分输出结果。

nwn | SUCCESS => {    "changed":false,    "ping":"pong"}media-centre | SUCCESS => {    "changed":false,    "ping":"pong"}nas | SUCCESS => {    "changed":false,    "ping":"pong"}kids-tv | SUCCESS => {    "changed":false,    "ping":"pong"}...

示例 3 :Ansible ping 命令输出

运行指定命令的能力有助于完成快速任务(LCTT 译注:应该指的那种一次性任务),但是如果我想在以后也能以同样的方式运行同样的任务那该怎么办呢?Ansible playbooks 就是用来做这个的。

复杂任务使用 Ansible playbooks

Ansible剧本playbook就是包含 Ansible 指令的 YAML 格式的文件。我这里不打算讲解类似 Roles 和 Templates 这些比较高深的内容。有兴趣的话,请阅读 Ansible 文档。

在前一章节,我推荐你使用 ssh-copy-id 命令来传递你的 SSH 密钥;然而,本文关注于如何以一种一致的、可重复性的方式来完成任务。示例 4 演示了一种以冥等的方式,即使 SSH 密钥已经存在于目标主机上也能保证正确性的实现方法。

---- hosts:all  gather_facts:false  vars:    ssh_key:'/root/playbooks/files/laptop_ssh_key'  tasks:    - name:copy ssh key      authorized_key:        key:"{{ lookup('file',ssh_key) }}"        user:root

示例 4:Ansible 剧本 “pushsshkeys.yaml”

- hosts: 行标识了这个剧本应该在那个主机组上执行。在这个例子中,它会检查库存清单里的所有主机。

gather_facts: 行指明 Ansible 是否去搜索每个主机的详细信息。我稍后会做一次更详细的检查。现在为了节省时间,我们设置 gather_factsfalse

vars: 部分,顾名思义,就是用来定义剧本中所用变量的。在示例 4 的这个简短剧本中其实不是必要的,但是按惯例我们还是设置了一个变量。

***由 tasks: 标注的这个部分,是存放主体指令的地方。每个任务都有一个 -name:。Ansbile 在运行剧本时会显示这个名字。

authorized_key: 是剧本所使用 Ansible 模块的名字。可以通过命令 ansible-doc -a 来查询 Ansible 模块的相关信息; 不过通过网络浏览器查看 文档  可能更方便一些。authorized_key 模块 有很多很好的例子可以参考。要运行示例 4 中的剧本,只要运行 ansible-playbook 命令就行了:

ansible-playbook push_ssh_keys.yaml

如果是***次添加 SSH 密钥,SSH 会提示你输入 root 用户的密码。

现在 SSH 密钥已经传输到服务器中去了,可以来做点有趣的事了。

使用 Ansible 收集信息

Ansible 能够收集目标系统的各种信息。如果你的主机数量很多,那它会特别的耗时。按我的经验,每台主机大概要花个 1 到 2 秒钟,甚至更长时间;然而有时收集信息是有好处的。考虑下面这个剧本,它会禁止 root 用户通过密码远程登录系统:

---- hosts:all  gather_facts:true  vars:  tasks:    - name:Enabling ssh-key only root access      lineinfile:        dest:/etc/ssh/sshd_config        regexp:'^PermitRootLogin'        line:'PermitRootLogin without-password'      notify:        - restart_sshd        - restart_ssh   handlers:    - name:restart_sshd      service:        name:sshd        state:restarted        enabled:true      when:ansible_distribution == 'RedHat'    - name:restart_ssh      service:        name:ssh        state:restarted        enabled:true      when:ansible_distribution == 'Debian'

示例 5:锁定 root 的 SSH 访问

在示例 5 中 sshd_config 文件的修改是有条件  的,只有在找到匹配的发行版的情况下才会执行。在这个案例中,基于 Red Hat 的发行版与基于 Debian 的发行版对 SSH  服务的命名是不一样的,这也是使用条件语句的目的所在。虽然也有其他的方法可以达到相同的效果,但这个例子很好演示了 Ansible  信息的作用。若你想查看 Ansible 默认收集的所有信息,可以在本地运行 setup 模块:

ansible localhost -m setup |less

Ansible 收集的所有信息都能用来做判断,就跟示例 4 中 vars: 部分所演示的一样。所不同的是,Ansible 信息被看成是内置变量,无需由系统管理员定义。

感谢各位的阅读!关于“linux如何使用Ansible让系统管理自动化”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!


当前标题:linux如何使用Ansible让系统管理自动化
分享地址:http://cdxtjz.com/article/igeocd.html

其他资讯