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

Linux运维7.2——ansible

文章目录

  • Linux运维7.2
  • ansible
    • 概念
      • Ansible 是什么
      • 核心架构组成
        • 1. 控制节点(Control Node)
        • 2. 被管理节点(Managed Node / 被控主机)
        • 3. Inventory 主机清单
        • 4. Module 模块
        • 5. Ad-hoc 临时命令
        • 6. Playbook 剧本
        • 7. Role 角色
        • 8. Facts 资产信息
        • 9. Handler 处理器
        • 10. Template 模板
      • 核心通信原理
      • 三种返回状态
      • 简单区分概念
    • 安装配置
      • yum 安装
      • pip 安装
    • Ansible 命令
      • 主机连通
      • command模块
      • file模块
      • copy模块
  • Ansible Playbook
    • 示例——httpd
    • 示例——返回httpd网页内容
    • 示例——keepalived
    • 示例——批量创建用户

Linux运维7.2

ansible

概念

Ansible 是什么

Ansible是一款开源、无代理(agentless)的自动化运维工具,使用 Python 开发;

可以实现:批量远程执行命令、配置管理、应用部署、持续交付、编排任务。

核心特点:不需要在被管理机器安装客户端,依托 SSH 通信。

核心架构组成

1. 控制节点(Control Node)

运行 ansible 的服务器,只需要一台

所有任务从控制节点发起,依赖:Python、OpenSSH。

2. 被管理节点(Managed Node / 被控主机)

被批量操作的服务器;

只需满足:开启 SSH、自带 Python(绝大多数 Linux 默认具备)。

3. Inventory 主机清单

定义所有被控主机列表,Ansible 知道要操作哪些机器

默认文件:/etc/ansible/hosts

支持分组、变量、主机别名、动态清单。

示例:

[web]192.168.1.10192.168.1.11[db]192.168.1.20
4. Module 模块

Ansible 的最小执行单元,相当于一条条封装好的功能函数。

  • 执行单条命令:

    ansible 主机-m模块名

    常见模块:

    command/shell/copy/file/yum/apt/service/user

command:不支持管道;shell:支持管道、特殊符号

5. Ad-hoc 临时命令

一次性执行的简短命令,适合简单批量操作,不保存任务

示例:

ansible web -m shell -a "df -h"
6. Playbook 剧本

使用YAML语言编写的任务文件,批量编排多步骤任务,可以持久保存、重复执行。

  • Play:定义对哪一组主机执行任务
  • Task:一个个要执行的动作(调用模块)

简易结构:

-name:部署nginxhosts:webtasks:-name:安装nginxyum:name=nginx state=present-name:启动服务service:name=nginx state=started enabled=yes
7. Role 角色

Playbook 的规范化封装,用于复用、模块化大型项目。

固定目录结构,把变量、任务、模板、文件分离;多套环境直接调用 role,企业主流用法。

8. Facts 资产信息

Ansible 连接主机后自动采集的主机信息:CPU、内存、IP、系统版本等;

可以直接在 playbook 中作为变量引用。

9. Handler 处理器

只有当changed 状态触发才执行的任务,多用于服务重启。

例如:配置文件修改后,才执行重启 nginx。

10. Template 模板

基于 Jinja2 模板语法的配置文件,可以写入变量,推送至远端主机。后缀一般.j2

核心通信原理

控制节点 → SSH → 被控节点

  1. 控制节点生成临时 Python 脚本
  2. 通过 SSH 传输到远端
  3. 远端执行脚本并返回结果
  4. 执行完毕自动删除临时脚本

三种返回状态

  • ok:成功,没有发生变更
  • changed:成功,主机资源发生修改(安装软件、修改文件)
  • failed:执行失败

简单区分概念

  1. Ad-hoc:临时单行命令(一次性)
  2. Playbook:yaml 脚本,多任务流程
  3. Role:标准化打包的 playbook,方便复用
  4. Inventory:管理主机名单
  5. Module:实际干活的功能单元

安装配置

yum 安装

  1. 配置EPEL网络yum源
[root@ansible ~]# yum install -y epel-release
  1. 安装ansible
[root@ansible ~]# yum install ansible -y

pip 安装

[root@ansible ~]# yum install python-pip[root@ansible ~]# pip install ansible

激活配置文件

[root@server1 ~]# cat /etc/ansible/ansible.cfg

[root@server1 ~]# ansible-config init --disabled > ansible.cfg

配置文件生成

