常见自动化运维工具:
- Puppet:较为早期的自动化运维工具,现在发展非常成熟,可以批量管理远程服务器,模块丰富,配置复杂,基于Ruby语言编写。是最典型的C/S结构,需要安装服务端和客户端 。相比ansible来说,使用上比较繁琐。
- SaltStack:也是C/S模式,需要安装服务端和客户端,基于Python编写,更适合大型企业使用。
- Chef:是配置管理的开源工具,它能使每个环境与基础设施中的相同配置保持一致。
ansible的出现:
- 自动化运维工具还有很多,比如Cfengine、Capistrano、Fabric、Function、Plain SSH,有各自的优缺点,而ansible就是集结了它们的优点于一身在2012年3月诞生,这也是它的创始人Michael DeHaan打造它的主要原因。
工具 | 优点 | 缺点 |
---|---|---|
ansible | 1、 部署简单,易于上手,提供了强大的文档和社区支持。 2、无需安装客户端,以 SSH 的方式管理主机,适用范围广。 3、YAML 格式的 Playbook 对人类友好,易于维护。 4、剧本的模块库很全面,可快速地开发自己需要的模块。 5、可以轻松地集成多种监控、配置管理等工具。 5、支持 Windows 管理。 |
1、执行过程速度较慢,不适合资源密集型操作。 2、Playbook 可读性较强,但执行结果较难理解。 3、不支持更新已经安装好的软件包,只能重新安装。 |
Puppet | 1、适用性广,支持 Windows 和 Linux 等多种操作系统。 2、支持多种数据存储后端,如 MySQL、PostgreSQL、CouchDB 等。 3、支持多种模块化编写方式,如定义、参数、函数、资源等。 4、集成了 Web 界面,易于操作和管理。 5、支持静态和动态数据分离,更灵活。 |
1、安装配置复杂,需要学习 Ruby 和 Puppet 语言等。 2、Puppet DSL 不如 Ansible Playbook 易读易懂。 3、Puppet agent 的运行需要时间,若网络不稳定或主机较多,执行时间较长。 |
SaltStack | 1、采用高效的异步通信和多线程处理方式,执行速度快。 2、.架构灵活,适合不同规模的应用。 3、扩展性强,可以自定义模块、自定义执行器、自定义状态等。 4、提供了基于事件的自动化管理,可以更好的自动化管理。 |
1、教程和文档相对较少,易学习难度较大。 2、需要熟练掌握命令行和Python脚本编程。 |
Chef | 1、易于配置。 2、成熟稳定,容错性高。 3、兼容性强,包括Windows、Linux、Unix等。 |
1、学习曲线较陡峭,需要花费一定的时间和精力来学习。 .2、Chef的构建和编写需要较高的技术水平,不适合初学者; 3、部署过程较为复杂,需要对系统的运行原理有深入的理解。 4、Chef的运行需要较高的资源和硬件环境,需要投入一定的成本。 |
什么是Ansible?
- Ansible是一款自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
- Ansible基于模块工作,本身没有批量部署的能力。真正具有批量部署的是Ansible所运行的模块,Ansible只是提供一种框架,包括如下:
- 连接插件connection plugins:负责和被监控端实现通信;
- 主机清单host inventory:指定操作的主机,是一个配置文件里面定义监控的主机。
- 各种模块核心模块、command模块、自定义模块。
- 借助于插件完成记录日志邮件等功能;
- playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
- Ansible围绕无代理架构构建,通过OpenSSH或WinRM连接它所管理的主机并且运行任务,方法通常是将称为Ansible模块的小程序推送至这些主机。这些程序用于将系统置于需要的特定状态。在Ansible运行完其任务后,推送的所有模块都会被删除。
- Ansible不需要批准使用任何特殊代理,然后再部署到受管主机上。由于没有代理,也不需要额外的定义安全基础架构,
优点∶
- 跨平台支持:Ansible提供Linux、Windows、UNIX和网络设备的无代理支持,适用于物理、虚拟、云和容器环境。
- 人类可读的自动化:Ansible Playbook采用YAML文本文件编写,易于阅读,有助于确保所有人都能理解它们的用途。
- 完美描述应用:可以通过Ansible Playbook进行每种更改,并描述和记录应用环境的每一个方面。
- 轻松管理版本控制:Ansible Playbook和项目是纯文本。它们可以视作源代码,放在现有版本控制系统中。
- 支持动态清单:可以从外部来源动态更新Ansible管理的计算机列表,随时获取所有受管服务器的当前正确列表,不受基础架构或位置的影响。
- 编排可与其他系统轻松集成:能够利用环境中现有的HP SA、Puppet、Jenkins、红帽卫星和其他系统,并且集成到Ansible工作流中。
特点:
- Ansible的设计宗旨是工具易用,自动化易写易读。所以在创建自动化时我们应追求简单化。
- Ansible自动化语言围绕简单易读的声明性文本文件来构建。正确编写的Ansible Playbook可以清楚地记录你的工作自动化。
- Ansible是一种要求状态引擎。它通过表达你所希望系统处于何种状态来解决如何自动化IT部署的问题。
- Ansible的目标是通过仅执行必要的更改,使系统处于所需的状态。试图将Ansible视为脚本语言并非正确的做法。
基本了解:
- Ansible只需安装到控制节点上,受控机不需要安装Ansible。
- 主控机对受控机需能ssh通信。
对控制节点的要求:
- 控制节点应是Linux或UNIX系统。不支持将Windows用作控制节点,但Windows系统可以是受管主机。
- 控制节点需要安装Python3(版本3.5或以上)或Python2(版本2.7或以上)。
- 需要epel源。
- 关闭防火墙和selinux。
对受控节点的要求:
- 受管主机可能要满足一些要求,具体取决于控制节点连接它们的方式以及它们要运行的模块。
- Linux和UNIX受管主机需安装Python2(版本2.6或以上)或Python3(版本3.5或以上),确保可以运行大部分的ansible模块。
- 关闭防火墙和selinux。
受控机类型:
网络设备:
- Ansible还可以配置受管网络设备,例如路由器和交换机,当收管设备为网络设备时需要用专门为此设计的模块。其中包括对Cisco IOS、IOS XR和NX-OS的支持;Juniper Junos;Arsta EOS;以及基于VyOS的网络设备等。
- 大多数网络设备无法运行Python,所以Ansible在控制节点上运行网络模块,而不是在受管主机上运行。特殊连接方法也用于与网络设备通信,通常使用SSH上的CLI、SSH上的XML或HTTP(S)上的API。
基于Windows的受管主机:
- 大部分专门为Windows受管主机设计的模块需要在受管主机上安装PowerShell 3.0或更高版本,而不是安装Python。
- 受管主机也需要配置PowerShell远程连接。Ansible还要求至少将.NET Framework4.0或更高版本安装在Windows受管主机上。
IP | 角色 | 操作系统 |
---|---|---|
192.168.130.160 | 主控机 | CentOS Linux release 7.5.1804 最小化安装 |
192.168.130.161 | 受控机 | CentOS Linux release 7.5.1804 最小化安装 |
192.168.130.162 | 受控机 | CentOS Linux release 7.5.1804 最小化安装 |
- 所有节点操作。
1.配置yum源。ansible服务需要epel源来安装,大家根据各自的操作系统配置yum源和epel源,我这里配置的是阿里云的源。阿里云源
##配置repo源。
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
yum -y install vim wget
##配置epel源。
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
2.关闭防火墙和selinux。
systemctl disable firewalld
sed -i s#SELINUX=enforcing#SELINUX=disabled# /etc/selinux/config
3.重启服务器。
reboot
1.直接yum安装即可。
yum -y install ansible
2.查看版本。
3.验证,通过使用setup模块验证localhost上的ansible_python_version。
ansible -m setup localhost|grep ansible_python_version
定义清单:
- 在清单文件里定义Ansible将要管理的一批主机,默认的清单文件是/etc/ansible/ansible.cfg。
- 可以在清单文件里定义“组”,可以集中管理,组也可以包含子组,主机也可以是多个组的成员。
- 清单还可以设置应用到它所定义的主机和组的变量。
2种定义方式:
- 静态主机清单,通过文本文件定义,支持多种格式编写,包括INI样式或YAML。
- 动态主机清单,使用外部信息提供程序通过脚本或其他程序来生成。
1.使用IP查看清单文件中是否有某台主机。若没有,则发出警告;若有,则列出该主机IP。
[root@localhost ansible]# ansible 192.168.130.161 --list-hosts
2.使用主机名查看清单文件中是否有主机名为qingjun-3的受控机。
3.企业中,常常定义“主机组”来将受控机集中管理。中括号括里写主机组名称,其后为该组中每一受管主机的主机名或IP地址,每行一个。
4.企业中的微服务架构安装脚本也会使用主机子组嵌套来玩,以每个微服务名称来定义子组名,再来个总的组,其下包含所有子组,最终playbook时引用总组,根据总组寻找子组下的ip并安装微服务。
[root@localhost ansible]# cat inventory.ini
[qingjun1]
192.168.130.161 ansible_port=22 ansible_user=root ansible_password="citms@123"
[qingjun2]
192.168.130.162 ansible_port=22 ansible_user=root ansible_password="citms@123"
[all:children]
qingjun1
qingjun2
5.若清单中含有名称相同的主机和主机组,ansible命令将显示警告并以主机作为其目标。主机组则被忽略。所以我们需要保证清单里的主机名和组名不要重复。
- /etc/ansible/hosts是默认清单文件,现实中不使用,应该自定义一个新的清单文件,并在配置文件里指定新清单文件位置。
1.生成一个新静态清单文件inventory.ini,其里面定义一个组为mq,管理192.168.130.177主机。
2.修改配置文件,将清单文件改成新定义的这个。
3.查看mq主机组,会列出192.168.130.177;查看baimu主机组,发出警告。
ansible all --list-hosts
ansible ungrouped --list-hosts
6.当配置文件里没有修改新定义的清单文件时,还是会用默认的清单文件,此时若想要根据新清单文件来查看主机,可以使用-i参数。
- ansible配置文件可以存在任意路径下,默认安装是/etc/ansible/ansible.cfg文件,也会存在~/.ansible.cfg文件,或者在当前任意目录下创建一个配置文件 ./ansible.cfg,或涉及环境变量ANSIBLE_CONFIG指定的配置文件。
- 若这些文件都存在,则优先级是:环境变量 > 当前目录下的配置文件 > ~/.ansible.cfg配置文件 > /etc/ansible/ansible.cfg配置文件 > 默认配置参数。
- 企业中,一般自定义一个配置文件和清单文件,定义多了繁琐也不好维护。
- Ansible配置文件由几个部分组成,每一部分含有以键值对形式定义的设置。
- 每部分内容以中括号为标题进行分割。
- [defaults]部分设置Ansible操作的默认值。
参数 | 释义 |
---|---|
inventory | 表示资源清单inventory文件的位置。 |
library | 指定存放Ansible模块的目录。 |
remote_tmp | 远程执行的文件路径 |
local_tmp | 管理节点的执行路径 |
forks | 默认开启的并发数。 |
poll_interval | 默认轮询时间间隔 |
sudo_user | 默认sudo用户 |
ask_sudo_pass | 是否需要sudo密码 |
ask_pass | 是否需要用户输入连接密码 |
remote_port | 指定连接对端节点的管理端口,默认是22。 |
module_lang | 默认模块和系统之间通信的计算机语言,默认为C语言。 |
host_key_checking | 首次连接是否检查key认证,默认为False,表示跳过。 |
timeout | 连接超时时间 |
module_name | 默认执行的模块 |
nocolor | 默认ansible会为输出结果加上颜色,用来更好的区分状态信息和失败信息。 关闭功能设置为1。 |
private_key_file | 在使用ssh公钥私钥登录系统时候,使用的密钥路径。 |
roles_path | 默认下载的Roles存放的目录 |
log_path | 执行日志存放目录 |
action_plugins | action插件存放目录 |
callback_plugins | callback插件存放目录 |
connection_plugins | connection插件存放目录 |
lookup_plugins | lookup插件存放目录 |
vars_plugins | vars插件存放目录 |
filter_plugins | filter插件存放目录 |
test_plugins | test插件存放目录 |
strategy_plugins | strategy插件存放目录 |
fact_caching | getfact缓存的主机信息存放方式 |
retry_files_save_path | 错误重启文件存放目录 |
- [privilege_escalation]配置Ansible如何在受管主机上执行特权升级
参数 | 释义 |
---|---|
become=True | 连接后,是否在受控机上切换用户。 |
become_method=sudo | 如何切换用户,也可以指定为su。 |
become_user=root | 要在受控机上切换到的用户,默认为root。 |
become_ask_pass=False | 切换时是否需要提示设置密码,此时设置True。 |
- ansible.cfg配置文件如下,假设我可以通过SSH密钥的身份验证以someuser用户身份连接受管主机,并且someuser可以使用sudo以root用户身份运行命令而不必输入密码。
[defaults]
inventory = ./inventory
remote_user = someuser
ask_pass = false
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
[paramiko_connection]参数 | 释义 |
---|---|
record_host_keys=False | 不记录新主机的key以提升效率 |
pty=False | 禁用sudo功能 |
[ssh_connection]参数 | 释义 |
---|---|
pipelining = False | 管道加速功能,需配和requiretty使用方可生效 |
[selinux]参数 | 释义 |
---|---|
libvirt_lxc_noseclabel = yes | selinux配置 |
- 我们前面说ansible主控机连接到受控机是通过ssh连上去的,是因为在Ansible的配置文件中设置的协议为smart,它会确定使用ssh这个最高效方式。当然也可以不使用默认的smart SSH连接类型,而是利用默认的特殊local连接类型来进行连接。
- local连接类型会忽略配置文件中的remote_user参数设置,直接在本地系统上运行命令。所以在使用特权升级时,它会使用ansible主控机运行ansible命令的用户去运行sudo,而不是remote_user指定用户。
SSH连接主控机:
- 方法一:在清单中创建localhosts组,但这会将它包含在all和ungrouped组中,在执行ansible命令时也会对主控机进行操作。比如我要在受控机上安装某个服务,同样也会在主控机上安装服务,所以这种设置在企业中不适用。
- 方法二:更改用于连接localhost的协议。
- 临时命令可以快速执行单个Ansible任务,不需要将它保存下来供以后再次运行。是简单的在线操作,无需编写playbook即可运行。
- 受管主机连接和特权升级的指令可以在Ansible配置文件中配置,也可以使用临时命令中的选项来定义。使用临时命令中的选项定义时,它们将优先于Ansible配置文件中配置的指令。下表显示了与各项配置文件指令类同的命令行选项。
- 官网连接
ansible host-pattern -m module [-a 'module arguments'] [-i inventory]
参数 | 释义 |
---|---|
host-pattern | 指定在其上运行临时命令的受管主机。它可以是清单中的特定受管主机或主机组。 |
-i | 指定清单文件。 |
-m | 指定使用的模块。 |
-a | 以带引号字符串形式取这些参数的列表。 |
-o | 单行输出。 |
-v | 输出更详细的执行过程信息,-vvv可得到执行过程所有信息。 |
-f | 指定并发线程数,默认5个线程。 |
–private-key | 指定密钥文件。 |
-M | 指定模块存放路径,默认/usr/share/ansible,也可以通过ANSIBLE_LIBRARY设定默认路径。 |
-k | 认证密码 |
-s | 相当于Linux系统下的sudo命令。 |
-t | 输出信息至DIRECTORY目录下,结果文件以远程主机命名。 |
-T | 指定连接远程主机的最大超时,单位是秒。 |
-B | 后台执行命令,超NUM秒后中止正在执行的任务。 |
-P | 定期返回后台任务进度。 |
-U | 使用sudo,相当于LInux下的sudo命令。 |
-c | 指定连接方式,可用选项paramiko(SSH)、ssh、local,local方式常用于crontab和kickstarts。 |
-l | 指定运行主机。 |
–list-hosts | 列出符合条件的主机列表,不执行任何命令。 |
-u | 指定远程主机以USERNAME运行命令。 |
-b | 是否使用特级升权,连接后,是否在受控机上切换用户。 |
–become-method | 如何切换用户,也可以指定为su。 |
–become_user | 要在受控机上切换到的用户。 |
-K | 用户的密码(–sudo时使用)。 |
- 使用临时命令确定清单中的所有受管主机能否运行标准的模块 。
1.配置清单文件。
[root@localhost ansible]# cat inventory.ini
[mq]
192.168.130.162 ansible_port=22 ansible_user=root ansible_password="citms@123"
2.测试受控机是否能ping通,发现由于在本机的~/.ssh/known_hosts文件中并有fingerprint key串,ssh第一次连接的时候会提示输入yes 进行确认,将key字符串加入到 ~/.ssh/known_hosts 文件中。
3.此时有两个解决办法,第一就是先ssh受控机,再ping。
4.第二个方法是修改配置文件参数,host_key_checking = False,随后就可以直接ping。
- 使用临时命令通过模块来执行任务。
1.查看系统上已安装的模块。
ansible-doc -l
ansible-doc ping
- 官网地址
模块类别 | 模块 |
---|---|
文件模块 | copy:将本地文件复制到受管主机。 file:设置文件的权限和其他属性。 lineinfile:确保特定行是否在文件中。 synchronize:使用rsync同步内容。 |
软件包模块 | package:使用操作系统本机的自动检测软件包管理器管理软件包。 yum:使用yum管理软件包。 apt:使用APT管理软件包。 dnf:使用dnf管理软件包。 gem:管理Ruby gem。 pip:从PyPI管理Python软件包。 |
系统模块 | firewalld:使用firewalld管理防火墙。 reboot:重启计算机。 service:管理服务。 user:添加、删除和管理用户帐户。 |
Net Tools模块 | get_url:通过HTTP、HTTPS或FTP下载文件。 nmcli:管理网络。 uri:与Web服务交互. |
基本了解:
- 大部分模块在使用时需要指定相关参数,可以用-a参数指定。若需指定多个参数,以引号括起的空格分隔列表形式提供。
示例:
- 采用user模块在192.168.130.161机器上创建一个用户,名为qingjun,UID为5000。
1.清单文件填写192.168.130.161受控机的相关信息。
2.创建qingjun用户。
ansible 192.168.130.161 -m user -a "name=qingjun uid=5000 state=present"
3.在192.168.130.161机器上查看qingjun用户。
4.删除用户。
ansible 192.168.130.161 -m user -a "name=qingjun uid=5000 state=absent"
- 大多数模块为idempotent,表示可以安全多次运行;如果系统已处于正确的状态,它们不会进行任何操作,也不会报错。
1.给192.168.130.161受控机上创建一个系统账户,名称为baimu,设置为系统用户,不创建家目录,不能登录。
ansible 192.168.130.161 -m user -a "name=baimu system=True create_home=False shell=/sbin/nologin state=present"
2.此时我在主控机上多次执行这个命令,会发现没有报错,也没对受控机做二次修改。
- 这里展示常用的三个模块,作用类似,都是在受控机上执行命令。
模块 | 释义 |
---|---|
shell模块 | 调用的/bin/sh指令执行 |
command模块 | 不调用shell的指令,所以没有bash的环境变量 |
raw模块 | shell类似,区别就是它可以控制没有装python模块的受控机(路由器),或者使用老版本的python模块。 更多的地方建议使用shell和command模块。 |
- command模块允许管理员在受管主机的命令行中运行任意命令。通过-a参数指定要在受控机上执行的命令。
- 命令结果显示两行:
- 第一行是状态报告,显示对其运行临时操作的受管主机名称及操作的结果。
- 第二行是使用Ansible command模块远程执行的命令的输出。
- 注意:command模块无法访问shell环境变量,也不能执行重定向和管道等shell操作。
1.分别对192.168.130.161和192.168.130.162受控机执行hostname命令。
2.单行输出,使用-o参数。
- shell模块可以在临时命令中将要执行的命令作为参数传递给该模块可以访问shell环境变量,也可以使用重定向和管道等操作。
1.分别使用command、shell模块查看linux内置的bash命令,bash命令是需要访问shell环境变量,所以只有使用shell模块才会成功。
- command和shell模块都要求受管主机上安装正常工作的Python,而raw模块可以绕过模块子系统,直接使用远程shell运行命令。
- 在管理无法安装Python的系统(如网络路由器)时,可以利用这个模块。它也可以用于将Python安装到主机上。