要点:
https://blog.csdn.net/weixin_44999385/article/details/96322150之前简单说过ansible的安装及命令解释
ansible介绍:
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
ansible特性:
模块化:调用特定的模块,完成特定任务
有Paramiko,PyYAML,Jinja2(模板语言)三个关键模块
支持自定义模块
基于Python语言实现
部署简单,基于python和SSH(默认已安装),agentless
安全,基于OpenSSH
支持playbook编排任务
幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
无需代理不依赖PKI(无需ssl)
可使用任何编程语言写模块
YAML格式,编排任务,支持丰富的数据结构
较强大的多层解决方案
Ansible的架构
由以下几个核心组件构成:
ansible(主体):ansible的核心程序,提供一个命令行接口给用户对ansible进行管理操作;
Host Inventory(主机清单):为Ansible定义了管理主机的策略。一般小型环境下我们只需要在host文件中写入主机的IP地址即可,但是到了中大型环境我们有可能需要使用静态inventory或者动态主机清单来生成我们所需要执行的目标主机。
Core Modules(核心模块):Ansible执行命令的功能模块,多数为内置的核心模块。
Custom Modules(拓展模块):如何ansible自带的模块无法满足我么你的需求,用户可自定义相应的模块来满足自己的需求。
Connection Plugins(连接插件):模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
Playbook(任务剧本):编排定义ansible任务集的配置文件,由ansible顺序依次执行,通常是JSON格式的* YML文件
API:供第三方程序调用的应用程序编程接口
Ansible工作原理:
管理端支持local 、ssh、zeromq 三种方式连接被管理端,默认使用基于ssh的连接---这部分对应基本架构图中的连接模块;
可以按应用类型等方式进行Host Inventory(主机群)分类,管理节点通过各类模块实现相应的操作---单个模块,单条命令的批量执行,我们可以称之为ad-hoc;
管理节点可以通过playbooks 实现多个task的集合实现一类功能,如web服务的安装部署、数据库服务器的批量备份等。playbooks我们可以简单的理解为,系统通过组合多条ad-hoc操作的配置文件 。
要求:用ansible部署两台以上服务:(另外两台服务器不做任何操作)
1:用yum部署nginx
2:用源码tar包方式部署nginx
两种方式都需要启动服务,开机自启,设置防火墙
ansible的安装来源于epel仓库,因此在安装前需确保安装了正确的epel源。
yum install -y epel
1、准备三台虚拟机
ansible:192.168.1.21----安装ansible
agent1:192.168.1.10
agent2:192.168.1.50
一:安装ansible(yum安装)
# yum list | grep ansible(查看yum安装过ansible没有)
# yum install -y ansible (安装ansible)大约1分钟
# ansible –version (显示ansible的版本)如下图显示则安装成功
[root@ansible ~]# cd /etc/ansible/
[root@ansible ansible]# ls
ansible.cfg hosts roles
ansible.cfg 主配置文件,配置ansible工作特性
hosts 主机清单
roles/ 存放角色的目录
2:更改ansible主配置文件与配置hosts
ansible配置文件
ansible 的配置文件为/etc/ansible/ansible.cfg,ansible 有许多参数,下面我们列出一些常见的参数:
14 inventory = /etc/ansible/hosts #这个参数表示资源清单inventory文件的位置
15 library = /usr/share/ansible #指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以
20 forks = 5 #并发连接数,默认为5
22 sudo_user = root #设置默认执行命令的用户
26 remote_port = 22 #指定连接被管节点的管理端口,默认为22端口,建议修改,能够更加安全 71 host_key_checking = False #设置是否检查SSH主机的密钥,值为True/False。关闭后第一次连接不会提示配置实例
103 timeout = 60 #设置SSH连接的超时时间,单位为秒
111 log_path = /var/log/ansible.log #指定一个存储ansible日志的文件(默认不记录日志)
3:添加ansible客户机组把被控制端的ip分组添加到hosts里;(要求使用不同的安装方式来安装nginx)添加资产
:
4:测试是否能ping通其他需要远程的主机:
配置密钥对(可免密登录):
(1):在ansible配置文件中开启密钥验证:(上面主配置文件已更改)
(2):生成密钥(一直回车)
(3)向其他主机发送自己的公钥:
[root@ansible ansible]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.1.10
[root@ansible ansible]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.1.50
#写入成功后会在192.168.1.10目录~/.ssh/下生成authorized_keys
#验证免密登录是否成功,回车后能登录成功,说明设置成功
ssh root@192.168.1.10
(4)将ansible主机上的阿里云yum源传给远程服务器1.10和1.50:
[root@ansible ansible]#ansible yum -m copy -a "src=/etc/yum.repos.d/CentOS-Base.repo dest=/etc/yum.repos.d/CentOS-Base.repo"
查看一下:
在ansible服务器上安装一台nginx,在nginx官网上下载nginx tar包,
[root@ansible ~]# wget http://nginx.org/download/nginx-1.16.1.tar.gz
[root@ansible ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg nginx-1.16.1.tar.gz
1,在主机192.168.1.50上安装nginx:
编写一个脚本
[root@ansible ~]## cat nginx.sh
#!/bin/bash
yum -y install pcre-devel &> /dev/null
yum -y install openssl-devel &> /dev/null
tar zxf /root/nginx-1.16.1.tar.gz
cd /root/nginx-1.16.1
./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre --with-http_ssl_module --with-http_gzip_static_module &> /dev/null && make &> /dev/null && make install &> /dev/null
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
cd /root/nginx-1.16.1
nginx
echo "$(netstat -anpt | grep 80)"
将下载好的tar包发送给使用tar安装nginx的服务器
[root@ansible ~]# ansible tar -m copy -a "src=/root/nginx-1.16.1.tar.gz dest=/root"
将本机上的编写好的脚本拷贝给需要安装nginx的远程服务器:
[root@ansible ~]# ansible tar -m copy -a "src=/root/nginx.sh dest=/root/"
执行远程主机上的安装脚本:
[root@ansible ~]#ansible test1 -m shell -a "sh /root/nginx.sh"
现在yum部署nginx:
编写依赖脚本:
yum -y install epel-release &> /dev/null
将本机上的编写好的脚本拷贝给需要yum安装nginx的远程服务器:
[root@ansible ~]# ansible yum -m copy -a "src=/root/yum.sh dest=/root"
执行远程主机上的安装脚本:
成功后再执行yum安装:
[root@ansible ~]# ansible yum -m yum -a "name=nginx state=installed"
验证:(在1.10与1.50服务器上查看nginx服务)