文章目录

  • 一:ansible介绍
  • 1.1:Ansible架构图及工作流程
  • 1.2:ansible的优点
  • 二:Ansible基础安装部署
  • 2.1:安装Ansible
  • 2.2:配置主机清单
  • 2.3:配置ssh分发
  • 2.31:生成密钥
  • 2.32:分发密钥到被管理端
  • 2.33:设置免交互ssh-agent代理


一:ansible介绍

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括

  • 连接插件connection plugins:负责和被监控端实现通信;
  • host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
  • 各种模块核心模块、command模块、自定义模块;
  • 借助于插件完成记录日志邮件等功能;
  • playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

1.1:Ansible架构图及工作流程

自动化部署更新架构图 自动化部署运维_自动化部署更新架构图

  • 核心引擎:即图中所看到的Ansible。
  • 核心模块(Core Module):和大多数运维工具一样,将系统和应用提供的能力模块化,一个模块有点像编程中一个功能接口,要使用的时候调用接口并传参就可以了。比如Ansible的service模块,你要保证名为nginx的service处于启动状态,只需要调用service模块,并配置参数name: nginx,state: started即可。
  • 自定义模块(Custom Modules):显而易见,如果Ansible的核心模块满足不了你的需求,你可以添加自定义化的模块。
  • 插件(Plugins):模块功能的补充,如循环插件、变量插件、过滤插件等,也和模块一样支持自定义,这个功能不常用(我没用到过),就不做细说了。
  • 剧本(playbooks):说到这个,先说说Ansible完成任务的两种方式,一种是Ad-Hoc,就是ansible命令,另一种就是Ansible-playbook,也就是ansible-playbook命令。他们的区别就像是Command命令行和Shell Scripts。
  • 连接插件(connectior plugins):Ansible默认是基于SSH连接到目标机器上执行操作的。但是同样的Ansible支持不同的连接方法,要是这样的话就需要连接插件来帮助我们完成连接了。
  • 主机清单(host inventory):为Ansible定义了管理主机的策略。一般小型环境下我们只需要在host文件中写入主机的IP地址即可,但是到了中大型环境我们有可能需要使用动态主机清单来生成我们所需要执行的目标主机(需要云环境支持动态生成Ansible
    host inventory)。

1.2:ansible的优点

(1)、轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;

(2)、批量任务执行可以写成脚本,而且不用分发到远程就可以执行;

(3)、使用python编写,维护更简单,ruby语法过于复杂;

(4)、支持sudo。

二:Ansible基础安装部署

管理端master

被管理端node1

被管理端node2

20.0.0.45

20.0.0.46

20.0.0.47

2.1:安装Ansible

Ansible软件默认不在标准仓库中,需要用到repo源。

1.需在管理机master上安装:

[root@master ~]# systemctl stop firewalld.service 

'安装eprl源'
[root@master ~]# yum -y install epel-release 

'安装ansible'
[root@master ~]# yum install ansible -y

'检查ansible版本'
[root@master ~]# ansible --version
ansible 2.9.13
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]:
  
'树状结构展示文件夹'
[root@master ~]# yum install tree -y

[root@master ~]# tree /etc/ansible/
/etc/ansible/
├── ansible.cfg   'ansible的配置文件'
├── hosts         'ansible的主仓库,用于存储需要管理的远程主机'
└── roles         '角色'

1 directory, 2 files

2.2:配置主机清单

vim /etc/ansible/hosts

[webservers]
20.0.0.46
[mysql]
20.0.0.47

2.3:配置ssh分发

ansible自动化部署条件

  • 1.建议基于ssh密钥方式建立远程连接
  • 2.基于ssh口令方式建立远程连接(不建议)

在部署之前需要保证管理主机和受控主机能够基于ssh密钥的方式进行远程连接

管理主机生成SSH密钥(私钥和公钥),分发公钥到每台受控主机

2.31:生成密钥
'直接生成密钥'
[root@master ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):   '配置密码'
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):                 '输入密码'
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:bsYC8qo6nmKtDXG5lDIfCb6wArGVHfkSdJ8b5DwvODk root@shuai
The key's randomart image is:
+---[RSA 2048]----+
|   .o.. .        |
|   ooo = .       |
|..o .o  B        |
|.+. = .o =       |
|+=.B..E S .      |
|o.Ooo. = .       |
|oo.o. . =        |
|+.+o   +         |
|B*o.             |
+----[SHA256]-----+

'//查看密码对'
[root@master ~]# ls .ssh/
id_rsa    
id_rsa:私钥
id_rsa.pub :公钥
2.32:分发密钥到被管理端
[root@master ~]# ssh-copy-id root@20.0.0.46
[root@master ~]# ssh-copy-id root@20.0.0.47

'被管理端查看'
[root@node1 ~]# ls .ssh/
authorized_keys

'//查看被管理端服务器时间'  'webservers:标签  -a:跟参数'
[root@master ~]# ansible webservers -m command -a 'date'  
[root@master ~]# ansible 20.0.0.46 -m command -a 'date'  '对方ip也可'

Enter passphrase for key '/root/.ssh/id_rsa': 
20.0.0.46 | CHANGED | rc=0 >>
2021年 1月 13日 星期三 10:27:19 CST

'查看另外一台'
[root@master ~]# ansible mysql -m command -a 'date'
Enter passphrase for key '/root/.ssh/id_rsa':     '输入密码'
20.0.0.47 | CHANGED | rc=0 >>
2021年 1月 13日 星期三 10:29:27 CST
2.33:设置免交互ssh-agent代理

ssh 推荐的登录方式是使用私钥登录。但是如果生成私钥的时候,设置了口令(passphrase),每次登录时需要输入口令也很麻烦。可以通过 ssh-agent 来管理私钥,把私钥加载进内存,之后便不用再输入私钥。

通过 ssh-agent bash 或者 eval `ssh-agent`  (这里是shell 的命令替换符)来启动。
[root@master ~]# ssh-agent bash
[root@master ~]# ssh-add
Enter passphrase for /root/.ssh/id_rsa:     '这边输入密码'
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)

'可直接输入不用输入密码'
[root@smaster ~]# ansible webservers -m command -a 'date'
20.0.0.46 | CHANGED | rc=0 >>
2021年 1月 13日 星期三 10:32:42 CST

本次安装部署结束!