当前位置: 首页 > news >正文

ansible安装部署及常用模块详解(超详细)

目录

前言

一、环境概况

修改主机名(可选项)

二、安装部署

1.安装epel扩展源

2.安装Ansible

3.修改Ansible的hosts文件

4.生成密钥

三、Ansible模块使用介绍

Command模块

Shell模块

User模块

Copy模块

File模块

Hostname模块

Yum模块

Service和System模块

Setup 模块

四、playbook

前言:

1.ansible-playbook介绍

2.playbook yml文件格式介绍

playbook实例

1.在目标主机上安装docker,使用docker部署nginx



前言

Ansible 是一种开源的自动化工具,用于配置管理、应用程序部署和任务自动化。它采用简单易懂的 YAML 语法和基于 SSH 协议的远程执行,能够实现快速、可靠的自动化配置和部署。

Ansible 的一些主要特点和功能:

  1. 简单易用: Ansible 使用 YAML 格式的声明性语言,使得编写和阅读 Playbooks(Ansible 的配置文件)变得非常直观和易于理解。无需编写复杂的脚本或程序代码,就可以完成大部分配置和部署任务。

  2. 无代理架构: Ansible 采用基于 SSH 的无代理架构,不需要在目标主机上安装任何额外的代理或客户端软件。这简化了部署和管理过程,并提供了更强的安全性。

  3. 模块化: Ansible 提供了丰富的模块库,用于执行各种操作,如包管理、文件操作、服务管理、用户管理等。模块化的设计使得用户可以轻松地扩展和定制 Ansible,以满足特定的自动化需求。

  4. 剧本化: Ansible 使用 Playbooks 来描述配置和部署任务。Playbooks 是用 YAML 编写的文本文件,可以定义一系列任务和主机组,以及执行这些任务的顺序和条件。这使得用户可以将复杂的配置和部署过程分解为可管理的、可重用的剧本。

  5. 多平台支持: Ansible 可以在多种操作系统和云平台上运行,包括 Linux、Windows、macOS、VMware、AWS、Azure、Google Cloud 等。这使得 Ansible 成为一个通用的自动化工具,可用于管理多样化的 IT 环境。

  6. 可扩展性: Ansible 可以集成到现有的工具链和流程中,并与其他自动化和编排工具(如 Jenkins、Kubernetes)进行集成。此外,Ansible 还具有丰富的插件和扩展机制,可以根据需要进行功能定制和扩展。

一、环境概况

192.168.159.128 ------------> Ansible服务端(管理端)

192.168.159.129 ------------> 客户端(受控端)

修改主机名(可选项)

修改Ansible服务端的主机名,客户端不修改

hostnamectl set-hostname ansible.server hostname ansible.server reboot后永久生效

二、安装部署

1.安装epel扩展源

yum install -y epel-release

2.安装Ansible

yum install -y ansible

3.修改Ansible的hosts文件

cd /etc/ansible/ tree . ├── ansible.cfg #ansible的配置文件,默认即可 ├── hosts #ansible的主机清单,用于存储需要管理的远程主机的相关信息,需要编辑 └── roles/ #公共角色目录,默认即可

vim hosts #webservses行取消注释,添加被控端IP [webservers] ## alpha.example.org ## beta.example.org 192.168.159.129 ## 192.168.1.110

4.生成密钥

Ansible 的工作原理是通过 SSH 连接到远程主机,在目标主机上执行预定义的任务或命令,所以需要配置免密

ssh-keygen ssh-copy-id root@192.168.159.129

三、Ansible模块使用介绍

现在开始ansible就已经可以开始使用了

  • 查看Ansible版本
[root@ansible ansible]# ansible --version ansible 2.9.27 config file = /etc/ansible/ansible.cfg configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Jun 20 2023, 11:36:40) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] [root@ansible ansible]#
  • 查看pingtelnet模块的简要描述和摘要
ansible-doc -s ping ansible-doc -s telnet

  • 用于查看有关telnet模块的文档,类似于man手册
ansible-doc telnet

Command模块

格式

ansible <hosts> -m command -a "<command>"