[root@server1 ansible]# vim /etc/ansible/ansible.cfg

Inventory 主机清单配置文件

[root@server1 ansible]# vim /etc/ansible/hosts

查看主机配置信息

[root@server1 ansible]# ansible-inventory --graph

Ansible 命令

主机连通

[root@server ~]# ansible web -m ping

注意需要免密配置或者主机之间至少远程连接过一次

command模块

示例——获取主机名

file模块

增加文件

ansible rocky9-a'touch /tmp/test.txt'

删除文件

ansible rocky9 -a 'rm -f /tmp/test.txt'

创建目录

[root@server ~]# ansible web -m file -a 'path=/data/app state=directory'

创建链接文件

path=链接文件

src=源文件

[root@server ~]# ansible web -m file -a 'path=/data/bbb.jpg src=aaa.jpg state=link'

copy模块

src#被复制到远程主机的本地文件。可以是绝对路径,也可以是相对路径。如果路径是一个目录,则会递 归复制,用法类似于"rsync"content#用于替换"src",可以直接指定文件的内容dest#必选项,将源文件复制到的远程主机的**绝对路径**backup#当文件内容发生改变后,在覆盖之前把源文件备份,备份文件包含时间信息directory_mode#递归设定目录的权限,默认为系统默认权限force#当目标主机包含该文件,但内容不同时,设为"yes",表示强制覆盖;设为"no",表示目标主机的 目标位置不存在该文件才复制。默认为"yes"others#所有的 file 模块中的选项可以在这里使用

复制文件

[root@server ~]# ansible web -m copy -a 'src=~/hello dest=/data/hello'

给定内容生成文件,并制定权限

[root@server ~]# ansible web -m copy -a 'content="I am keer\n" dest=/data/name mode=666'

覆盖

[root@server ~]# ansible web -m copy -a 'content="I am keerya\n" backup=yes dest=/data/name mode=666'

fetch模块

该模块用于从远程某主机获取(复制)文件到本地。

dest#用来存放文件的目录src#在远程拉取的文件,并且必须是一个file,不能是目录

cron模块

用于管理cron计划任务的。

day# 日应该运行的工作( 1-31, *, */2, )hour# 小时 ( 0-23, *, */2, )minute# 分钟( 0-59, *, */2, )month# 月( 1-12, * , */2, )weekday# 周 ( 0-6 for Sunday-Saturday,, )job# 指明运行的命令是什么name# 定时任务描述reboot# 任务在重启时运行,不建议使用,建议使用special_timespecial_time# 特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly (每周),daily(每天),hourly(每小时) state# 指定状态,present表示添加定时任务,也是默认设置,absent表示删除定时任务user# 以哪个用户的身份执行

yum模块

name #所安装的包的名称 state #present--->安装, latest--->安装最新的, absent---> 卸载软件。 update_cache #强制更新yum的缓存 conf_file #指定远程yum安装时所依赖的配置文件(安装本地已有的包)。 disable_pgp_check #是否禁止GPG checking,只用于`present`or `latest`。 disablerepo #临时禁止使用yum库。 只用于安装或更新时。 enablerepo #临时使用的yum库。只用于安装或更新时。

service模块

arguments#命令行提供额外的参数enabled#设置开机启动。 =yes/true 开机自启 ; =no/flase 开机关闭name#服务名称runlevel#开机启动的级别,一般不用指定。sleep#在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。(定义在剧本中。)state#有四种状态,分别为:#started--->启动服务#stopped--->停止服务#restarted--->重启服务#reloaded--->重载配置

user模块

comment# 用户的描述信息createhome# 是否创建家目录force# 在使用state=absent时, 行为与userdel –force一致.group# 指定基本组groups# 指定附加组,如果指定为(groups=)表示删除所有组home# 指定用户家目录move_home# 如果设置为home=时, 试图将用户主目录移动到指定的目录name# 指定用户名non_unique# 该选项允许改变非唯一的用户ID值password# 指定用户密码remove# 在使用state=absent时, 行为是与userdel –remove一致; remove=yes //删除干净shell# 指定默认shellsystem# 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户uid# 指定用户的uid

group模块

gid#设置组的GID号name#指定组的名称state#指定组的状态,默认为创建,设置值为absent为删除system#设置值为yes,表示创建为系统组

script模块

该模块用于将本机的脚本在被管理端的机器上运行。

[root@server ~]# vim /tmp/df.sh#!/bin/bashdate>>/tmp/disk_total.logdf-lh>>/tmp/disk_total.log[root@server ~]# chmod +x /tmp/df.sh

