ansible 是一款开源自动化平台,是一个配置管理工具,自动化运维工具。
**1)跨平台支持
2)人类可读自动化:ansible提供linux、windows、unix和网络设备的无代理支持,适用于物理、虚拟、云和容器环境。
3)完美描述应用:playbook
4)轻松管理版本控制:playbook是纯文本,可视作源代码。
5)支持动态清单。
6)编排可与其他系统轻松集成:puppet、jenkins。
7)基础架构即代码。
8)减少人为错误。
任务、play和playbook设计为具有幂等性,所以在运行playbook时,如果目标主机处于正确状态,则不会进行任何更改。
1)在rhel7中安装ansible,充当控制节点。
推荐使用pkgs和rpm来查找软件安装包。
首先在百度中搜索pkgs:
进入上面的链接后,接着再次输入验证码,找到安装包的下载网址,复制网址再浏览器中搜索下载即可。
通理下载sshpass安装包。
搭建yum源 解决ansible安装的依赖性问题。接着安装。
yum install *.rpm -y ##安装刚下载的安装包
2)查看ansible版本信息
3)使用setup模块验证python
1)ansible的默认配置目录:/etc/ansible
默认配置文件:/etc/ansible/ansible.cfg
默认清单文件:/etc/ansible/hosts
一般在企业中为防止数据混乱,会建立新的配置文件和清单文件用来储存一类数据
2)构建ansible清单
什么是清单:定义了ansible将要管理的一批主机。
<1>静态清单
每行一个,填写主机名或ip,如:
还可以定义主机组:
[webservers]
rhel7_node2.westos.com
rhel8_node1.westos.com
192.168.43.30
[dbservers]
server1.westos.com
server2.westos.com
192.168.43.30
注意:一台主机可以存在于多个主机组中
验证上面的清单:
ansible all --list-hosts ##查看清单中管理的所有主机
ansible webservers --list-hosts ##查看webservers组中所有的主机
ansible dbservers --list-hosts ##查看dbservers组中所有的主机
ansible ungrouped --list-hosts ##查看清单中不在组里面的主机
<2>定义嵌套组
ansible主机清单可以包含多个主机组构成的组,如:
[webservers]
rhel7_node2.westos.com
rhel8_node1.westos.com
192.168.43.30
[dbservers]
server1.westos.com
server2.westos.com
192.168.43.30
[servers:children]
webservers
dbservers
<3>通过范围简化主机规格
可以指定主机名称或ip范围或者数字和字母范围。
语法:[START:END]
如(1):192.168.43.[0:254] ##匹配192.168.43.0/24 ip的主机
如(2):server[01:10].westos.com ##匹配server01.westos.com到server10.westos.com所有主机,此方式不匹配server1.westos.com,只匹配server01.westos.com。
如(3):[a:c].westos.com ##匹配a.westos.com到c.westos.com的主机。
3)验证清单
ansible all --list-hosts ##查看所有受管主机
ansible webservers --list-hosts ##查看webservers组里面的受管主机
ansible ungrouped --list-hosts ##查看不再分组里面的受管主机
4)默认清单位置:/etc/ansible/hosts ##一般不使用,而是自己新建
5)动态清单:可以从开源社区的脚本中获取
练习(1):
列出上述清单中的所有受管主机:
列出不属于某个组的主机:
列出属于webservers组的主机:
练习(2)
自定义清单
mkdir deploy-inventory ##建立清单目录
vim inventory ##建立清单文件
1)配置ansible
配置文件:
<1> /etc/ansible/ansible.cfg ##基本配置文件,如果找不到其他配置文件,使用这个
<2> ~/.ansible.cfg ##如果存在此配置并且当前工作目录中也,没有ansible.cfg,此文件代替/etc/ansible/ansible.cfg
<3> ./ansible.cfg ##执行ansible命令的目录中如果有ansible.cfg,就用它,不用上面俩个(推荐使用,上面俩个不常用)
<4> 显示使用的配置文件:
2)管理配置文件中的设置:
[defaults] ##部分设置ansible操作的默认值
[privilege_escalation] ##配置ansible如何在受管主机上在执行特权升级
例:
使用sudo进行权力的下放:
使用超级用户编辑文件:
vim /etc/sudoers.d/westos
westos ALL=(ALL) NOPASSWD:ALL
使用临时命令可以快速测试和更改,无需编写playbook
1.格式:ansible host -pattern -m module [-a ‘module arguments’] [-i inventory]
2.检查能否在受管主机上运行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服务交互 |
4.示例:
使用user模块确保westos用户存在于rhel7_node2.westos.com且uid为1000
由于输入密码会造成麻烦,所以倆台主机可以做免密登陆:
ssh-keygen ##生成密钥
ssh-copy-id rhel7_node2.westos.com ##将密钥传到rhel7主机中
现在倆台主机已经可以免密登陆了,再来尝试刚才的命令,就可以直接执行成功了。
在受管主机上运行命令:
-o ##单行显示
注意:command 模块允许执行远程命令,但这些命令不是shell 处理,所以无法访问shell环境变量,所以不能执行重定向,传送等操作。
使用shell和command的区别:
使用command模块执行临时命令:
mkdir deploy-adhoc ##建立deploy-adhoc目录
cd deploy-adhoc ##进入目录
vim ansible.cfg ##建立配置文件
vim inventory ##建立清单文件
通过-u选项使用student进行连接并执行id 命令
注意(1):执行上面俩条命令时,需要在新建的目录中执行,否则结果不会变,即-u student 执行id 后结果和root的id是一致的。
注意(2):通过ansible使用command模块执行临时命令时,localhost和student需先做免密登陆。
免密登陆操作如下:
ssh-keygen ##先生成密钥
ssh-copy-id 主机名/ip ##复制密钥
使用copy模块
1.首先使用student用户,因为student用户没有写权限,会失败
因为/etc/motd仅超级用户可写,其他用户不可写,所以得特权升级。
2.使用特权升级
注意:此处使用特权升级需要先编辑/etc/sudoers.d/student 文件
vim /etc/sudoers.d/student
ansible localhost -m copy -a 'content="hello westos\n" dest=/etc/motd' -u student --become ##become指以root的身份来执行,content指编写的文件,dest指将文件放置的位置
执行结果为黄色是指执行不报错且对文件做了更改,为绿色代表执行结果不报错,但没对文件做任何更改。
查看结果:
使用all参数一次性更改localhost和rhel7_node2.westos.com
同样注意编辑/etc/sudoers.d/student 文件
localhost前面已经编辑过了,这里只要编辑rhel7_node2中的文件。
现在使用all参数一次性更改执行:
ansible all -m copy -a 'content="hello westos\n" dest=/etc/motd' -u student --become
可以看到localhost显示是SUCCESS,rhel7_node2.westos.com显示CHANGED,因为localhost已经处于
正确状态。