ansible webservers -m command -a "free -h" ansible 192.168.159.129 -m command -a "free -h" ansible all -m command -a "free -h" ansible webservers -a "uname -a"

<hosts>可以使用以上三种方式指定

  • webservers:hosts配置文件中的【webservers】组执行某些命令
  • 实际IP:指定IP运行某些命令
  • all:代表所有hosts主机,包含hosts配置文件中的【dbservers】组

Shell模块

格式

ansible <hosts> -m shell -a "<command>"

ansible all -m shell -a "for i in {1..5}; do touch \$i.txt;done && ls -la *.txt"

1.上述示例当中的touch命令部分为什么在$符号前面要加上转义符?

ansible webservers -m shell -a "df -hT|grep '/$' | awk '{print $6}'" ansible webservers -m shell -a "df -hT|grep '/$' | awk '{print \$6}'"

2.上述示例当中的awk命令部分为什么在$符号前面要加上转义符?

解释:为了确保 $6 不被解释为命令行变量,而是作为字符串的一部分传递给远程主机执行,需要使用转义符 \ 进行转义。\$6 的目的是将 $6 这个字符串传递给远程主机而不被本地 Shell 解释为变量

所以正确写法是这样的:

ansible all -m shell -a "for i in {129,130}; do ping -c 1 192.168.159.\$i; done"

!!!错误写法示范:

User模块

格式

ansible <hosts> -m user -a "<options>"

<hosts>: 指定要管理用户的目标主机,可以是单个主机或者主机组的名称。 -m user: 通过 -m 参数指定要使用的模块为 user。 -a "<options>": 使用 -a 参数传递模块的选项。选项可以是创建用户、修改用户属性或删除用户等操作。 user 模块的常用选项包括: name: 指定用户的名称。 password: 指定用户的密码(已加密)。 state: 指定用户的状态,present表示创建,absent表示删除。 groups: 指定用户所属的组。 shell: 指定用户的登录 Shell。 system=yes|no: 是否为系统账号。 uid: 用户uid move_home=yse|no:如果设置的家目录已经存在,是否将已经存在的家目录进行移动 password: 用户的密码,建议使用加密后的字符串 comment: 用户的注释信息 remove=yes|no: 当state=absent时,是否删除用户的家目录 comment: 指定用户的注释信息。
ansible webservers -m user -a 'name="wang" state=present password=123456 groups=root shell="/sbin/nologin"' ansible webservers -m command -a 'grep "wang" /etc/shadow'

Copy模块

格式:

ansible <hosts> -m copy -a "<options>"

<hosts>: 指定要复制文件的目标主机,可以是单个主机或者主机组的名称。 -m copy: 通过 -m 参数指定要使用的模块为 copy。 -a "<options>": 使用 -a 参数传递模块的选项。选项包括源文件路径、目标文件路径、权限等。 copy 模块的常用选项包括: src: 指定源文件或目录的路径。可以是绝对路径或相对路径。 dest: 指定目标文件或目录的路径。可以是绝对路径或相对路径。 mode: 指定目标文件的权限模式,例如 0644。 owner: 指定目标文件的所有者。 group: 指定目标文件的所属组。 backup: 指定是否创建备份文件。 force: 指定是否强制复制,即使目标文件已经存在。
ansible webservers -m copy -a 'src="/root/shdir/xin.sh" dest="/root/xin_bak.sh" owner=root group=root mode=777' ansible webservers -m shell -a "bash /root/xin_bak.sh"

File模块

格式:

ansible <hosts> -m file -a "<options>"

<hosts>: 指定要操作文件的目标主机,可以是单个主机或主机组的名称。 -m file: 通过 -m 参数指定要使用的模块为 file。 -a "<options>": 使用 -a 参数传递模块的选项。选项包括要操作的文件路径、属性变更等。 file: 模块的常用选项包括: path: 指定要操作的文件或目录的路径。可以是绝对路径或相对路径。 mode: 指定文件的权限模式,例如 0644。 owner: 指定文件的所有者。 group: 指定文件的所属组。 state: 指定文件的状态,可以是 file(文件存在)、directory(目录存在)或 absent(文件不存在)。 recurse: 指定是否递归地应用更改到目录及其子目录。 follow: 指定是否跟随符号链接进行更改。
ansible webservers -m file -a 'path="/root/xin_bak.sh" owner=root group=root mode=755 state=file' ansible webservers -m command -a "ls -la /root/xin_bak.sh"