setup模块

该模块主要用于收集信息,是通过调用facts组件来实现的。

facts组件是Ansible用于采集被管机器设备信息的一个功能,我们可以使用setup模块查机器的所有facts信息,可以使用filter来查看指定信 息。整个facts信息被包装在一个JSON格式的数据结构中,ansible_facts是最上层的值。

facts就是变量,内建变量 ,每个主机的各种信息,cpu颗数、内存大小等。会存在facts中的某个变量中。调用后返回很多对应主机的信 息,在后面的操作中可以根据不同的信息来做不同的操作。如redhat系列用yum安装,而debian系列用apt来安装软件。

lineinfile

功能:修改或删除文件内容,与系统中的 sed 命令类似;

主要参数如下: path#指定要操作的文件regexp#使用正则表达式匹配对应的行line#修改为新的内容insertafter#将文本插入到“指定的行”之后insertbefore#将文本插入到“指定的行”之前state#删除对应的文本时,需要state=absentbackrefs#1.支持后向引用、2.当未匹配到内容则不操作文件backup#是否在修改文件之前对文件进行备份create#当要操作的文件并不存在时,是否创建对应的文件

Ansible Playbook

示例——httpd

--- - hosts: web become:yestasks: - name: Install the Apache ansible.builtin.yum: name: httpd state: present - name: Startservicehttpd,ifnot started ansible.builtin.service: name: httpd state: started enable:yes- name: creat index.html ansible.builtin.copy: content:"www.westos.org\n"dest: /var/www/html/index.html

测试运行

[devops@server1 ansible]$ ansible-playbook apache.yml

[devops@server1 ~]$curlserver2

示例——返回httpd网页内容

--- - hosts: lamp become: yes tasks: - name: Install the Apache ansible.builtin.yum: name: httpd state: present - name: Start service httpd, if not started ansible.builtin.service: name: httpd state: started enabled: yes - name: creat index.html ansible.builtin.copy: content: "{{ ansible_hostname }}\n" dest: /var/www/html/index.html - name: Ensure the default Apaceh port is 80 ansible.builtin.lineinfile: path: /etc/httpd/conf/httpd.conf regexp: '^Listen' insertafter: '^#Listen' line: Listen 80 notify: restart service httpd handlers: - name: restart service httpd ansible.builtin.service: name: httpd state: restarted - hosts: localhost gather_facts: false become: false tasks: - name: Check that you can connect (GET) to a page and it returns a status 200 ansible.builtin.uri: url: http://192.168.234.162 return_content: true register: result - name: Print return information from the previous task ansible.builtin.debug: var: result

示例——keepalived

[devops@server1 root]$cd/home/devops/ansible/[devops@server1 ansible]$sudovim/etc/ansible/hosts

[hacluster]
192.168.234.161 state=MASTER pri=100
192.168.234.162 state=BACKUP pri=80

[hacluster:vars]
interface=eth0
router_id=61
vip=192.168.234.200

[devops@server1 ansible]$vimkeepalived.yml --- - hosts: hacluster#become: yestasks: - name: Install the keepalived ansible.builtin.yum: name: keepalived state: present - name: configure the keepalived ansible.builtin.template: src: keepalived.conf.j2 dest: /etc/keepalived/keepalived.conf notify: restartservicekeepalived - name: Startservicekepalived ansible.builtin.service: name: keepalived state: started enabled:yeshandlers: - name: restartservicekeepalived ansible.builtin.service: name: keepalived state: restarted

[devops@server1 ansible]$ yuminstall-ykeepalived.x86_64[devops@server1 ansible]$cd[devops@server1 ~]$cd/etc/keepalived/[devops@server1 keepalived]$lskeepalived.conf[devops@server1 keepalived]$cpkeepalived.conf /home/devops/ansible/[devops@server1 keepalived]$cd/home/devops/ansible/[devops@server1 ansible]$lsapache.yml keepalived.conf keepalived.yml[devops@server1 ansible]$mvkeepalived.conf keepalived.conf.j2[devops@server1 ansible]$vimkeepalived.conf.j2[devops@server1 ansible]$sudoansible-playbook keepalived.yml

! Configuration File for keepalived

global_defs {
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}

vrrp_instance VI_1 {
state {{ state }}
interface {{ interface }}
virtual_router_id {{ router_id }}
priority {{ pri }}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
{{ vip }}
}
}

运行

