ansible--自动化运维工具

一、什么是ansible?

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:

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

Ansible 简单的说是一个配置管理系统(configuration management system)。你只需要可以使用 ssh 访问你的服务器或设备就行。它也不同于其他工具,因为它使用推送的方式,而不是像 puppet 等 那样使用拉取安装agent的方式。你可以将代码部署到任意数量的服务器上!

ansible的特性:

  • 模块化:调用特定的模块,完成特定任务
  • 有Paramiko,PyYAML,Jinja2(模板语言)三个关键模块
  • 支持自定义模块
  • 基于Python语言实现
  • 部署简单,基于python和SSH(默认已安装),agentless,只需在主控端部署 Ansible 环境,被控端无需做任何操作。
  • 安全,基于OpenSSH
  • 支持playbook编排任务,通过 Playbooks 来定制强大的配置、状态管理。
  • 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
  • 无需代理不依赖PKI(无需ssl)
  • 可使用任何编程语言写模块
  • YAML格式,编排任务,支持丰富的数据结构
  • 较强大的多层解决方案
  • 对云计算平台、大数据都有很好的支持。
  • 提供一个功能强大、操作性强的 Web 管理界面和 REST API 接口 —- AWX 平台

ansible架构:
在这里插入图片描述

ansible工作原理:
在这里插入图片描述

ansible主要组成部分功能说明:

  • PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件
  • INVENTORY:Ansible管理主机的清单/etc/anaible/hosts
  • MODULES:Ansible执行命令的功能模块,多数为内置的核心模块,也可自定义,ansible-doc –l 可查看模块
  • PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
  • API: 供第三方程序调用的应用程序编程接口
  • ANSIBLE:组合INVENTORY、 API、 MODULES、PLUGINS的绿框,可以理解为是ansible命令工具,其为核心执行工具

ansible注意事项:

  • 执行ansible的主机一般称为主控端,中控,master或堡垒机
  • 主控端Python版本需要2.6或以上
  • 被控端Python版本小于2.4需要安装python-simplejson
  • 被控端如开启SELinux需要安装libselinux-python
  • windows不能做为主控端

二、实验环境

同之前一样,由于是学习使用的实验环境,所以我们为了方便在这里关闭每台主机的防火墙和selinux

主机 ip
server1(主控端) 172.25.66.1
server2(节点) 172.25.66.2
server3(节点) 172.25.66.3

三、ansible的部署

ansible的配置文件:

  • /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
  • /etc/ansible/hosts 主机清单
  • /etc/ansible/roles/ 存放角色的目录

1.下载ansible所需要的相关rpm包及其依赖包,进行安装
在这里插入图片描述
2.编辑/etc/hosts文件,添加本地解析(因为ansible的连接是通过ssh)
在这里插入图片描述
3.添加普通用户使用ansible

[root@server1 ansible]# useradd devops
[root@server1 ansible]# su - devops 
[devops@server1 ~]$ mkdir ansible
[devops@server1 ~]$ cd ansible/
[devops@server1 ansible]$ ls

4.编辑ansible主配置文件

[devops@server1 ansible]$ vim ansible.cfg
[devops@server1 ansible]$ cat ansible.cfg 
[defaults]


inventory      = inventory		管理主机的清单

5.设置ansible主机

[devops@server1 ansible]$ vim inventory
[devops@server1 ansible]$ cat inventory 
[test]
server2

[db]
server3

[webservers:children]
test
db

6.给两个节点server2和server3同样添加devops用户,并且设置密码

[root@server2 ~]# useradd devops
[root@server2 ~]# passwd devops 
[root@server3 ~]# useradd devops
[root@server3 ~]# passwd devops 

7.设置ssh免密登陆

[devops@server1 ansible]$ ssh-keygen
[devops@server1 ansible]$ ssh-copy-id server2
[devops@server1 ansible]$ ssh-copy-id server3

在这里插入图片描述
在这里插入图片描述
8.测试ansible

  • 查看所有的节点
    在这里插入图片描述

  • 测试所有的ansible节点是否可以ping通
    在这里插入图片描述

