文章目录
- 一、ansible简介
- 1.定义
- 2. 优点
- 3. 安装
- 二、部署ansible
- 1. ansible清单基础知识
- 2.构建ansible清单
- 3. 管理ansible配置文件
- 三、ansible模块
- 四、 运行临时命令(ad-hoc)
- 1. 格式
- 2. 检查能否在受管主机上运行python模块
- 3. 使用临时命令通过模块执行任务
- 3.1 使用user模块
- 3.2 使用command模块
- 3.3 使用copy模块
- 3.4 使用命令更改Apache默认发布页面
实验环境:RHEL8
ansible管理主机:主机名为workstation,IP为192.168.1.104
受管主机1:主机名为servera.lab.example.com,IP为192.168.1.114
受管主机2:主机名为serverb.lab.example.com,IP为192.168.1.116
一、ansible简介
1.定义
- ansible是一款开源自动化平台,是一个配置管理工具,自动化运维工具,可以用来批量管理多台机器。
- ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
2. 优点
- 跨平台支持
- 人类可读自动化: ansible提供linux,Windows,unix和网络设备的无代理支持,适用于物理、虚拟、云和容器环境
- 完美描述应用:playbook
- 轻松管理版本控制:playbook是纯文本,可视作源代码
- 支持动态清单
- 编排可与其他系统轻松集成:puppet、jenkins
- 基础架构即代码
- 减少人为错误
注意:任务、play和playbook设计为具有幂等性,所以在运行playbook时,如果目标主机处于正确状态,则不会进行任何更改。
3. 安装
- 在服务端主机上安装ansible,充当控制节点:yum install -y ansible
- 查看ansible版本信息:ansible --version
- 使用setup模块验证python:ansible -m setup localhost | grep ansible_python_version
setup模块主要用于获取主机信息
二、部署ansible
1. ansible清单基础知识
清单:定义了ansible将要管理的一批主机
(1)静态清单: 每行一个,填写主机名或ip;也可以定义主机组。注意:一台主机可以存在于多个主机组
www.westos.org #主机名
172.25.254.250 #IP
###################主机组###################
[webservers]
server1.westos.org
server2.westos.org
172.25.0.1
[dbservers]
node1.westos.org
node1.westos.org
(2)定义嵌套组:ansible主机清单可以包含多个主机组构成的组
[webservers]
server1.westos.org
server2.westos.org
172.25.0.1
[dbservers]
node1.westos.org
node1.westos.org
[servers:children] #“servers”可以是自定义名称,“children”是规定写法,表示父子级关系
webservers
dbservers
(3)通过范围简化主机规格:可以 指定主机名称或ip范围或者数字和字母范围
语法:[START:END]
写法 | 含义 |
172.25.[0:4].[0:254] | 匹配172.25.0.0/24,172.25.1.0/24 …172.25.4.0/24 |
server[01:10].example.com | 匹配server01.example.com到server10.example.com所有主机,此方式不匹配server1,之匹配server01 |
[a:c].example.com | 匹配a.example.com到c.example.com |
(4)验证清单 : 查看受管主机 ansible workstation --list-hosts
(5)默认清单位置:/etc/ansible/hosts
(6)动态清单:可以从开源社区的脚本中获取
2.构建ansible清单
- 默认清单:在默认清单位置【/etc/ansible/hosts】编写受管主机即可
注意:为了便于管理一般不使用,而是采用自定义方式新建清单
(1)列出清单中所有受管主机:ansible all --list-hosts
ansible ungrouped --list-hosts
ansible webservers --list-hosts - 自定义清单:
(1)建立清单目录:mkdir deploy-inventory
(2)在清单目录里面自定义清单:vim inventory
(3)列出自定义清单的受管主机:ansible all -i inventory --list-hosts
(4)列出不属于组的受管主机:ansible ungrouped -i inventory --list-hosts
(5)列出属于dbservers组的受管主机:ansible dbservers -i inventory v–list-hosts
3. 管理ansible配置文件
(1)三种配置文件:
配置文件 | 说明 |
/etc/ansible/ansible.cfg | 基本配置文件,如果找不到其他配置文件,使用这个 |
~/.ansible.cfg | 如果存在此配置并且当前工作目录中也没有ansible.cfg,此文件替代/etc/ansible/ansible.cfg |
./ansible.cfg | 执行ansible命令的目录中如果有ansible.cfg,就用它,不使用上面两个(推荐使用,上面两个不常用) |
(2)显示使用的配置文件:ansible dbservers -i inventory --list-hosts -v
(3)管理配置文件中的设置:vim ./ansible.cfg
参数 | 含义 |
[defaults] | 部分设置ansible操作的默认值 |
[privilege_escalation] | 配置ansible如何在受管主机上执行特权升级 |
[defaults]
inventory = ./inventory
remote_user = student #指定登录受管主机的用户,如不指定则使用当前用户名称
ask_pass = false #是否提示输入ssh密码,做了免密就可以设置为false,否则需为true
[privilege_escalation]
become = true #连接到受管主机上是否进行身份切换
become_method = sudo #切换方式,默认为sudo
become_user = root #切换到的用户
become_ask_pass = false #是否需要为become_method提示输入密码,默认为false
注意:为了后续运行命令方便执行,要在ansible管理主机上使用【ssh-keygen】对指定的受管主机进行免密设定。
(4)使用sudo进行权限下放: 以超级用户身份编辑文件(建议写在/etc/sudoers.d目录下)
以上,ansible部署就算完成了:设定清单、编辑配置文件、进行权力下放。此时,就可以使用ansible模块运行命令。
三、ansible模块
列出所有模块:ansible-doc -l
查看ping模块帮助文档:ansible-doc ping
模块类型 | 模块名称 | 模块作用 |
文件模块 | copy | 将本地文件复制到受管主机 |
file | 设置文件的权限和其他属性 | |
lineinfile | 确保特定行是否在文件中 | |
synchronize | 使用rsync同步内容 | |
系统模块 | firewalld | 使用firewalld管理任意端口和服务 |
reboot | 重启 | |
service | 管理服务 | |
user | 添加、删除和管理用户账户 | |
Net Tools模块 | get_url | 通过http、https、或者ftp下载文件 |
nmcli | 管理网络 | |
uri | 与web服务交互 |
四、 运行临时命令(ad-hoc)
为什么要使用临时命令:使用临时命令可以快速测试和更改,无需编写playbook
1. 格式
ansible host -m module [-a 'module arguments'] [-i inventory] #host表示受管主机名称,module表示模块,-a表示模块参数,-i指定清单
2. 检查能否在受管主机上运行python模块
(1)在/etc/hosts文件中,添加受管主机的解析:
(2)简单测试,在默认清单文件,添加受管主机:
(3)使用命令进行测试:ansible all -m ping
3. 使用临时命令通过模块执行任务
3.1 使用user模块
用途:使用user模块确保student用户存在于servera.lab.example.com且uid为1000
命令:ansible -m user -a ‘name=student uid=1000 state=present’ servera.lab.example.com
注意: 此时默认清单里面还是servera.lab.example.com
3.2 使用command模块
(1)在受管主机上运行(hostname)命令: ansible webservers -m command -a /usr/bin/hostname -o
注意:此时的默认清单里面添加了主机组
(2)查看本机当前用户的id: ansible localhost -m command -a ‘id’
(3)通过-u选项使用student进行连接并执行id命令: ansible localhost -m command -a ‘id’ -u student
注意:在执行上面两条命令时,需要在新建的目录中执行,否则结果不会变
本机的两种用户【root、student】也都要进行免密操作
(4)使用shell和command的区别:
注意:command模块允许执行远程命令,但这些命令不是shell处理,所以无法访问shell环境变量,所以不能执行重定向、传送等操作。
3.3 使用copy模块
使用copy模块将本地文件复制到受管主机
- 首先使用student用户,因为student用户没有写权限,会失败:
ansible localhost -m copy -a ‘content=“hello hello\n” dest=/etc/motd’ -u student - 使用特权升级
注意:此处使用特权升级需要先编辑/etc/sudoers.d/student文件,进行权力下放
以root用户身份执行:ansible localhost -m copy -a ‘content=“hello hello\n” dest=/etc/motd’ -u student --become - 使用all参数一次更改servera和localhost: ansible all -m copy -a ‘content=“westos ansible\n” dest=/etc/motd’ -u student --become
注意:更改的前提是需要在servera.lab.example.com主机上设定权力下放
查看:ansible all -m command -a ‘cat /etc/motd’ -u student
3.4 使用命令更改Apache默认发布页面
更改servera.lab.example.com主机的Apache默认发布页面,注意,在servera主机中要求已经安装了Apache服务,并且设定好了火墙和selinux。具体步骤不再赘述。
使用命令:ansible servera.lab.example.com -m copy -a ‘content=“hello apache!\n” dest=/var/www/html/index.html’