[devops@server1 ansible]$ ansible-playbook keepalived.yml

测试

[devops@server1 ansible]$ipa

示例——批量创建用户

[devops@server1 ansible]$vimuser.yml --- - hosts: db tasks: - name: Add the user ansible.builtin.user: name:"{{ item.user }}"password:"{{ item.pass | password_hash('sha512') }}"state: present loop: -{user: user1, pass: pass1}-{user: user2, pass: pass2}

运行

[devops@server1 ansible]$ ansible-playbook user.yml

[root@node1 ~]# cat /etc/shadow

示例——结合haproxy

[devops@server1 ansible]$ vim hosts

[devops@server1 ansible]$ vim haproxy.yml --- - hosts: haproxy,webservers become: yes tasks: - name: deploy haproxy block: - name: Install the haproxy ansible.builtin.yum: name: haproxy state: present - name: configure the haproxy ansible.builtin.template: src: haproxy.cfg.j2 dest: /etc/haproxy/haproxy.cfg notify: restart service haproxy - name: Start service haproxy ansible.builtin.service: name: haproxy state: started enabled: yes when: ansible_hostname == 'server1' - name: deploy apache block: - name: Install the Apache ansible.builtin.yum: name: httpd state: present - name: Start service httpd ansible.builtin.service: name: httpd state: started enabled: yes - name: creat index.html ansible.builtin.copy: content: "{{ ansible_hostname }}\n" dest: /var/www/html/index.html - name: Ensure the default Apaceh port is {{ http_port }} ansible.builtin.template: src: httpd.conf.j2 dest: /etc/httpd/conf/httpd.conf notify: restart service httpd when: ansible_hostname in groups['webservers'] handlers: - name: restart service haproxy ansible.builtin.service: name: haproxy state: restarted - name: restart service httpd ansible.builtin.service: name: httpd state: restarted

运行测试

[devops@server1 ansible]$ ansible-playbook haproxy.yml

http://www.cnnetsun.cn/news/4088236.html

相关文章:

  • 2026年广州智慧燃气安全监测管理系统的建设与服务商观察
  • 元初混沌体系架构 第二卷 第七十五篇 高轨、中轨、低轨星际分层组网定则
  • CN——数据链路层(下)
  • 【推理优化】投机解码:用一个小模型加速大模型
  • 基于STM32与FFT的桌面模拟频谱分析仪DIY全解析
  • 护网行动攻防实战指南:从靶场训练到红蓝队面试核心解析
  • 大模型应用成本优化实战:基于提示缓存技术节省90% Token开销
  • GPT API实战指南:三步构建稳定可复现的AI工作流
  • MySQL 入门指南:从零开始掌握数据库核心与 SQL 实战
  • 本地门店线上经营选什么?小程序商城、预约工具和会员系统对比
  • 基于智能体工作流的大语言模型种族偏见缓解:原理、架构与工程实践
  • 智能客服机器人答不上来?90%是知识库问题而非模型问题
  • 【第三章 21】MQTT 完整的抖动检测与告警系统:整合心跳检测、连接间隔统计、可视化数据生成和自动处理策略
  • 拖延的真相:你不是懒,你是怕
  • 基于LLM智能体与Text2SQL的安全警报自动化调查系统设计与实践
  • 3分钟上手:不花一分钱,把VR视频转换成可自由探索的2D画面,VR-Reversal实测指南
  • Pandas安装全攻略:从原理到实践,解决Python数据分析环境配置难题
  • WOA-HKELM混合算法在多变量回归预测中的应用
  • 戴尔笔记本风扇控制终极指南:DellFanManagement 从安装到深度调优一次讲透
  • 告别 Arduino ESP32 下载失败:从源头排查到强制刷机的完整指南
  • MySQL存储引擎深度解析:MyISAM与InnoDB核心差异与选型指南
  • 2026下半年浙江软考时间关键点
  • Kali Linux 安装指南:从虚拟机到物理机的完整部署与配置
  • 第七章 文本表示:主题表示(二)
  • 保时捷日内瓦新车解析:电动性能与燃油精粹的平行进化
  • NCM转MP3只需一次拖拽:ncmdump让加密歌曲重获自由
  • 基于计算机视觉的体感控制器Quaddle:零硬件门槛实现机器人控制
  • Qwen3.8-Max 开源超大杯正式发布,如何让 AI 无感切换新模型
  • 基于Minimax官方Skill的导演Skill开发:从编排思维到工程实践
  • 大模型产品评估,别把调用量当成效果