Hostname模块

格式:

ansible <hosts> -m copy -a "<options>"

ansible webservers -m hostname -a "name=test" ansible webservers -m command -a "hostname"

Yum模块

格式:

ansible <hosts> -m yum -a "name=<package_name> state=<state>"

<hosts>: 指定要操作文件的目标主机,可以是单个主机或主机组的名称。 -m file: 通过 -m 参数指定要使用的模块为 file。 -a "<options>": 使用 -a 参数传递模块的选项。选项包括要操作的文件路径、属性变更等。 yum: 模块的常用选项包括: name: 要安装的包的名字 state: present(安装)、absent(卸载)或 latest(更新为最新版本)。 update_cache: 是否刷新 YUM 缓存。默认情况下为 yes,表示会自动更新缓存。设置为 no 则不刷新缓存。 disable_gpg_check: 是否禁用 GPG 检查。默认为 no,表示会进行 GPG 检查。设置为 yes 则禁用 GPG 检查。 enablerepo 和 disablerepo: 控制仓库的启用和禁用。可以指定要启用或禁用的仓库名称。多个仓库以逗 号分隔。 installroot: 指定要安装软件包的根目录路径。 conf_file: 指定要使用的 YUM 配置文件路径。 vars: 用于传递额外的变量给 Ansible。
ansible webservers -m yum -a 'name=dnsmasq state=present' ansible webservers -m shell -a "systemctl restart dnsmasq && systemctl enable dnsmasq && systemctl status dnsmasq"

Service和System模块

格式:

ansible <hosts> -m service -a "name=<service name> enabled=<yes/no> state=<state>"

<hosts>: 指定要操作文件的目标主机,可以是单个主机或主机组的名称。 -m file: 通过 -m 参数指定要使用的模块为 file。 -a "<options>": 使用 -a 参数传递模块的选项。选项包括要操作的文件路径、属性变更等。 service: 模块的常用选项包括: name: <服务名称> state: <服务状态>,started|stopped|restarted enabled: <是否自启动>,yes|no pattern: <进程匹配模式> .(点): 匹配任意单个字符。 *: 匹配前一个字符的零次或多次重复。 +: 匹配前一个字符的一次或多次重复。 ?: 匹配前一个字符的零次或一次重复。 ^: 匹配字符串的开始位置。 $: 匹配字符串的结束位置。 []: 用于定义字符集,匹配其中的任意一个字符。 (): 创建捕获组,用于分组匹配。 sleep: <等待时间> timeout: <超时时间> runlevel: <运行级别> args: <额外参数> system: 模块命令格式: name: <项名称> state: <系统状态> value: <要设置的值>,started|stopped|restarted enabled: <是否自动加载>,yes|no regenerate: <是否重新生成> system_file: <系统文件路径> runtime_file: <运行时文件路径> config_file: <配置文件路径>

Setup 模块

格式:

ansible <hosts> -m setup -a "name=<service name> enabled=<yes/no> state=<state>"

<hosts>: 指定要操作文件的目标主机,可以是单个主机或主机组的名称。 -m file: 通过 -m 参数指定要使用的模块为 file。 -a "<options>": 使用 -a 参数传递模块的选项。选项包括要操作的文件路径、属性变更等。 setup: 模块的常用选项包括: gather_subset: 指定要收集的子集信息的列表。默认情况下,会收集所有可用的信息。可以使用 hardware, network, virtual, ohai, facter, ohai_timed, puppet, vagrant 或 all 来指定子集。 fact_path: 用于指定自定义信息(facts)路径的列表。Ansible 会搜索这些路径以查找自定义事实。 filter: 过滤已收集的信息(facts),仅返回匹配指定模式的结果。 gather_timeout: 设置收集事实的超时时间,单位为秒。 gather_timeout_multiplier: 用于调整超时时间的倍数,默认为 1。 gather_timeout_retry: 在超时后重试的次数,默认为 1。 cache_valid_time: 设置缓存的有效时间,单位为秒。 fact_caching: 启用或禁用缓存功能,可以是 memory、jsonfile、json、yaml 或 text。

