ansible的部署
1. 构建ansible清单
1. 什么是清单?
清单就是ansible所在的主机的文件中列出的所要管理的一批主机,通过这个清单可以看出所管理的主机的信息,而这里所说的文件就是清单。
2.默认清单位置:/etc/ansible/hosts
但是我们一般不使用默认清单,而是自己新建清单。
3. 验证清单
在管理主机之前,我们首先查看一下管理主机所管理的受管主机都有哪些。
用命令: ansible 管理主机的主机名 - -list-hosts
4. 静态清单
我们可以在 /etc/ansible/hosts 清单中添加受管主机
每行一个,填写主机名或ip
如:
www.westos.org
172.25.254.250
列出清单中所有受管主机
ansible all --list-hosts
还可以定义主机组来管理清单:
列出不属于某个组的主机
ansible ungrouped --list-hosts
列出属于某个组的主机
例如:webservers组
ansible webservers --list-hosts
注意:一台主机可以存在于多个主机组。
5. 定义嵌套组
ansible主机清单可以包含多个主机组构成的组
6.通过范围简化主机规格
可以指定主机名称或ip范围或者数字和字母范围
语法:[START:END]
172.25.[0:4].[0:254] #匹配172.25.0.0/24,172.25.1.0/24 ...
server[01:10].example.com #匹配server01.example.com到server20.example.com所有主机,此方式不匹配server1,只匹配server01
[a:c].example.com #匹配a.example.com到c.example.com
7. 自定义清单
前面我们已经说过,我们一般不使用默认清单,而是自己新建清单,这样就可以方便管理我们自己的清单,而不干扰其他用户。
那么,我们怎样去新建一个清单呢?
看具体操作:如下
新建清单所编辑的内容
2.管理ansible配置文件
1. 配置ansible
- 默认配置文件:/etc/ansible/ansible.cfg
但是默认配置文件一般不用,如果找不到其他配置文件,才会使用默认的,所以默认配置文件的优先级是最低的。
**为什么不用默认配置文件呢?**可我们的清单是一个道理,在企业中,有很多ansible用户,方便我们管理自己的,只有这样,在企业中不容易出错。
- ~/.ansible.cfg 当前用户家目录下面的ansible.cfg文件
如果存在此配置文件,并且不管当前工作目录中有没有默认配置文件ansible.cfg,此文件可以替代/etc/ansible/ansible.cfg,它的优先级高于默认的配置文件,如果不存在此文件我们用默认的。 - ./ansible.cfg 新建的配置文件,在新建的清单文件所在的目录下。
执行ansible命令的目录中如果有ansible.cfg,就用它,不使用上面两个(推荐使用,上面两个不常用),这个文件的优先级是最高的。
下面我们对比一下两个配置文件的位置
显示当前使用的配置文件
2. 管理配置文件中的设置
首先我们通过默认的配置文件看一下我们怎样去编写我们新建的自己的配置文件,一般写以下两个部分,一个是默认值[defaults]部分,另一个是权限提升[privilege_escalation]部分。
[defaults] #部分设置ansible操作的默认值
[privilege_escalation] #配置ansible如何在受管主机上执行特权升级
那么,下面我们就来配置一下我们自己的配置文件。
vim ./ansible.cfg
[defaults]
inventory = ./inventory
remote_user = westos #指定登录受管主机的用户,如不指定则使用当前用户名称
ask_pass = false #是否提示输入ssh密码,做了免密就可以设置为false,否则需为true
[privilege_escalation]
become = true #连接到受管主机上是否进行身份切换
become_method = sudo #切换方式,默认为sudo
become_user = root #切换到的用户
become_ask_pass = false #是否需要为become_method提示输入密码,默认为false
免密操作:
##使用sudo进行权限下放
使用超级用户编辑文件:
[root@workstation ~]# vim /etc/sudoers.d/westos
westos ALL=(ALL) NOPASSWD: ALL
测试:
3. 运行临时命令
使用临时命令可以直接在shell中快速测试和更改,无需编写playbook
执行命令的格式:
ansible host-pattern -m module [-a 'module arguments'] [-i inventory]
host #受管主机
-m #指定模块
-a #指定参数,模块中的参数
-i #指定清单
ansible-doc -l #列出所有模块
ansible-doc ping #查看ping模块帮助文档
ansible模块
ansible模块
文件模块: -copy: 将本地文件复制到受管主机
-file: 设置文件的权限和其他属性
-lineinfile: 确保特定行是否在文件中
-synchronize: 使用rsync同步内容
系统模块: -firewalld: 使用firewalld管理任意端口和服务
-reboot: 重启
-service: 管理服务
-user: 添加、删除和管理用户账户
Net Tools模块: -get_url: 通过http、https、或者ftp下载文件
-nmcli: 管理网络
-uri: 与web服务交互
例:使用user模块确保westos用户存在于rhel8_node2.westos.com且uid为1000
ansible -m user -a 'name=westos uid=1000 state=present' rhel8_node2.westos.com
例:
ansible webservers -m command -a /usr/bin/hostname
serverb.lab.example.com | CHANGED | rc=0 >> #状态报告,显示主机名称和操作结果
serverb.lab.example.com #命令输出
ansible webservers -m command -a /usr/bin/hostname -o #加上-o参数,单行显示
serverb.lab.example.com | CHANGED | rc=0 | (stdout) serverb.lab.example.com
'注意:command模块允许执行远程命令,但这些命令不是shell处理,所以无法访问shell环境变量,所以不能执行重定向、传送等操作'
使用shell和command的区别:
ansible localhost -m command -a set
localhost | FAILED | rc=2 >>
[Errno 2] No such file or directory: 'set': 'set'
ansible localhost -m shell -a set
localhost | CHANGED | rc=0 >>
BASH=/bin/sh
使用command模块执行临时命令
ansible localhost -m command -a 'id'
ansible localhost -m command -a 'id' -u student #通过-u选项使用student进行连接并执行id命令
'执行上面两条命令时,需要在新建的目录中执行,否则结果不会变'