一、Ansible简介与安装
1.1、Ansible介绍与应用场景
Ansible是一款自动化运维工具,基于Python开发,可以实现【批量系统设置】、【批量程序部署】、【批量执行命令】等功能,Ansible的特点如下表:
| 序号 |
Ansible的特点 |
| 1 |
完全基于Python开发,要求python的版本在2.6及其更高。 |
| 2 |
丰富的内置模块,近600个模块完全满足日常功能所需。 |
| 3 |
默认通过SSH协议管理机器(因此,客户端无需任何配置,管理端配置好后即可使用)。 |
| 4 |
目前属于红帽(Redhat)公司,最新版本为Ansible13 |
| 序号 |
Ansible的应用场景 |
| 1 |
代码自动化部署 |
| 2 |
系统管理配置自动化 |
| 3 |
持续交付自动化 |
| 4 |
云计算,大数据平台环境 |
| 5 |
批量任务执行可以写成脚本,不用分发到远程就可以执行 |
| 6 |
支持非root用户管理操作,支持sudo |
| 7 |
使用python编写,维护更简单 |
1.2、Ansible的安装
本文以红帽系的AlmaLinux9.3为例进行操作:
bash
复制代码
#Ansible的安装
#1-先安装第三方的epel源
yum install epel-release
#2-直接安装Ansible(由于Ansible依赖Pyhont环境,且是红帽系系统的一个组成部分,因此推荐用yum命令安装)
yum install ansible -y
1.3、Ansible的指令
Ansible如下表的七个指令中,用的最多的是【ansible】【ansible-playbook】这两个指令,一定要掌握;其他的五个指令属于扩展或高级指令。
| 序号 |
Ansible指令 |
说明 |
| 1 |
ansible |
ansible是指令核心部分,其主要用于执行ad-hoc命令(即:单条命令)。默认后面需要跟主机和选项部分,默认不指定模块时,使用的是command模块。 |
| 2 |
ansible-doc |
该指令用于查看模块信息,常用参数有两个【-l】 和 【-s】: 《1》列出所有已经安装的模块【ansible-doc -l】; 《2》查看某个模块的用法【ansible-doc -s 需查看的命令名称】(如:ansible-doc -s shell) |
| 3 |
ansible-galaxy |
指令用于方便的从https://galaxy.ansible.com/ 站点下载第三方扩展模块; 可以将其形象的理解其类似于centos下的yum、python下的pip或easy_install命令 。 |
| 4 |
ansible-lint |
对playbook的语法进行检查的一个工具。用法是【ansible-lint playbook.yml】 |
| 5 |
ansible-playbook |
该指令是使用最多的指令,其通过读取playbook 文件后,执行相应的动作;接下来会详解。 |
| 6 |
ansible-pull |
ansible的【pull 模式】,这与平常经常用的push模式刚好相反,其适用于以下场景: 《1》有数量巨大的机器需要配置,即使使用非常高的线程还是要花费很多时间 《2》要在一个没有网络连接的机器上运行Anisble,比如在启动之后安装。 |
| 7 |
ansible-vault |
ansible-vault主要应用于配置文件中含有敏感信息,又不希望被人看到,vault可以帮你加密/解密这个配置文件,属高级用法。 主要对于playbooks里比如涉及到配置密码或其他变量时,可以通过该指令加密,这样我们通过cat看到的是一个密码串类的文件,编辑的时候需要输入事先设定的密码才能打开。这种playbook文件在执行时,需要加上 --ask-vault-pass参数,同样需要输入密码后才能正常执行。 |
二、Ansible的架构与运行原理
2.1、Ansible的基础架构
| 序号 |
Ansible的基础架构内容 |
说明 |
| 1 |
ansible |
是核心 |
| 2 |
Core Modules |
【核心模块】:是ansible自带的模块,Ansible模块资源分发到远程节点使其执行特定任务或匹配一个特定的状态。 |
| 3 |
Custom Modules |
【扩展模块】:如果核心模块不足以完成某种功能,可以添加扩展模块。 |
| 4 |
Plugins |
【插件】:完成较小型的任务。辅助模块来完成某个功能。 |
| 5 |
Playbooks |
【ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行】。 例如:安装一个nginx服务,则可以拆分为几个任务放到一个playbook(剧本)中: 《1》下载nginx的安装包; 《2》将事先写好的nginx.conf配置文件下发到目标服务器上; 《3》把nginx服务启动起来。 《4》需要检查端口是否正常开启。 这些步骤可以通过playbook来进行整合,然后通过inventory来下发到想要执行剧本的主机上。 |
| 6 |
Connection Plugins |
【连接插件】:ansible基于连接插件连接到各个主机上,默认是基于SSH连接到目标机器上执行操作的,但是它还支持其他的连接方法,所以需要有连接插件,管理端支持local 、ssh、 paramiko三种方式连接被管理端。 |
| 7 |
Host Inventory |
【主机清单】:定义ansible管理主机的策略; 《1》一般小型环境下只需要在host文件中写入主机的IP地址即可; 《2》中大型环境就需要使用静态inventory或者动态主机清单来生所需要执行的目标主机。 |
2.2、Ansible的任务执行模式
| 序号 |
Ansible的任务执行模式 |
说明 |
| 1 |
命令行模式 |
是单个模块,单条命令的批量执行【常用于测试环境】。 |
| 2 |
playbook |
可以理解为面向对象编程(即:可以将多个想要执行的任务放到一个剧本(playbook)中,当然多个任务在事务逻辑上最好是有上下联系的,通过多个任务可以完成一个总体的目标)【常用于线上生产环境】 |
三、Ansible的主机和组配置
3.1、简单的主机和组
ansible的配置文件在【/etc/ansible】目录下,主要有【ansible.cfg】【hosts】文件;本文重点讲解主机与组定义文件【/etc/ansible/hosts】:
bash
复制代码
#1-中括号中的名字表示组名,可根据需求将庞大的主机分为具有标识的组(如:webservers、dbservers)
#2-主机(hosts)部分可以使用域名、主机名、IP地址表示(在使用域名、主机名时需要该主机能够反解析出相应的IP地址,通常此类配置中多使用IP地址)
#3-未分组的机器需要直接保留在hosts的顶部
coffeemilk.blog.csdn.net
[webservers]
ck.net
ck2.net
[dbservers]
db.ck.net
db.ck2.net
3.2、指定主机范围
可在【/etc/ansible/hosts】文件中,指定主机的范围:
bash
复制代码
[webservers]
www[01:60].ck.net
[dbservers]
db[a:h].ck.net
3.3、主机变量
| 序号 |
Hosts常用到的变量 |
说明 |
| 1 |
ansible_ssh_host |
指定被管理主机的真实IP |
| 2 |
ansible_ssh_port |
指定连接到被管理主机的ssh端口号(默认是22) |
| 3 |
ansible_ssh_user |
ssh连接时默认使用到的用户名 |
| 4 |
ansible_ssh_pass |
ssh连接时用户对应的密码 |
| 5 |
ansible_sudo_pass |
使用sudo连接时用户对应的密码 |
| 6 |
ansible_sudo_exec |
若sudo命令不在默认路径,则需要指定sudo命令路径 |
| 7 |
ansible_ssh_private_key_file |
秘钥文件路径(秘钥文件若不想使用ssh-agent管理时可以使用该选项) |
| 8 |
ansible_shell_type |
目标系统的shell类型(默认是sh) |
| 9 |
ansible_connection |
SSH连接的类型【local】【ssh】【paramiko】(在ansible1.2之前默认是paramiko、后来智能选择,优先使用基于controlpersist的ssh) |
| 10 |
ansible_python_interpreter |
用来指定python解释器的路径,默认是【/usr/bin/python】;同样也可用来指定ruby、perl的路径 |
| 11 |
ansible_*_interpreter |
其他解释器路径,用法与ansible_python_interpreter类似;这里的*可以是ruby或perl等其他语言 |
bash
复制代码
[webservers]
192.168.1.36 http_port=80
192.168.1.37 http_port=80
#还可以修改为如下:
[webservers]
192.168.1.36
192.168.1.37
[webservers:vars]
http_port=80
3.4、主机组变量
bash
复制代码
#主机组可以包含主机组,主机的变量可以通过继承关系,继承到最高等级的组的变量【定义主机组之间的继承关系使用【:children】来表示】
[webhost]
host1
host2
[dbhost]
host2
host3
[allhosts:children]
webhost
dbhost
3.5、主机的默认配置
【/etc/ansible/ansible.cfg】文件中定义了ansible的主机的默认配置部分(如:默认是否需要输入密码、是否开启sudo认证、action_plugins插件的位置、hosts主机组的位置、是否开启log功能、默认端口、key文件位置等等)。
| 序号 |
Ansible主机的默认配置 |
说明 |
| 1 |
#inventory = /etc/ansible/hosts |
表示资源清单inventory文件的位置,资源清单就是一些Ansible需要连接管理的主机列表 |
| 2 |
#library = /usr/share/my_modules/ |
Ansible的操作动作,无论是本地或远程,都使用一小段代码来执行,这小段代码称为模块,这个library参数就是指向存放Ansible模块的目录 |
| 3 |
#module_utils = /usr/share/my_module_utils/ |
|
| 4 |
#remote_tmp = ~/.ansible/tmp |
指定远程执行的路径 |
| 5 |
#local_tmp = ~/.ansible/tmp |
ansible管理节点的执行路径 |
| 6 |
#forks = 5 |
默认情况下Ansible最多能有多少个进程同时工作,默认设置最多5个进程并行处理。具体需要设置多少个,可以根据控制主机的性能和被管理节点的数量来确定。 |
| 7 |
#poll_interval = 15 |
轮询间隔 |
| 8 |
#sudo_user = root |
sudo使用的默认用户 (默认是root) |
| 9 |
#ask_sudo_pass = True |
是否需要用户输入sudo密码 |
| 10 |
#ask_pass = True |
是否需要用户输入连接密码 |
| 11 |
#remote_port = 22 |
指定连接对端节点的管理端口,默认是22,除非设置了特殊的SSH端口,不然这个参数一般是不需要修改的 |
| 12 |
#module_lang = C |
默认模块和系统之间通信的计算机语言(默认是C语言) |
| 13 |
host_key_checking = False |
跳过ssh首次连接提示验证部分,False表示跳过。 |
| 14 |
#timeout = 10 |
连接超时时间 |
| 15 |
#module_name = command |
指定ansible默认的执行模块 |
| 16 |
#nocolor = 1 |
默认ansible会为输出结果加上颜色,用来更好的区分状态信息和失败信息。 如果你想关闭这一功能,可以把'nocolor'设置为'1': |
| 17 |
#private_key_file=/path/to/file.pem |
在使用ssh公钥私钥登录系统时候,使用的密钥路径。 |