Ansible 介绍 功能 特性 基础架构

Ansible 介绍 功能 特性 基础架构_第1张图片

Ansible是什么?


Ansible 是一个 IT自动化的配置管理工具(比如安装软件,对这些软件做一些基本的配置,或者将软件启动起来,这些都是配置管理工作),自动化主要体现在 Ansible 集成了丰富模块,以及强大的功能组件,可以通过一个命令行完成一系列的提作,进而能减少我们重复性的工作,以提高工作的效率,

Ansible 介绍 功能 特性 基础架构_第2张图片

上面的操作要至少循环10次,如果使用ansible的话那么就能够通过一条命令,将这些服务器都安装上。

 

 

Ansible主要功能


  • 批量执行远程命令,可以对N多台主机同时进行命令的执行。
  • 批量配置软件服务,可以进行自动化的方式配置和管理服务。(可以将配置推送到远程机器)
  • 实现软件开发功能,jumpserver底层使用 ansible 来实现的自动化管理。(可以嵌入到运维开发当中,完成平台的配置管理工作)
  • 编排高级的IT任务,Ansible 的 Playbook 是一门编程语言,可以用来描绘一套 IT 架构。

Ansible的特点


  • 容易学习∶无代理,不像salt既要学客户端与服务端,还需要学习客户端与服务端中间通讯协议(ansible就一个控制端,控制被控制端主机就完事了)
  • 操作灵活∶Ansible有较多的模块,提供了丰富的功能、playbook则提供类似于编程语言的复杂功能
  • 简单易用∶体现在 Ansible 一个命令可以完成很多事情
  • 安全可靠∶因为 Ansible使用了SSH 协议进行通讯,既稳定也安全(TCP+SSH TCP实现了传输的稳定,如果丢包了重传,ssh实现了安全)
  • 移植性高∶可以将写好的 playbook 拷贝至任意机器进行执行
  • 幂等性∶一个任务执行1遍和执行n遍效果一样,不会因为重复执行带来意外情况

描述的状态是A状态,那么一定是A状态,如果是非A状态,那么一执行又是A状态。ansible很危险,当你改变了状态之后,它是不可逆的,没法回退(中途执行到半路按CTRL+C,已经执行的不会回退)

总结


ansible 是一个自动化的"配置管理"工具,应用服务做管理。安装、配置、启动、更新配置

优点∶

  • 批量执行
  • playbook编排IT任务
  • 依入至其他的项目∶jumpserver
  • 简单。容易学习∶功能强大。模块众多

缺点:

  • 幂等性∶每次的描述一种状态后,服务器会按照你所期望的状态去运行;出了问题无法回退;
  • 重新在描述一次状态。然后执行,以实现回退的效果
  • 如果连接主机较多的话,执行速度会比较慢,并发执行

 

 

Ansible基础架构


Ansible 架构中的控制节点、被控制节点、inventroy、ad-hoc、playbook、Connection Protocol是什么?

Ansible 介绍 功能 特性 基础架构_第3张图片

 将主机逻辑划分为组,这就需要主机清单,去定义主机和主机组,可以定义单个主机,和主机组,这样就可以为主机,或者主机组执行不同的操作。(将主机按照逻辑功能划分,这些分组由主机清单实现)

执行什么类型的操作?执行的操作就两种,一种ad-hoc,一种playbook。ad-hoc是单条命令,playbook是编排工具,编排的是ad-hoc,ad-hoc不是shell命令,是python模块,运维ansible是python开发的。(playbook将多个ad-hoc组织在一个文件当中,一次执行多个动作)

执行模块那么怎么推送到被控端?那么需要通过网络推送过去,网络要保证安全和稳定,那么就要使用到tcp和ssh的结合,模块到被控端通过python解释器去翻译这个模块,最终调用本地的shell命令完成最终的执行。

Ansible 介绍 功能 特性 基础架构_第4张图片

 被控端不需要安装ansible组件,有ssh就足够了。

[root@master ~]# ansible localhost -m ping 
localhost | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

 

 

Ansible 简单使用


 怎样使用ansible呢?我们通过一条简单的命令开始认识它吧,命令如下