四、ansible常用参数及命令

1.常用参数

-m:要执行的模块,默认为command
-a:指定模块的参数
-u:ssh连接的用户名,默认用root,ansible.cfg中可以配置
-b,--become:变成那个用户身份,不提示密码
-k:提示输入ssh登录密码,当使用密码验证的时候用
-s:sudo运行
-U:sudo到哪个用户,默认为root
-K:提示输入sudo密码,当不是NOPASSWD模式时使用
-C:只是测试一下会改变什么内容,不会真正去执行
-c:连接类型(default=smart)
-f:fork多少进程并发处理,默认为5个
-i:指定hosts文件路径,默认default=/etc/ansible/hosts
-I:指定pattern,对已匹配的主机中再过滤一次
-list-host:只打印有哪些主机会执行这个命令,不会实际执行
-M:要执行的模块路径,默认为/usr/share/ansible
-o:压缩输出,摘要输出
--private-key:私钥路径
-T:ssh连接超时时间,默认是10秒
-t:日志输出到该目录,日志文件名以主机命名
-v:显示详细日志

2.常用命令:

ansible server2 -m setup   #产看指定主机server1上的facts变量信息
ansible all -m setup   		#查看指定的所有主机上的facts变量信息
ansible '*' -m setup		#同上

在这里插入图片描述
在这里插入图片描述

ansible-doc -l:列出有哪些可用的模块,按q退出
ansible-doc -l | wc -l:列出有多少个可用的模块
ansible-doc user:查看user模块的帮助文档,按q退出。也可以在最后一行输入/passwd,来过滤与passwd有关的内容
ansible test -a 'df -h'  在test组执行df -h命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、ansible常用模块

1.默认模块command
一般来说如果-m后面没有加模块则魔人使用command模块

2.copy模块

[devops@server1 ansible]$ ansible test -m copy -a 'src=/etc/passwd dest=/tmp/passwd'
src源地址,dest为节点主机目标地址

在这里插入图片描述
然后查看
在这里插入图片描述
3.file模块
查看server2的某个文件权限
在这里插入图片描述
更改权限
在这里插入图片描述
4.yum模块
需要注意的是我们在使用yum的时候普通用户是要有sudo权限的
先设置server2和server3中devops用户的sudo权限

 [root@server2 ~]# vim /etc/sudoers	#保存退出时如果显示权力不够,则加wq!强制保存即可
 91 root    ALL=(ALL)       ALL
 92 
 93 devops  ALL=(ALL)       NOPASSWD: ALL

[root@server3 ~]# vim /etc/sudoers
 91 root    ALL=(ALL)       ALL
 92 
 93 devops  ALL=(ALL)       NOPASSWD: ALL

尝试在server2上安装httpd服务

[devops@server1 ansible]$ ansible test -m yum -a 'name=httpd state=present' -b	一定要加-b,指定sudo,否则回报错

在这里插入图片描述
查看是否下载成功
在这里插入图片描述
如果不愿意加-b去特别指定的话,我们也可以修改主配置文件,给与sudo所需要的权限

[devops@server1 ansible]$ vim ansible.cfg 
[devops@server1 ansible]$ cat ansible.cfg 
[defaults]


inventory      = inventory

[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False

我们去尝试在server2和server3上都安装httpd,不加参数-b

在这里插入图片描述
5.service模块
启动db(server3)的httpd服务
在这里插入图片描述
我们给它写一个默认发布界面,方便我们测试
在这里插入图片描述
6.firewalld防火墙模块
首先,开启防火墙

[devops@server1 ansible]$ ansible db -m service -a 'name=firewalld state=started enabled=true'

测试:
在这里插入图片描述
我们把httpd服务加入防火墙的白名单:
在这里插入图片描述

最后我们还是关闭防火墙

[devops@server1 ansible]$ ansible db -m service -a 'name=firewalld state=stopped enabled=false'

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42446031/article/details/92585795