Ansible-自动化运维工具
一.Ansible介绍
1.Ansible是什么?
Ansible是一款使用Python开发,模块化,依赖于ssh协议实现的自动化统一配置管理工具,自动化主要体现在Ansible集成了丰富模块以及功能组件,可以通过一个命令完成一系列的操作,进而能减少重复性的工作和维护成本,可以提高工作效率。集合了众多老牌运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
2.为什么要使用Ansible?
- 传统运维效率低,大多工作人为完成。
- 传统运维工作繁琐,容易出错。
- 传统运维每日重复做相同的事情。
- 传统运维没有标准化流程。
- 传统运维的脚本繁多,不能方便管理。
3.Ansible的工作原理
基于 SSH 和模块
Ansible 通过 SSH 协议连接到目标主机。这意味着它不需要在目标主机上安装额外的代理软件。它使用一系列的模块来执行具体的任务。这些模块是 Ansible 的核心功能单元,比如 “yum” 模块用于在基于 RPM 的系统(如 CentOS、Red Hat)上安装软件包,“apt” 模块用于 Debian 和 Ubuntu 系统的软件安装,“service” 模块用于管理系统服务等。当 Ansible 执行一个任务时,它会将相应的模块发送到目标主机,然后在目标主机上运行模块来完成任务。
Inventory 文件
Ansible 使用一个名为 “Inventory” 的文件来管理目标主机列表。这个文件可以是简单的文本格式,列出了主机的 IP 地址或主机名,也可以按照组进行分类。例如,你可以将所有的 Web 服务器放在一个名为 “web_servers” 的组中,将数据库服务器放在 “db_servers” 的组中。在 playbook 中,就可以针对不同的组执行不同的任务,比如只在 “web_servers” 组中安装和配置 Web 服务器软件。
4.Ansible的架构
(1).主机清单(Inventory):定义Ansible需要操作主机的范围。 (2).剧本(Playbook):将多个任务定义在剧本中,由 Ansible 自动执行,实现复杂的配置管理和应用部署。 (3).核心模块(Core Modules):连接主机并实现特定的操作,它依赖于具体的模块来做具体的事情。 (4).自定义模块(Custom Modules):当核心模块无法满足特定需求时,可以通过创建自定义模块来扩展 Ansible 的功能。 (5).连接插件(Connection Plugins):提供不同的连接方式,以适应不同环境的需求。 (6).插件(Plugins):丰富了 Ansible 的功能集,使得它可以更好地集成到现有的工作流和技术栈中。 #最重要的一点是:Ansible是模块化的,它所有的操作都依赖于模块。 |
5.Ansible的功能优势
(1).Ansible通过SSH连接到目标机器执行任务,不需要在这些机器上安装额外的客户端或代理。
(2).基于 YAML 的 Playbook 文件易于编写和理解,简单易用,不需要有编程基础。
(3).提供大量的内置模块,并支持用户自定义模块来扩展功能。
(4).每次运行 Playbook 都会得到相同的结果,不会因为重复执行而破坏系统状态。
(5).Ansible没有守护进程,不需要启动。
(6).日志集中在主控端,方便错误排查。
6.Ansible 的差异
(1).与Puppet的差异
Ansible:采用无代理架构,通过 SSH 协议来与被管理的节点进行通信并执行任务。
Puppet:是基于客户端 / 服务器(C/S)架构,需要在被管理的节点上安装 Puppet 代理软件。
Ansible:使用 YAML 编写 Playbook 来定义任务和配置。
Puppet:使用 DSL(领域特定语言)
Ansible:架构简单,易于部署和维护。
Puppet:需要设置 Master 和 Agent 架构相对复杂。
(2).与SaltStack的差异
Ansible:采用无代理架构,通过 SSH 协议来与被管理的节点进行通信并执行任务。
Saltstack:采用典型的主从架构,需要在被管理节点上安装 Salt Minion,它与 Salt Master 通过消息队列协议(如 ZeroMQ)进行通信。
Ansible:使用 YAML编写 Playbook来定义任务和配置。
Saltstack:的配置文件可以使用多种格式,包括 YAML 和自己独特的格式。
Ansible:架构简单,易于部署和维护。
SaltStack:需要设置 Master 和 Minion 架构相对复杂。
二.Ansible部署
1.Ansible集群节点规划
我们创建四台虚拟机server节点、host1节点、host2节点和host3节点
四个节点根据节点规划来修改主机名
我们在server节点下安装ansible、其余节点不进行配置
节点 | Ip地址 |
Server节点 | 192.168.77.171 |
Host1节点 | 192.168.77.172 |
Host2节点 | 192.168.77.173 |
Host3节点 | 192.168.77.174 |
2.安装Ansible
Ansible仓库默认不在yum仓库中,因此需要使用下面的命令启用epel仓库。
# 拉取epel扩展源 [root@server ~]# yum -y install epel-release |
安装epel-release源后,安装Ansible,并检查是否安装成功
# 安装Ansible [root@server ~]# yum -y install ansible # 查看Ansible版本 [root@server ~]# ansible --version |
3.配置免密登入
其实就是配置从管理节点到远程主机之间基于key(无密码的方式)的SSH连接
(1).生成密钥对
在server节点上生成密钥对
[root@server ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:G/Ezen/e8puqFtJPG5jrUeBoQ4iCyUtR52MmYftRm6k root@server The key's randomart image is: +---[RSA 2048]----+ | ..+ . . | |. = = o = | | = + B =.. . | |. . * + .oo . | | . E S+=.o. | | .=.B.o | | o o.= o | | . +.oo..| | ooo+o=+| +----[SHA256]-----+ |
(2).将公钥发给管制节点
三个受管制的节点依次发送
[root@server ~]# ssh-copy-id 192.168.77.172 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@192.168.77.172's password: #这里输入host1节点的密码 Number of key(s) added: 1 Now try logging into the machine, with: "ssh '192.168.77.172'" and check to make sure that only the key(s) you wanted were added. |
(3).测试免密登入
在server节点上登入三个节点,测试无密钥
[root@server ~]# ssh 192.168.77.172 Last login: Thu Nov 28 08:05:20 2024 from 192.168.77.1 [root@host1 ~]# exit 登出 Connection to 192.168.77.172 closed. [root@server ~]# ssh 192.168.77.173 Last login: Thu Nov 28 08:05:24 2024 from 192.168.77.1 [root@host2 ~]# exit 登出 Connection to 192.168.77.173 closed. [root@server ~]# ssh 192.168.77.174 Last login: Thu Nov 28 08:24:25 2024 from 192.168.77.171 [root@host3 ~]# exit 登出 Connection to 192.168.77.174 closed. |
4.Ansible主机清单
(1).什么是Host Inventory(主机清单)
Host Inventory定义了你想要管理和操作的远程主机及其相关信息。Inventory 文件告诉 Ansible 要连接哪些主机、如何连接这些主机以及它们之间的分组信息。通过 Inventory,你可以轻松地对单个主机或一组主机执行自动化任务。
(2).Host Inventory配置文件
主机清单文件默认位置是:/etc/ansible/hosts
可以在ansible的配置文件中修改为其他的文件
# 查看ansible的配置文件路径 [root@server ~]# rpm -qc ansible /etc/ansible/ansible.cfg #ansible配置文件路径 /etc/ansible/hosts #主机清单位置 默认是/etc/ansible/hosts |
ansible.cfg常用配置解析
[defaults] #inventory = /etc/ansible/hosts #主机列表配置文件 #library = /usr/share/my_modules/ #库文件存放目录 #remote_tmp = ~/.ansible/tmp #临时py文件存放在远程主机目录 #local_tmp = ~/.ansible/tmp #本机的临时执行目录 #forks = 5 #默认并发数 #sudo_user = root #默认sudo用户 #ask_sudo_pass = True #每次执行是否询问sudo的ssh密码 #ask_pass = True #每次执行是否询问ssh密码 #remote_port = 22 #远程主机端口 #host_key_checking = False #跳过检查主机指纹 #log_path = /var/log/ansible.log #ansible日志 # 普通用户提权操作 [privilege_escalation] #become=True #become_method=sudo #become_user=root #become_ask_pass=False |
5.Ansible主机清单配置规则
(在/etc/ansible/hosts中配置)
主机配置规则:
- 可以使用主机名(域名)或IP地址
- 支持主机名通配以及正则表达式
- 支持指定主机定义不同的变量,包括密码、端口号、用户等等
- 如果配置过无密钥就不需要在文件中指定密码了 没有配置过的需要指定密码
(1).备份主机清单文件
我们先备份一下主机清单文件,然后清空hosts文件
[root@server ~]# cd /etc/ansible/ [root@server ansible]# ls ansible.cfg hosts roles [root@server ansible]# cp -f hosts hosts.bak [root@server ansible]# ls ansible.cfg hosts hosts.bak roles |
(2).单主机配置
# IP + 用户密码 [root@server ~]# vi /etc/ansible/hosts [host01] 192.168.77.172 ansible_ssh_pass='root' [host02] 192.168.77.173 ansible_ssh_pass='root' # 测试:ansible 主机名 -m 指定模块 [root@server ~]# ansible host01 -m ping 192.168.77.172 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } [root@server ~]# ansible host02 -m ping 192.168.77.173 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } |
(3).多主机配置
# IP + 密码 [root@server ~]# vi /etc/ansible/hosts [host] 192.168.77.172 ansible_ssh_pass=’root’ 192.168.77.173 ansible_ssh_pass=’root’ # 测试:ansible 主机名 -m 指定模块 [root@server ~]# ansible host -m ping 192.168.77.172 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 192.168.77.173 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } |
(4).主机组
对组定义变量 [组名:vars]
# 主机组变量 + 主机 + 密码 [root@server ~]# vi /etc/ansible/hosts [host_group] 192.168.77.172 192.168.77.173 [host_group:vars] ansible_ssh_pass='root' # 测试:ansible 主机名 -m 指定模块、 [root@server ~]# ansible host_group -m ping 192.168.77.172 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 192.168.77.173 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } |
嵌套 [组名:children]
#定义多组,多组嵌套 # hostservers组包括两个子组[apache,nginx] #定义总IP [host_group] 192.168.77.172 192.168.77.173 192.168.77.174 #apache有两台 [apache] 192.168.77.172 192.168.77.173 #nginx有一台 [nginx] 192.168.77.174 #定义密码 [apache:vars] ansible_ssh_pass='root' [nginx:vars] ansible_ssh_pass='root' [host_group:children] apache nginx # 测试:ansible 主机名 -m 指定模块 [root@server ~]# ansible host_group -m ping 192.168.77.172 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 192.168.77.173 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 192.168.77.174 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } [root@server ~]# ansible apache -m ping 192.168.77.172 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 192.168.77.173 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } [root@server ~]# ansible nginx -m ping 192.168.77.174 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } |
三. Ansible中的ad-hoc模式
Ansible的ad-hoc模式是一种简单、快速地在一个或多个远程主机上执行单个任务的方式。它不需要像Playbook模式那样编写复杂的YAML脚本,适用于一次性的、简单的操作,例如快速检查远程主机的状态、安装一个软件包或者重启一个服务等。
1.Ansible参数
(1).Ansible参数
ansible 主机名 -m "模块" -a "具体命令" # 常用参数 -m #指定要使用的模块名称,不指定默认使用command模块 -a #为指定的模块提供参数。不同的模块有不同的参数需求。 --syntax-check #验证语法 # 不常用参数 --version #ansible版本信息 -v #显示详细信息 -i #指定主机清单文件的位置,默认是在/etc/ansible/hosts -k #提示输入ssh密码,而不使用基于ssh的密钥验证 -C #模拟执行测试,不会真的改变系统状态 -T #设置远程命令执行的最大超时时间,默认值是10秒 -f #控制Ansible同时并行处理多少台主机,默认情况下是5台 |
(2).Ansible帮助命令
ansible-doc #帮助命令 ansible-doc -l #列出所有的模块 ansible-doc 模块名 #查看模块的详细信息 ansible-doc 模块名 -s #查看模块的选项使用说明 |
2.ad-hoc模式执行流程
模块执行的工作流程:
- 主控端命令行执行命令
- 将模块拷贝到受控端
- 按照模块定义的操作在受控端执行
- 返回信息,删除受控端模块
Ansible执行命令的返回值颜色
绿色:执行命令成功,只查看了信息,没有修改 黄色:执行命令成功,并且对目标主机做了修改 红色:执行失败,报错 粉色:警告信息 紫色:表示对命令发错的操作有警告信息 |
3.Ansible中常见的返回值
返回值 | 返回值含义 |
changed | 几乎所有的Ansible模块都会返回该变量,表示模块是否对远程主机执行了修改操作 |
Failed | 如果模块未能执行完成,将返回failed为true |
Msg | 模块执行失败的原因,常见的错误如ssh连接失败 |
Rc | 与命令行工具相关的模块会返回rc,表示执行Linux命令的状态码 |
stdout | 与rc类似,返回的是标准输出的结果 |
stderr | 与rc类似,返回的是标准错误的结果 |
backup_file | 所有存在backup选项的模块,用来返回备份文件的路径 |
results | 应用在playbook中存在循环的情况,返回多个结果 |
4.常用模块
我们先在主机清单中添加几台主机用来测试
[host1] 192.168.77.172 [host2] 192.168.77.173 [host3] 192.168.77.174 [host_group] 192.168.77.172 192.168.77.173 192.168.77.174 |
(1).ping模块
ping模块:用于检查指定节点机器是否连通,用法很简单
语法:
anshible 主机名 -m ping |
案例:
# 查看是否能够ping通host1节点 [root@server ~]# ansible host1 -m ping |
(2).command模块
command模块:用于在远程主机上执行命令,不支持管道
语法:
ansible 主机名 -m command -a "具体命令" ansible 主机名 -a "具体命令" # ansible默认就是使用command模块。 |
案例:
# 在受管制主机host1的/opt/目录下创建文件 [root@server ~]# ansible host1 -m command -a 'touch /opt/qzj' |
(3).shell模块
shell模块:用于远程执行命令也可以执行受控机上的脚本,支持管道和重定向
语法:
ansible 主机名 -m shell -a "具体命令" |
案例:
# 远程执行脚本 # 首先在host1节点上创建一个shell脚本1.sh,内容为echo `date` # 赋予执行权限 chmod +x 1.sh # 然后在server节点上执行该脚本 [root@server ~]# ansible host1 -m shell -a '/root/1.sh' |
# 查看host_group组远程主机的系统版本 [root@server ~]# ansible host_group -m shell -a 'cat /etc/os-release | grep PRETTY_NAME | cut -d "=" -f2' |
(4).raw模块
raw模块:ssh登入,再执行,用于在远程主机上直接执行任意命令
语法:
ansible 主机名 -m raw -a "具体命令" |
案例:
# 查看host组的root目录下 [root@server ~]# ansible host_group -m raw -a "ls /root/" |
(5).script模块
Script模块用与远程执行本地脚本
语法:
ansible 主机名 -m script -a "脚本文件的本地路径" |
案例:
# 在host组上远程执行脚本 # 我们先在server节点上创建一个脚本2.sh,内容为echo "测试" # 赋予执行权限 [root@server ~]# ansible host_group -m script -a '/root/2.sh' |
请注意,script模块会将脚本文件传输到目标主机,然后在目标主机上执行它。因此,确保脚本文件在控制节点上可用,并且具有可执行权限(使用chmod +x命令添加执行权限)。
(6).yum模块
Yum模块:用于远程安装软件
语法:
ansible 主机名 -m yum -a "name=软件包名 state=安装/卸载/更新" name=软件包名,多个软件包用逗号隔开 state=installed/present安装、removed/absent卸载、lastest更新 yum模块的更多使用可以使用ansible-doc yum来查看 |
案例:
# 我们在host1节点上安装一个nginx服务和netstat命令 [root@server ~]# ansible host1 -m yum -a 'name=nginx,net-tools state=installed' |
我们可以看到nginx服务和netstat命令可以正常使用
(7).copy模块
copy模块:主要是将本地(执行 Ansible 任务的控制节点)的文件或目录复制到远程的host主机(被管理节点)。
语法:
ansible 主机名 -m copy -a "src=源文件路径及文件 dest=目标文件路径" 常用参数: src=源文件路径 dest=目标文件路径 contest=指定文件内容,只有目标文件;如果文件不存在会创建 owner=指定属主 group=指定属组 mode=指定权限 copy模块的更多使用可以使用ansible-doc copy来查看 |
案例:
# 将server节点上的2.sh文件复制到host1上 [root@server ~]# ansible host1 -m copy -a 'src=/root/2.sh dest=/root/' |
我们可以看到2.sh文件已经复制到host1节点上
(8).file模块
file模块:主要用于设置远程主机上的文件、软链接和文件夹的权限,也可以用来创建和删除他们。
语法:
ansible 主机名 -m file -a "操作内容" 常用参数: path:指定路径 src:源文件路径 recurse:递归授权 owner:指定属主 group:指定属组 mode:指定权限 state:指定文件的状态 directory:在远端创建目录 touch:在远端创建文件 link:创建软连接 hard:创建硬连接 absent:表示删除文件或目录 |
案例:
# 在host1上创建一个目录和一个文件 [root@server ~]# ansible host1 -m file -a 'path=/opt/123 state=directory' [root@server ~]# ansible host1 -m file -a 'path=/opt/1.txt state=touch' |
我们在host1节点上可以看到目录和文件已经被创建
(9).service模块
service模块:用于管理系统服务(如启动、停止、重启服务等)。
语法:
ansible 主机名 -m service -a "name=服务名称 state=服务操作 enabled=是否设置开机自启" name:定义要启动服务的名称 state:指定服务状态 常用参数: started:启动服务(幂等) stopped:停止服务(幂等) restarted:重启服务 reloaded:重载配置 enabled:开机自启 |
案例:
# 启动host1上的nginx服务并设置开机自启 [root@server ~]# ansible host1 -m service -a 'name=nginx state=started enabled=yes' # 查看host1节点的nginx状态 [root@server ~]# ansible host1 -m shell -a 'systemctl status nginx' # 关闭nginx服务 [root@server ~]# ansible host1 -m service -a 'name=nginx state=stopped' # 查看host1节点的nginx状态 [root@server ~]# ansible host1 -m shell -a 'systemctl status nginx' |
(10).cron模块
cron模块:用于设置定时任务
语法:
ansible 主机名 -m cron -a "操作内容" 常用参数: name:注释说明 minute、hour、day、month、weekday(分、时、日、月、周) user:指定用户 job:操作的指令 state:进行的操作 present:创建 absent:删除 |
案例:
# 在host1节点上设置一个定时脚本然后删除掉 # 设置定时执行统计脚本(每一个小时执行一次,使用root用户) [root@server ~]# ansible host1 -m cron -a "name="每小时执行一次统计脚本" minute=0 hour=*/1 day=* month=* weekday=* user=root job='/bin/bash /root/3.sh' state=present" # 查看定时任务 [root@server ~]# ansible host1 -m shell -a 'crontab -l' # 删除指定的定时任务 [root@server ~]# ansible host1 -m cron -a "name="每小时执行一次统计脚本" minute=0 hour=*/1 day=* month=* weekday=* user=root job='/bin/bash /root/3.sh' state=absent" #查看定时任务 [root@server ~]# ansible host1 -m shell -a 'crontab -l' |
(11).mount模块
mount模块:用于管理设备挂载与卸载
语法:
ansible 主机名 -m mount -a "操作内容" 常用参数: src:指定挂载源 path:指定挂载点 (挂载点不存在会自动创建) fstype:指定文件系统类型 opts:挂载参数,默认不写为:defaults dump:是否备份:0表示不进行备份,默认为0 passno:文件系统检测:0表示不进行文件系统检测,默认为0 state:操作 present:写入fstab,但实际没有挂载,需要重启服务器 absent:取消临时挂载,并且删除fstab mounted:写入fstab,并且直接挂载了(常用) unmounted:临时取消挂载,但是没有删除fstab,重启服务器之后就会恢复(常用) |
案例:
# 临时取消挂载在data的/dev/sdb(常用),不会删除fstab [root@server ~]# ansible host1 -m mount -a "src=/dev/sdb path=/data/ state=unmounted" # 取消挂载在data的/dev/sdb,并且直接删除fstab中的单独配置 [root@server ~]# ansible host1 -m mount -a "src=/dev/sdb path=/data/ state=absent" # 添加一个挂载写入fstab,但实际没有挂载,需要重启服务器,重启完就会自动挂载上 [root@server ~]# ansible host1 -m mount -a "src=/dev/sdb path=/data fstype=xfs opts=defaults dump=0 passno=0 state=present" # 添加一个挂载写入fstab,并且直接挂载上(常用) [root@server ~]# ansible host1 -m mount -a "src=/dev/sdb path=/data fstype=xfs state=mounted" |
(12).user/group模块
user模块:用于管理远程系统上的用户账户,包括创建、修改和删除用户。
group模块:用于在受控机上添加或删除组。
语法:
ansible 主机名 -m user -a "操作内容" ansible 主机名 -m group -a "操作内容" 常用参数: name:指定用户名 system:如果为 yes,则创建用户时设置用户为系统用户,默认为 no uid:指定用户的用户UID gid:指定用户的组GID group:指定用户所属组 groups:指定用户所属的其他组 home:指定用户的家目录 shell:指定用户的登录shell password:指定用户的密码(已加密的密码) append:如果为yes,则添加用户到组而不是替换,默认为no remove:当 state 为 absent 时,是否删除用户的家目录和邮件别名,默认为 no move_home:如果为yes,则在更改用户的主目录时移动用户的文件,默认为no create_home:如果为yes,则创建用户的主目录,默认为yes update_password:如果为always,则始终更新密码,默认为on_create state:指定用户账户的状态,可以是以下之一: present:创建用户或组 absent:删除用户或组 locked:锁定用户账户 unlocked:解锁用户账户 password:仅更改用户的密码 |
案例:
# 创建用户,使用user模块创建一个名为qiuzj的新用户 [root@server ~]# ansible host1 -m user -a "name=qiuzj state=present" # 查看 [root@server ~]# ansible host1 -m shell -a "tail -1 /etc/passwd" ![]() # 删除用户和home家目录,使用 user 模块删除一个名为qiuzj的用户 [root@server ~]# ansible host1 -m user -a "name=qiuzj remove=yes state=absent" # 查看 [root@server ~]# ansible host1 -m shell -a "tail -1 /etc/passwd" ![]() # 创建组,使用 group 模块创建一个名为 mygroup 的新组: [root@server ~]# ansible host1 -m group -a "name=mygroup state=present" # 查看 [root@server ~]# ansible host1 -m shell -a "tail -1 /etc/group" ![]() # 删除组,使用 group 模块删除一个名为 mygroup 的组: [root@server ~]# ansible host1 -m group -a "name=mygroup state=absent" # 查看 [root@server ~]# ansible host1 -m shell -a "tail -1 /etc/group" ![]() # 再将上面的用户和用户组在创建一遍; [root@server ~]# ansible host1 -m user -a "name=qiuzj state=present" [root@server ~]# ansible host1 -m group -a "name=mygroup state=present" # 添加用户到组,使用 user 模块将用户qiuzj添加到组mygroup: [root@server ~]# ansible host1 -m user -a "name=qiuzj group=mygroup append=yes" # 查看 [root@server ~]# ansible host1 -m shell -a "groups qiuzj" ![]() |
(13).unarchive模块
unarchive模块:用于解压归档文件,它支持多种常见的归档格式,如.tar、.tar.gz、.zip等。
unarchive模块,这个模块有两种用法:
1、将ansible主机上的压缩包在本地解压缩后传到远程主机上,这种情况下,copy=yes.本地解压缩,解压缩位置不是默认的目录,没找到或传完删了后传到远程主机 2、将远程主机上的某个压缩包解压缩到指定路径下。这种情况下,需要设置copy=no远程主机上面的操作,不涉及ansible服务端 |
语法:
ansible 主机名 -m unarchive -a "src=源路径 dest=目标路径 其他参数" 常用参数: copy:默认为no,当copy=yes,那么拷贝的文件是从ansible主机复制到远程主机上而不是在原地解压缩,如果设置为copy=no,那么会在远程主机上寻找src源文件 src:源路径,可以是ansible主机上的路径,也可以是远程主机上的路径,如果是远程主机上的路径,则需要设置copy=no dest:指定了解压缩后文件的目标目录 mode:设置解压缩后的文件权限,可以使用数字或符号模式,例如 "0644" 或 "u=rw,go=r" list_files:默认值为no,如果设置为yes,解压同时,返回压缩包的文件列表 remote_src:如果设置为 yes,则表示 src 参数是远程主机上的路径 extra_opts: 允许您指定解压缩命令的额外选项。这对于一些特定格式的存档文件非常有用 creates: 如果指定了此选项,只有在 creates 中指定的文件或目录不存在时,才会执行解压缩操作 owner: 设置解压缩后文件的所有者 group: 设置解压缩后文件的所属组 |
案例:
# 将jdk-8u271-linux-x64.tar.gz复制到server节点下的root目录下并解压 [root@server ~]# ansible host1 -m unarchive -a "src=/root/jdk-8u271-linux-x64.tar.gz dest=/root" # 查看 [root@server ~]# ansible host1 -m shell -a "ls" ![]() |
(14).get_url模块
get_url模块:用来下载文件
语法:
ansible 主机名 -m get_url -a "url=远程下载的url dest=保存路径 其他参数" 常用参数: url (必需): 指定要下载文件的URL。这是一个必需参数 dest (必需): 指定文件将保存到本地目标主机上的目标路径。这是一个必需参数 force (可选): 如果设置为 yes,将强制下载文件,即使文件已经存在。默认为 no checksum (可选): 提供要下载文件的校验和,以确保文件完整性 backup (可选): 如果设置为 yes,将在下载之前备份现有文件。默认为 no timeout (可选): 设置下载文件的超时时间(秒) url_username (可选): 如果目标URL需要身份验证,可以提供用户名 url_password (可选): 如果目标URL需要身份验证,可以提供密码 owner (可选): 设置下载后文件的所有者 group (可选): 设置下载后文件的所属组 mode (可选): 设置下载后文件的权限模式 |
案例:
[root@server ~]# ansible host1 -m get_url -a "url=https://blog.youkuaiyun.com/2402_85534286/article/details/143182911?spm=1001.2014.3001.5501 dest=/home/csdn.txt" |
在host1节点上的/home/csdn.txt文件中可以看到网站信息
(15).setup模块
setup 模块:它用于获取目标主机的系统信息和事实(facts),并将这些信息返回到 Ansible Playbook 中,以供后续任务使用。setup 模块通常不需要额外的参数,因为它会自动获取系统信息。
语法:
ansible 主机名 -m setup -a "参数=操作" 常用参数: filter:用于过滤收集的信息,只收集特定的变量 gather_subset:用于指定要收集的子集。默认情况下,setup 模块会收集所有标准信息 fact_path:指定自定义事实文件的路径 filter常用特定信息: 系统和操作系统相关
网络相关
硬件相关
用户和权限相关
gather_subset收集的子集: all(全部) min(最小集合) hardware(硬件信息) network(网络信息) virtual(虚拟化信息) ohai(类似Chef Ohai的扩展信息) facter(使用Facter收集的信息) |
案例:
# 查看host1节点的系统时间 [root@server ~]# ansible host1 -m setup -a "filter=ansible_date_time" ![]() # 将查询到的信息保存 [root@server ~]# ansible host1 -m setup -a "filter=ansible_date_time" --tree /home ![]() 保存的信息存放在了server控制节点的/home目录下 ![]() |
至此,Ansible的介绍、安装方式和Ansible模块的基本使用就结束了,下一期将会是是playbook模式的详解。下次再见。