注:执行如下命令前,需要进行一些配置,如下命令才能正常执行,后文中会对这些操作进行描述,此处先行略过

ansible 192.168.179.99 -m ping

上述命令表示,使用ansible去ping 192.168.179.99这台主机,很容易理解吧!

"ping"是ansible中的一个模块,这个模块的作用就是ping对应的主机,ansible调用ping模块,就相当于我们手动执行ping命令一样,上述命令中的"-m ping"表示调用ping模块,当然,ansible肯定不止这一个模块,它有很多模块,不同的模块可以帮助我们完成不同的工作,你应该已经猜到了,我们在实际使用时,会使用到各种模块,ansible是基于这些模块完成实际任务的。

刚才,我们使用了一个简单的ansible命令作为示例,但是如果想要让上述命令正常执行,则必须同时满足两个最基本的条件,如下:

  • ansible所在的主机可以通过ssh连接到受管主机。
  • 受管主机的IP地址等信息已经添加到ansible的"管理清单"中。

之前说过,ansible不用在受管主机上安装agent,但是它需要依赖ssh,所以,条件一并不难理解。但是,在满足条件一的情况下,还要同时满足条件二,也就是说,即使ansible所在的主机能够通过ssh连接到受管主机,仍然需要将受管主机的IP地址、ssh端口号等信息添加到一个被称作为"清单(Inventory)"的配置文件中,如果对应的主机信息在ansible的"清单"中不存在,那么ansible则无法操作对应主机,后文会详细的介绍怎样配置ansible的"清单"。

好了,基本概念先了解到这里,现在需要动动手了。

一些基础配置


我们首先要做的就是安装ansible。

但是在安装之前,先介绍一下我的演示环境。

我有二台主机,IP地址分别如下

192.168.179.99
192.168.179.100

我将主机192.168.179.100(后文中简称100)作为配置管理主机,所以我们需要在100上安装ansible,剩下的主机作为受管主机,主机100和主机99的的操作系统版本为centos7.x。

我使用yum源的方式安装ansible,因为安装ansible需要epel源。 

 yum install ansible epel* -y

安装完毕,不过别急,我们还需要做一些其他的基本配置,在介绍ansible的概念时,我们说过,如果想要通过ansible管理某主机,还需要将对应主机的信息添加到ansible的"配置清单"中,清单中没有的主机无法通过ansible进行配置管理,现在,我们就来介绍一下ansible的"清单",当安装完ansible以后,ansible会提供一个默认的"清单",这个清单就是/etc/ansible/hosts,打开此文件,你会看到一些配置示例,没错,还是熟悉的配方,还是熟悉的味道,此文件使用的就是INI的配置风格,那么,我们一起来看看怎样进行配置吧。

以我们的演示环境为例,我们想要通过ansible主机管理60主机,所以,最直接的方式就是将它的IP地址写入到/etc/ansible/hosts文件中,配置如下,在/etc/ansible/hosts文件底部写入如下IP

192.168.179.99

就是这么简单,那么,完成上述配置,就能够通过ansible主机管理99这台主机了吗?我们来动手试试,看看会发生什么情况。执行之前的示例命令:ansible 192.168.179.99 -m ping

使用ansible去ping主机99,返回结果如下:

[root@www ~]# ansible 192.168.179.99 -m ping
192.168.179.99 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", 
    "unreachable": true
}

从命令的返回信息中可以看到,99不可达,也就是说,ansible无法通过ssh连接到主机99。

返回上述信息是正常的,因为ansible主机并不知道99这台主机的用户名和密码,所以ansible无法通过ssh连接到它。

所以,我们还需要在清单中,配置10.1.1.60主机的ssh信息,才能够进行正确的进行连接,配置示例如下:

192.168.179.99 ansible_port=22 ansible_user=root ansible_ssh_pass=123456

同时修改 /etc/ansible/ansible.cfg将host_key_checking = False注释打开