filter常用的过滤参数

ansible_all_ipv4_addresses ipv4的所有地址 ansible_all_ipv6_addresses ipv6的所有地址 ansible_date_time 获取到控制节点时间 ansible_default_ipv4 默认的ipv4地址 ansible_distribution 系统 ansible_distribution_major_version 系统的大版本 ansible_distribution_version 系统的版本号 ansible_domain 系统所在的域 ansible_env 系统的环境变量 ansible_hostname 系统的主机名 ansible_fqdn 系统的全名 ansible_machine 系统的架构 ansible_memory_mb 系统的内存信息 ansible_os_family 系统的家族 ansible_pkg_mgr 系统的包管理工具 ansible_processor_cores 系统的cpu的核数(每颗) ansible_processor_count 系统cpu的颗数 ansible_processor_vcpus 系统cpu的总个数=cpu的颗数*CPU的核数 ansible_python 系统上的python
ansible webservers -m setup -a "gather_subset=hardware"

ansible webservers -m setup -a "filter=*device_link*"

四、playbook

前言:

1.ansible-playbook介绍

Playbook是一个包含一系列任务的YAML文件,用于描述和定义Ansible的配置、部署和管理操作。

ansible-playbook命令的基本格式:

ansible-playbook <playbook_file> [options]

其中<playbook_file>是指定要运行的Playbook文件的路径。

一些常用的选项:

-i, --inventory <inventory_file>:指定主机清单文件的路径。默认情况下,Ansible会使用 /etc/ansible/hosts 文件作为主机清单。 -l, --limit <pattern>:限制运行Playbook的主机范围,可以使用模式匹配。例如,--limit webservers 将只在名为 "webservers" 的主机上运行Playbook。 -e, --extra-vars <extra_vars>:传递额外的变量给Playbook。可以使用 -e 选项多次来传递多个变量。例如,-e "var1=value1" -e "var2=value2"。 -t, --tags <tags>:只运行带有指定标签的任务。可以使用 -t 选项多次来指定多个标签。例如,-t tag1 -t tag2。 -s, --sudo:以sudo权限运行Playbook。需要在目标主机上配置好sudo权限。 -K, --ask-become-pass:在运行Playbook之前,提示输入sudo密码。
2.playbook yml文件格式介绍

缩进: yaml使用一个固定的缩进风格表示层级结构,每个缩进由两个空格组成,不能使用tab键
冒号: 以冒号结尾的除外,其他所有
冒号后面所有必须有空格,冒号必须是英文冒号
短横线:
表示列表项,使用一个短横线加一个空格作为一个列表项,多个项使用同样的缩进级别作为同一列表

--- 表示YAML文档的开始 -name: 定义该playbook名字 hosts: 主机,可以是all,也可以是组,也可以是具体的IP become: yes/no 执行某个任务的时候,尝试切换成特权用户,这个可加可不加 gather_facts: yes/no 获取目标主机的信息 tasks: - name:任务名字 module:模块,例如 command、yum、copy、file等模块 Options1:参数1 Options2:参数2 ...... #每个模块都有一组参数介绍,这些参数被用来控制模块的行为和执行结果。 name:任务名称,用于在输出中标识任务。 state:指定状态,通常可以设置为 present、 absent 或 latest,表示目标应该处于的状态。 enabled:指定服务是否应该在启动时启用或禁用。 args:指定传递给命令或脚本的参数列表。

playbook实例

