ansible简介
什么是ansible
ansible是一款开源自动化平台,是一个配置管理工具,自动化运维工具,
操作方式是通过ssh服务去连接受管主机
ansible的优点
1.跨平台支持
2.人类可读自动化: ansible提供linux,Windows,unix和网络设备的无代理支持,适用于物理、虚拟、云和容器环
境
3.完美描述应用:playbook
4.轻松管理版本控制:playbook是纯文本,可视作源代码
5.支持动态清单
6.编排可与其他系统轻松集成:puppet、jenkins
7.基础架构即代码
8.减少人为错误
任务、play和playbook设计为具有幂等性,所以在运行playbook时,
如果目标主机处于正确状态,则不会进行任何更改
ansible安装
首先,安装ansible程序的时候,直接yum去安装会出现软件依赖性,所以我们需要同时下载它的依赖性软件,搭建第三方软件仓库,将rpm安装包全部放入然后再使用yum命令安装。
ansible软件包需要在官网直接去下载,其他的两个依赖性python和sshpass可以在pkgs.org网站里下载,
下载完成后搭建好第三方软件仓库,yum -y install ansible 就可以直接完成安装了
查看ansible版本信息
ansible --version
使用setup模块验证python
ansible -m setup localhost | grep ansible_python_version
ansible的部署
构建ansible清单
什么是清单? --> 定义了ansible将要管理的一批主机
如何定义清单
1.静态清单
清单可以定义单个主机或定义主机组,一台主机可以存在于多个主机组
pc1.hehe.com
192.168.31.40
[websever]
sever1.hehe.com
sever.hehe.com
还可以定义嵌套组,来管理多个组
[usersever]
pc1.hehe.com
[websever]
sever1.hehe.com
sever.hehe.com
[severs:children]
usersever
websever
2.通过范围简化主机规格
可以指定主机名称或ip范围或者数字和字母范围
写法:[START:END]
192.168.31.[0:200] #匹配192.168.31.0到192.168.31.200的所有主机
sever[01:10].example.com #匹配sever01.example.com到sever10.example.com的所有主机,此方式不匹配server1,之匹配server01
[a:e].example.com #匹配a.example.com到e.example.com的所有主机
3.默认清单位置:/etc/ansible/hosts #一般不使用,而是自己新建
可以在当前用户家目录中新建一个清单目录如:testlist-inventory ,然后在此目录中建立清单 inventory
4.验证清单
ansible all -i inventory --list-hosts,查看清单中所有主机列表
参数 -i 表示指定需要读取的列表文件,–list-hosts表示列出主机
其他查看命令: ansible ungrouped -i inventory --list-hosts ,列出不在组里的主机名称
ansible usersevers -i inventory --list-hosts ,列出指定组中的主机名称,或者列出指定嵌套组里所有的主机名称
5.动态清单–> 可以从开源社区的脚本中获取
管理ansible配置文件
ansible 的主配置文件的是 /etc/ansible/ansible.cfg 文件,但是在我们的工作中,存在使用不同的清单目录,所以配置文件也会是个人自己配置的,其中会有 “工作目录下的 .ansible.cfg” 和 “工作目录下的ansible.cfg” 这两个文件存在,而当你在工作目录下时,系统对于你的配置文件的检索顺序是,
首先看工作目录下的ansible.cfg;
然后看工作目录下的 .ansible.cfg;
最后看/etc/ansible/ansible.cfg。是这样的一个优先顺序,推荐使用的是工作目录下的ansible.cfg这个配置文件
测试:在当前目录中创建ansible.cfg文件,使用命令:ansible --version查看
退出当前目录再查看
常用设置的配置内容参考 /etc/ansible/ansible.cfg 这个文件中的内容我们来写,常用设置的模块 [defaults] 和 [privilege_escalation] 这两个配置块。
[defaults] 的配置是通用的不需要做什么更改;
[privilege_escalation] 中的配置我们用到的时候可能需要进行一些更改参数。
[privilege_escalation] #权限提升
#become=True #是否开启权限
#become_method=sudo #用身份方式开启权限提升
#become_user=root #权限提升的身份
#become_ask_pass=False #是否开启密码认证
简单的配置内容我们自定义时可以用如下方式写
[defaults]
inventory = ./inventory #配置管理的列表
remote_user = redhat #连接时用到的用户身份
ask_pass = false #是否询问密码,false表示否定,ture表示需要,如果要跳过密码认证需要提前作ssh服务的免密登录
[privilege_escalation]
become = True
become_method = sudo
become_user = root
become_ask_pass = False #是否需要为become_method提示输入密码,默认为false,这里如果需要实现取消密码,需要设置登录用户权限下放
用户的权限下放我们可以写在/etc/sudores.d 目录下,建立对应名称的文件去写权限下放的配置
运行临时命令
ansible的命令运行方式有两种,一种是临时命令 ad_hoc ,不需要编写类似脚本的文件;
另一种是 playbook 方式,编写ansible脚本去运行命令。
临时命令的格式:
ansible host-pattern -m module [-a 'module arguments'] [-i inventory]
host-pattern 表示受管主机或主机组
-m module 表示需要允许的模块,如ping、copy等
[-a 'module arguments'] 表示运行模块需要的参数
[-i inventory] 指定名单列表
测试临时命令运行
使用默认配置我们测试命令:ansible localhost -m ping,查看本机是否运行python模块
临时命令通过模块
命令:ansible-doc -l,#列出所有模块
ansible-doc ping,#查看ping模块帮助文档
模块种类说明:
文件模块 | 说明 |
---|---|
copy | 将本地文件复制到受管主机 |
file | 设置文件的权限和其他属性 |
lineinfile | 确保特定行是否在文件中 |
synchronize | 使用rsync同步内容 |
系统模块: | 说明 |
---|---|
firewalld | 使用firewalld管理任意端口和服务 |
reboot | 重启 |
service | 管理服务 |
user | 添加、删除和管理用户账户 |
Net Tools模块 | 说明 |
---|---|
get_url | 通过http、https、或者ftp下载文件 |
nmcli | 管理网络 |
uri | 与web服务交互 |
使用user模块检测 pc1.xxx.com 主机中是否存在 redhat 用户 ,uid为1000,状态是存在的
ansible userservers -m command -a /usr/bin/hostname,执行命令模块hostname在usersevers组中
显示出的内容看到是两行,第一行的内容是受管主机的状态,第二行是命令结果,如果想要执行结果输出为一行,加上参数 -o
注意: command模块允许执行远程命令,但这些命令不是shell处理,所以无法访问shell环境变量,所以不能执行重定向、传送等操作
如果想使用环境变量等功能就需要使用 shell 模块
可以做个对比来比较一下这两个模块
command模块使用:
使用自己设置的用户列表和配置,还需要给受管主机做免密登录设置
ansible all -m command -a ‘id’
-u参数可以指定登录用户
copy模块使用
在使用普通用户时因为没有相应的权限所以会失败,所以我们在需要在受管主机中对需要操作的用户进行权限下放
[root@pc1]# cat /etc/sudoers.d/student
student ALL=(ALL) NOPASSWD: ALL
然后再使用命令去操作:ansible pc1.xxx.com -m copy -a ‘content=“hello world\n” dest=/etc/motd’ -u redhat --become,复制hello world 到/etc/motd 并且提升redhat用户身份
更改显示的会是黄色,查询成功时绿色,出现错误是红色字体
复制内容成功后去检测
如果再次使用copy模块去更改,会出现SUCCESS,因为已经是正确的内容了,不会再次更改
可以使用 ansible all -m copy -a ‘content=“hello world\n” dest=/etc/motd’ -u redhat --become 对所有受管主机进行统一更改,并且使用的是redhat用户的提升后的身份。