[root@www ~]# grep "host_key_checking" /etc/ansible/ansible.cfg 
host_key_checking = False

 修改清单文件,在之前的主机IP后加入ssh的相关配置信息,如上所示:

  • ansible_port 用于配置对应主机上的sshd服务端口号,在实际的生产环境中,各个主机的端口号通常不会使用默认的22号端口,所以用此参数指定对应端口。
  • ansible_user 用于配置连接到对应主机时所使用的用户名称。
  • ansible_ssh_pass 用于配置对应用户的连接密码。

所以,上图中的配置表示,99这台主机的sshd服务监听在22号端口,当ansible通过ssh连接到主机99时,会使用主机99的root用户进行连接,主机99的root用户的密码为123456

好了,主机99的ssh信息已经配置完毕,我们再来尝试一下,看看之前的命令能不能正常执行,如下:

[root@www ~]# ansible 192.168.179.99 -m ping
192.168.179.99 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

可以看到,上述命令已经正常执行了,ansible主机成功的ping通了99,从此以后,我们就可以通过ansible主机,管理99这台主机了。

其实,为了更加方便的使用,ansible还支持对主机添加别名,当主机存在别名时,我们可以通过主机的"别名"管理对应主机。

比如,我们想要将99这台主机的别名命名为test60,那么,我们在配置清单时,可以进行如下配置:

test99 ansible_host=192.168.179.99 ansible_port=22 ansible_user=root ansible_ssh_pass=123456

如上图所示,当为主机配置别名时,主机的IP地址必须使用anible_host关键字进行指明,否则ansible将无法正确的识别对应的主机。主机的别名配置完成后,则可以使用主机的别名管理对应主机,示例如下:

[root@www ~]# ansible test99 -m ping
test99 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

不过,如果你只使用了上述方式配置了主机,则无法通过主机的IP进行管理了,除非你同时使用了别名的方式与IP的方式配置两个主机条目。

上述参数,其实都是为了创建ssh连接所使用的,而说到ssh,我们都知道,创建ssh连接时,可以基于密码进行认证,也可以基于密钥进行认证,而在生产环境中,为了提高安全性,我们通常会基于密钥进行ssh认证,甚至会禁用密码认证,那么,当ansible主机需要与受管主机建立ssh连接时,能够基于密钥进行认证码?必须能的。

其实,在实际的使用环境中,我们通常会在"配置管理机(ansible主机)"中生成密钥,然后通过公钥认证的方式连接到对应的受管主机中。

公钥认证


 那么,我们就在ansible主机中生成密钥,并进行相应的配置吧。首先,生成默认格式的密钥对,私钥与公钥。

#ssh-keygen

然后将生成的公钥加入到10.1.1.60的认证列表

# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

好了,公钥认证的相关操作配置完成,此刻,我们已经可以通过ansible主机免密码连接到主机99中了。

因为配置了密钥认证,所以可以实现免密码创建ssh连接,既然已经能够免密码创建ssh连接,那么在配置"主机清单"时,就没有必要再提供对应主机的用户名与密码了,所以,在完成了密钥认证的相关配置后,我们可以将清单中的配置精简为如下格式。

ansible笔记(1):ansible的基本概念

或者使用别名的格式

ansible笔记(1):ansible的基本概念

当然,如果你的受管服务器中的sshd服务使用了默认的22号端口,上述配置中的ansible_port也是可以省略的,为了方便演示,演示环境中的所有受管主机均使用默认的sshd端口号。

如果你的ansible主机上同时存在多对密钥,有可能需要通过不同的密钥连接不同的受管主机,这个时候,你可以通过ssh-agent帮助我们管理密钥。

如果你不想使用ssh-agent管理密钥,也可以通过ansible_ssh_private_key_file参数,指定连接对应主机时所使用的私钥,由于演示环境中并没有同时使用多对密钥,所以此处不再赘述。

在今后的演示中,默认使用密钥认证的方式连接到对应主机,我会提前配置好各个受管主机的密钥认证,后文中将不再对密钥认证的配置过程进行描述。

好了,说了这么多,我想你应该已经了解了ansible的基本概念,以及ansible的一些最基本的配置,在之后的文章中,我们会徐徐渐进,慢慢的介绍ansible的。

你可能感兴趣的:(Ansible,ansible)