一、什么是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'