1.在目标主机上安装docker,使用docker部署nginx
--- - name: docker_nginx install hosts: webservers gather_facts: yes #获取主机信息 tasks: - name: setup memory setup: filter: "ansible_memory_mb" #获取主机内存 - name: setup date setup: filter: "ansible_date_time" #获取主机时间 - name: copy docker.repo copy: #copy模块,将本地的docker-ce.repo拷贝到目标主机上,权限644 src: "/tmp/docker-ce.repo" dest: "/etc/yum.repos.d/docker-ce.repo" owner: root group: root mode: "0644" - name: install docker yum: #yum模块,分别安装ce,ce-cli,containerd.io name: - docker-ce - docker-ce-cli - containerd.io state: latest - name: start firewalld service: #service模块,开启自启firewalld name: firewalld state: started enabled: yes - name: start docker service: #同上,开启自启docker name: docker state: started enabled: yes - name: pull nginx command: "docker pull nginx" #command模块,pull镜像 - name: create nginx_html_directory file: #file模块,state指定directory,创建该目录 path: "/usr/share/nginx/html" state: directory owner: root group: root mode: "0755" - name: touch nginx_index #同上,state指定touch,创建该文件 file: path: "/usr/share/nginx/html/index.html" state: touch owner: root group: root mode: "0644" - name: copy nginx_index copy: #copy模块,拷贝index文件到目标主机 src: "/usr/share/nginx/html/index.html" dest: "/usr/share/nginx/html/index.html" owner: root group: root mode: "0644" - name: start nginx_container #command模块,run一个nginx镜像 command: "docker run --name mynginx -p 8080:80 -v /usr/share/nginx/html/index.html:/usr/share/nginx/html/index.html -d nginx" - name: get nginx_html #get_url模块,访问8080端口 get_url: url: "http://localhost:8080" dest: "/tmp/nginx.html"

运行结果:

ansible-playbook docker.yml

访问nginx测试:

ansible webservers -m command -a " curl -k -v http://localhost:8080"

http://www.jsqmd.com/news/1328650/

相关文章:

  • 09_大模型里的竞品分析怎么做_AnswerBit对比监控指南
  • 透明背景图制作全攻略:2026年手机电脑都会用到的实用方法 - 耶斯去水印
  • 华南数字产业人力服务:广州猎头公司、杭州猎头公司服务商参考 - 榜单推荐
  • WebUploader文件上传终极指南:5分钟实现高性能跨浏览器上传方案
  • 【ICLR 2023】时间序列预测实战Crossformer(附代码+数据集+详细讲解)
  • 如何快速诊断网络连接问题:3步使用NatTypeTester解决网络NAT类型难题
  • 拼多多营业执照更换机构推荐,2026年线上操作指南 - 跑政通
  • 深度学习调参实录:学习率0.001到0.0001的6小时血泪史与梯度诊断工具链
  • 免费无限次、腾讯云加密——这款校招网申插件为什么成为学生首选 - 小塔-皂荚花
  • 拼多多店铺法人变更代办机构正规吗?2026年在线办理攻略 - 跑政通
  • blktrace介绍和使用指南。
  • PoeCharm中文版:流放之路玩家的终极角色构建解决方案
  • GPU驱动及CUDA安装流程介绍
  • Linux——网络管理实战
  • 5分钟免费搭建原神私服:KCN-GenshinServer终极简单指南
  • 写文献综述,时间脉络和主题分类到底怎么选?
  • 2026求职避坑5大核心维度!5家主流机构综合实力客观横评 - 互联网科技品牌测评
  • HOA(鸿易通)黑科技开源神器HOA!安卓手机直接运行鸿蒙HAP应用 HOA是一个实验性项目,目标是在Android设备上直接运行OpenHarmony/HarmonyOS的HAP应用 它依靠ABI兼
  • C#事件机制和event关键字
  • C#混淆选项选择指南:使用合适的加密方式保护C#代码
  • 266.需要双边沿触发时,直接对时钟取反会不会出问题
  • 手写字魔法消除1:数据集说明(含下载链接)
  • 文旅景区如何用裸眼3D和沉浸式投影打造“爆款”夜游?
  • 时间序列预测实战(十八)利用Prophet实现长期预测(附代码+数据集+详细讲解)
  • LLM拓扑病理学框架下大语言模型不可修复的根本性问题研究
  • Node.js服务中的重试边界与日志设计
  • UE4SS终极指南:5分钟掌握Unreal Engine游戏脚本系统与修改工具
  • 拓扑排序题目:奇怪的打印机 II
  • 5分钟掌握HTTrack:创建永久网站镜像的终极免费工具
  • 【Agentic RL / 强化学习 / OPD】OpenClaw-RL 源码阅读笔记 --- (16)--- AReal