自动化运维Ansible


一、Ansible介绍

Ansible 是一个开源的 IT 自动化工具,主要用于配置管理、应用部署、任务编排和基础设施自动化。它由 Red Hat 维护,采用 无代理(Agentless)架构,通过 SSH(Linux/Unix)或 WinRM(Windows)连接受管主机执行任务。

核心特点

  • 无代理:受管节点无需安装 Ansible 客户端,只需 SSH/WinRM 和 Python 等基础环境。
  • YAML 描述:使用易读的 YAML 编写 Playbook。
  • 幂等性:大多数模块可重复执行,结果一致,避免重复操作导致状态漂移。
  • Push 模式:控制节点主动推送任务到目标主机。
  • 模块化:通过大量内置模块和 Collection 扩展能力。
  • 声明式与过程式结合:Playbook 描述目标状态,也可按任务顺序编排。

二、Ansible安装

📦 一、 标准在线安装流程(适用于有公网环境)

如果你在阿里云、腾讯云或者能连外网的虚拟机里,按以下步骤操作:

  1. 安装 EPEL 扩展源

Ansible 不在系统的默认基础源里,必须先装 EPEL(Extra Packages for Enterprise Linux)。

sudo dnf install epel-release -y
  1. (可选)替换国内镜像源加速 这就是你之前遇到下载卡在 6KB/s 的解决方式。如果不换源,下载速度可能极慢。
sudo sed -i 's|^metalink=|#metalink=|g' /etc/yum.repos.d/epel.repo
sudo sed -i 's|^#baseurl=https://download.example/pub/epel/|baseurl=https://mirrors.aliyun.com/epel/|g' /etc/yum.repos.d/epel.reposudo 
dnf clean all && sudo dnf makecache
  1. 安装 Ansible 核心包
# 安装完整版(包含大量社区模块)
sudo dnf install ansible -y

# 或者只安装核心版(如果你只需基础功能,体积更小)sudo dnf install ansible-core -y
  1. 验证安装
ansible --version

🏢 二、 离线安装流程(适用于蜂巢等纯内网环境)

这是面试高频考点:如果客户现场完全断网,怎么办?

  1. 制作离线源(在外网机器上操作)
下载 ansible 及其所有依赖到本地目录
sudo dnf download --resolve 
ansible -y --downloaddir=/tmp/ansible-rpms/
  1. 将 RPM 包传入内网 通过 U 盘或堡垒机,将 /tmp/ansible-rpms/ 目录下的所有 .rpm 文件拷贝到内网服务器。
  2. 内网安装
cd /root/ansible-rpms/
# 使用 localinstall 自动解决依赖
sudo dnf localinstall *.rpm -y

🛠️ 三、 装完后的“必做”三件事(核心配置)

  1. 配置 SSH 免密登录(Ansible 的生命线)

如果控制机连不上被控机,Ansible 无法工作。

生成密钥(一路回车)
ssh-keygen -t rsa -b 2048     
  
# 下发公钥到目标机器
ssh-copy-id root@192.168.1.100
  1. 配置主机清单(Inventory) 编辑 /etc/ansible/hosts,把你要管理的机器分组写进去。
[edge_nodes]
192.168.1.100 ansible_host=192.168.1.100
192.168.1.101 ansible_host=192.168.1.101

补充:下载安装python3-libselinux(如果未安装)

sudo dnf install -y python3-libselinux

在 Ansible 运维中,它到底管什么?

当你的被控端开启了 SELinux 时,Ansible 在执行以下任务都需要调用这个包:

  • 管文件(file/copy/template模块):Ansible 把文件拷贝过去后,可能需要调用这个包去修改文件的 SELinux 安全上下文(Context,比如之前代码里的 setype=samba_share_t)。
  • 管用户(user模块):创建用户时,可能需要调用它确保用户的 SELinux 角色正确。
  • 管服务/端口(firewalld模块):修改防火墙规则时,可能需要同步修改 SELinux 的放行策略。
  • 管策略(sefcontext模块):直接用它来配置 SELinux 规则。

三、 Ad-hoc 模式(临时批量执行,最常用)

格式:ansible [主机组/IP] -m [模块] -a [参数]

  1. 连通性测试(最基础)ansible all -m ping(面试话术:新机器上架后,第一件事就是全量 ping 一下,确认 SSH 免密和 Python 环境都正常。)
  2. 批量执行 Shell 命令(最高频)ansible edge_nodes -m shell -a "df -h" ansible edge_nodes -m shell -a "systemctl status nginx"(面试话术:每天早上用这个批量拉取 40 台工控机的磁盘水位和关键服务状态。)
  3. 批量分发文件ansible edge_nodes -m copy -a "src=/tmp/agent.rpm dest=/root/agent.rpm mode=0755"(面试话术:升级监控组件时,先用 copy 模块把新的 rpm 包或二进制文件推到所有机器上。)
  4. 批量修改主机名(你刚实操过的)ansible 192.168.1.100 -m hostname -a "name=ts-bl-01"
  5. 批量收集系统信息(面试装逼用)  🛠️ 方法一:导入到文本文件中(注意,不是json文件)ansible all -m setup > all_facts.json(面试话术:这个命令能收集所有机器的 ansible_facts,比如 CPU 型号、内存大小、操作系统版本,用来做 CMDB 资产盘点极其好用。)

🛠️ 方法二:使用 filter 过滤参数(最常用的 SRE 技巧)

如果你只想看某几个特定的指标(比如只看操作系统版本、或者只看内存大小),加上 -a 参数配合 filter 过滤,极其清爽:

只查所有机器的操作系统类型和版本
ansible all -m setup -a "filter=ansible_distribution*"

# 只查所有机器的总内存大小
ansible all -m setup -a "filter=ansible_memtotal_mb"

# 只查所有机器的 CPU 核心数
ansible all -m setup -a "filter=ansible_processor_vcpus"

🛠️ 方法三:配合 jq 命令(高阶玩家装逼用)

如果你把数据存成了 JSON 文件,建议配合 Linux 下的 JSON 处理神器 jq,直接把非结构化文本变成好看的数据:

ansible all -m setup | jq '.ansible_facts.ansible_hostname'

它会自动帮你把每台机器的名字单独提取出来,排版极佳。


🛠️ 方法四:生成 CMDB 可视化报表(终极降维打击)(需要先安装下方工具)

在真实的乙方运维里,纯看文本太 low 了。有一个开源工具叫 ansible-cmdb。你可以把 setup 的输出导出来,一键生成极其漂亮的 HTML 网页资产报表:

1. 导出数据
ansible -m setup --tree /tmp/facts all

# 2. 生成网页
ansible-cmdb /tmp/facts > /tmp/cmdb.html

(面试话术:只要把这个 HTML 报表发给甲方老板,他立马就能看到全厂几百台机器的 CPU、内存、系统版本。)


第一阶段:安装必备工具(填坑)

因为你之前的系统里没有 Python 的包管理器,所以必须先装 pip。

  1. 安装 pip3:
yum install -y python3-pip

(如果是 CentOS 8/Rocky 等系统,把 yum 换成 dnf)

  1. 使用国内镜像源安装 ansible-cmdb:
pip3 install ansible-cmdb -i https://pypi.tuna.tsinghua.edu.cn/simple

第二阶段:生成报表数据

这里分为“收集数据”和“生成网页”两步。这两步一定要分开执行,因为 Ansible 的终端输出带有杂乱的提示符,直接用管道传给 cmdb 会报错。

  1. 收集所有主机的信息(导出为文件):
ansible all -m setup --tree /tmp/facts -f 50
  • -m setup:收集机器底层的硬件、系统信息。
  • --tree /tmp/facts:把收集到的纯 JSON 数据存入本地的 /tmp/facts/ 目录中。
  • -f 50:开启并发,一次处理 50 台,加快收集速度(机器少可以不加)。
  1. 读取数据,生成 HTML 报表:
ansible-cmdb /tmp/facts > /tmp/cmdb.html
  • 这条命令极快,它读取上一步生成的文件夹,输出一个静态网页文件,保存为 cmdb.html。

第三阶段:如何查看生成的 HTML 页面

网页生成在服务器的 /tmp/cmdb.html,千万不要用 cat 或 vim 去看,你会看到满屏的代码。你需要把它放进浏览器里。

方法 A:下载到本地(最简单)

  • 如果你用 Xshell / MobaXterm / FinalShell 等 SSH 工具,直接用它们自带的文件管理窗口,进入 /tmp/ 目录,把 cmdb.html 下载到你的 Windows 电脑上,双击打开。
  • 或者在本地电脑的 CMD/PowerShell 里执行: scp root@你的服务器IP:/tmp/cmdb.html D:/

方法 B:在服务器上开个临时网页(不用下载)

在服务器上执行:

cd /tmppython3 -m http.server 8000

然后打开你电脑的浏览器,访问 http://你的服务器IP:8000/cmdb.html,看完后回终端按 Ctrl+C 结束。

四、Playbook 模式(正式自动化发布)

  1. 运行剧本(最常用) ansible-playbook init_system.yml  我为你编写了一份生产级的高并发系统初始化 Ansible 剧本(init_system.yml)。它涵盖了安全、时间同步、内核调优等核心配置,这也是你面试时证明你“懂底层”的硬核素材。--- - name: 高并发服务器系统底层初始化调优 (OS Level Init) hosts: all become: yes gather_facts: yes vars: ntp_server: "ntp.aliyun.com" max_file_descriptors: 1048576 # 单进程最大文件句柄,为 15 万长连接预留冗余 tasks: # ================= 1. 基础环境与安全加固 ================= - name: 关闭防火墙 (内网环境,或由物理防火墙统一接管) systemd: name: firewalld state: stopped enabled: no ignore_errors: yes - name: 关闭 SELinux selinux: state: disabled ignore_errors: yes - name: 关闭 Swap 交换分区 (K8s/中间件 节点严禁使用 Swap,防 OOM 机制失效) command: swapoff -a when: ansible_swaptotal_mb > 0 - name: 注释 /etc/fstab 中的 swap 挂载 (防重启失效) replace: path: /etc/fstab regexp: '^([^#].*?\sswap\s+sw\s+.*)$' replace: '# \1' - name: 配置时间同步 (安装 Chrony) yum: name: chrony state: present when: ansible_os_family == "RedHat" # 👇 就是这里,把 template 换成了 copy 模块,直接把配置写死在剧本里 - name: 写入 Chrony 配置并启动 (Inline 方式) copy: dest: /etc/chrony.conf content: | # 使用阿里云 NTP 服务器 server {{ ntp_server }} iburst driftfile /var/lib/chrony/drift makestep 1.0 3 rtcsync logdir /var/log/chrony notify: Restart Chrony # ================= 2. 系统级资源限制 (突破长连接瓶颈) ================= - name: 配置系统全局文件句柄限制 (sysctl) sysctl: name: fs.file-max value: "{{ max_file_descriptors }}" sysctl_set: yes state: present reload: yes - name: 配置 limits.conf 用户级限制 blockinfile: path: /etc/security/limits.conf block: | * soft nofile {{ max_file_descriptors }} * hard nofile {{ max_file_descriptors }} * soft nproc 65535 * hard nproc 65535 # ================= 3. 高并发 TCP 内核参数调优 (核心绝杀点) ================= - name: 调优 TCP 协议栈及网络内核参数 (针对 15 万长连接与高并发 QPS) sysctl: name: "{{ item.name }}" value: "{{ item.value }}" sysctl_file: /etc/sysctl.d/99-high-concurrency.conf sysctl_set: yes state: present reload: yes loop: # 1. 增大半连接队列 (防 SYN Flood 与高并发建连) - { name: 'net.core.somaxconn', value: '65535' } - { name: 'net.ipv4.tcp_max_syn_backlog', value: '65535' } - { name: 'net.ipv4.tcp_syncookies', value: '1' } # 2. 加快 TIME_WAIT 状态回收 (针对短连接高频建连断开) - { name: 'net.ipv4.tcp_tw_reuse', value: '1' } - { name: 'net.ipv4.tcp_max_tw_buckets', value: '65535' } - { name: 'net.ipv4.tcp_fin_timeout', value: '30' } # 3. 增大连接跟踪表 (防止 Calico/kube-proxy 的 conntrack 表打满) - { name: 'net.netfilter.nf_conntrack_max', value: '1048576' } # 4. 开启 TCP Keepalive 探测 (防假死连接占用资源) - { name: 'net.ipv4.tcp_keepalive_time', value: '600' } - { name: 'net.ipv4.tcp_keepalive_intvl', value: '30' } - { name: 'net.ipv4.tcp_keepalive_probes', value: '3' } # ================= 4. 安装运维基础依赖工具 ================= - name: 安装常用排障与监控工具 yum: name: - wget - curl - vim - net-tools - tcpdump - sysstat - telnet state: present when: ansible_os_family == "RedHat" # ================= Handlers 定义 ================= handlers: - name: Restart Chrony systemd: name: chronyd state: restarted enabled: yes
  1. 语法检查(上线前必做)ansible-playbook init_system.yml --syntax-check(面试话术:写错一个缩进,Playbook 就会报错。上线前我都会先跑 syntax-check 防止尴尬。)
  2. “干跑”模式(Dry Run,极度安全)ansible-playbook init_system.yml --check(面试话术:如果不确定剧本执行后会发生什么,加上 --check,它会告诉你“将要发生什么改变”,但绝对不会真正去操作,防止把生产环境搞崩。)
  3. 指定主机清单执行ansible-playbook -i hosts_prod init_system.ymlhosts_prod 在这里就是一个文件的名字(通常里面记录的是生产环境的服务器IP和分组信息),它也就是 Ansible 里的 Inventory(主机清单)。
  1. 恢复方式:使用“回滚专用” Playbook(推荐)

你可以新建一个文件叫 rollback_init.yml,把以下内容复制进去,然后运行它:

---
- name: 回滚高并发内核与系统调优 (保留 SELinux 和防火墙关闭)
  hosts: edge_nodes
  become: yes
  
  tasks:
    # 1. 恢复 Swap (取消注释 fstab 并开启 swap)
    - name: 恢复 /etc/fstab 中的 swap 挂载配置
      replace:
        path: /etc/fstab
        regexp: '^# (.*?\sswap\s+sw\s+.*)$'
        replace: '\1'

    - name: 开启 Swap 交换分区
      command: swapon -a
      ignore_errors: yes # 如果本来就没配 swap,忽略报错

    # 2. 移除全局文件句柄限制的优化配置
    - name: 移除 limits.conf 中的自定义限制配置块
      blockinfile:
        path: /etc/security/limits.conf
        block: |
          * soft nofile 1048576
          * hard nofile 1048576
          * soft nproc 65535
          * hard nproc 65535
        state: absent # 清除这个配置块

    # 3. 删除 TCP 内核调优文件并重新加载系统默认配置
    - name: 删除自定义的高并发 sysctl 配置文件
      file:
        path: /etc/sysctl.d/99-high-concurrency.conf
        state: absent

    - name: 重新加载系统默认的 sysctl 配置
      command: sysctl --system

恢复SElinux与防火墙之外的配置

ansible-playbook rollback_init.yml

五、 进阶与排障(展现高级 SRE 素养)

  1. 查看主机清单(排查为什么连不上某些机器)ansible-inventory --list # 或者看更直观的树状图 ansible-inventory --graph  ·
  2. 控制并发速度(应对几十台机器的网络瓶颈)ansible all -m ping -f 10(面试话术:-f 参数控制并发数,默认是 5。如果在车间网络不好时批量推大文件,我会把并发调大,或者为了安全调小。)
  3. 后台异步执行(应对耗时极长的任务)ansible all -B 3600 -P 0 -m shell -a "yum update -y"(面试话术:比如要批量给 40 台机器打内核补丁,耗时超过 SSH 默认超时时间(10秒)。我会用 -B 3600(放到后台跑 1 小时),用 -P 0 让其静默跑,防止 SSH 断连。)

🎤 面试终极绝杀话术(结合上面的命令讲业务):

面试官如果问:“*你平时怎么用 Ansible 管理边缘节点?*”

“我的日常运维极度依赖 Ansible。

新机器进来,我第一件事是用 ansible -m ping 测连通性,然后跑一个初始化 Playbook。

每天早上,我会用 ansible -m shell 配合 df -h 和 free -m 批量巡检磁盘和内存。

如果遇到发版或更新组件,我会先写好 YAML,用 ansible-playbook --syntax-check 检查语法,用 --check 跑一遍 Dry Run 看看风险,确认没问题了再大批量推下去。

遇到网络极差的情况,我会调整 -f 并发参数或者用 -B 放到后台异步执行。利用 Ansible 的幂等性,即使我每天频繁跑这些命令,也绝对不会把生产环境跑乱。”

Ansible 常用模块完全指南

一、 基础概念与命令参数

1. 什么是 Ansible 模块?

模块就是 Ansible 的“命令”,无论是命令行还是脚本中都需要调用。常用的有 yum、copy、template 等。

2. 语法格式

ansible <pattern_goes_here> -m <module_name> -a <arguments>
# 也就是:
ansible  匹配模式   -m  模块  -a  '需要执行的内容'

注:默认模块为 command,执行常规的 shell 命令。

3. 命令行参数大全

参数说明
-v, --verbose输出更详细的执行过程信息,-vvv 可得到所有信息
-i PATH, --inventory=PATH指定 inventory(清单)信息,默认 /etc/ansible/hosts
-f NUM, --forks=NUM并发线程数,默认 5 个线程
--private-key=FILE指定密钥文件
-m NAME, --module-name=NAME指定执行使用的模块
-M DIR, --module-path=DIR指定模块存放路径,默认 /usr/share/ansible
-a 'ARGUMENTS', --args模块参数
-k, --ask-passSSH 认证密码
-K, --ask-sudo-passsudo 用户的密码(–sudo 时使用)
-o, --one-line标准输出至一行
-s, --sudo相当于 Linux 系统下的 sudo 命令
-t DIR, --tree=DIR输出信息至 DIR 目录下,结果文件以远程主机命名
-T SECONDS, --timeout指定连接远程主机的最大超时,单位是秒
-B NUM, --background后台执行命令,超 NUM 秒后中止正在执行的任务
-P NUM, --poll定期返回后台任务进度
-u USERNAME, --user指定远程主机以 USERNAME 运行命令
-U SUDO_USERNAME使用 sudo,相当于 Linux 下的 sudo 命令
-c CONNECTION, --connection指定连接方式(paramiko、ssh、local,local 常用于 crontab)
-l SUBSET, --limit指定运行主机
-l ~REGEX, --limit=~REGEX指定运行主机(正则)
--list-hosts列出符合条件的主机列表,不执行任何命令

4. 执行的状态返回信息(颜色)

  • 🟢 绿色:执行成功并且不需要做改变的动作
  • 🟡 黄色:执行成功并且对目标主机做变更
  • 🔴 红色:执行失败

二、 模块分类概览

分类包含模块说明
文件模块copy, file, lineinfile, synchronize复制文件、创建/删除目录、替换内容、rsync同步
软件包模块package, yum, apt, dnf, pip系统包管理器及 Python 包管理
系统模块firewalld, reboot, service, user防火墙、重启、服务管理、用户管理
Net Toolsget_url, nmcli, uri下载文件、管理网络、与 WEB 服务交互

三、 21 个常用模块详解

1. user 模块

参数解释
name要创建、修改、移除的用户名
password设置用户密码。此处只能使用加密密码作为值
system设置为 yes 表示创建一个系统用户,只能用于创建不能用于修改已有用户为系统用户
state创建用户(present)还是删除用户(absent)。默认为 present
createhome创建家目录,或者已有的用户但家目录不存在也会创建。设置为 no 则不创建家目录
home指定要创建的家目录路径
move_home如果设置为 yes, 则 “home=” 则表示将家目录移动到此选项指定的路径下
uid设置用户的 uid
group设置用户的 primary group
groups将用户加入到辅助组列表中。如果设置 “groups=”, 则会将此用户从所有辅助组中移除
shell设置用户的 shell
force配合 state=absent 时,等价于 userdel --force,即强制删除用户、家目录和邮件列表
remove配合 state=absent 时,等价于 userdel --remove,即删除家目录和邮件列表
update_passworduser 是幂等模块,”always” 将总是修改密码。”on_create” 将只在创建用户时设置密码

代码示例:

# 临时命令使用 user 模块来确保 newbie 用户存在于 node1 上,并且其 UID 为 4000
[student@ansible ~/ansible]$ ansible node1 -m user -a 'name=newbie uid=4000 state=present'
[root@node1 ~]# id newbie
uid=4000(newbie) gid=4000(newbie) 组=4000(newbie)

# 设置 newbie 用户密码
[student@ansible ~/ansible]$ ansible node1 -m user -a 'name=newbie password=$1$x5dsadpB$PqzHJZD//CqCaxOZoZcj71'

# 创建无家目录,不能登录的用户
[student@ansible ~/ansible]$ ansible node1 -m user -a 'name=zhao create_home=no shell=/sbin/nologin state=present'

2. shell 模块

在远程主机上执行复杂的命令。

语法:ansible 主机清单 -m shell -a '执行命令'

代码示例:

# 临时命令使用 shell 模块来删除 node1 节点中的用户 newbie
[student@ansible ~/ansible]$ ansible node1 -m shell -a 'userdel -r newbie'
node1 | CHANGED | rc=0 >>

3. copy 模块

参数解释
backup=[yes|no]拷贝的同时也创建一个包含时间戳信息的备份文件,默认为 no
dest目标路径,只能是绝对路径,如果拷贝的文件是目录,则目标路径必须也是目录
content直接以 content 给定的字符串或变量值作为文件内容保存到远程主机上,它会替代 src 选项
directory_mode当对目录做递归拷贝时,设置了 directory_mode 将会使得只拷贝新建文件
follow=[yes|no]是否追踪到链接的源文件
force=[yes|no]设置为 yes(默认)时,将覆盖远程同名文件。设置为 no 时,忽略同名文件的拷贝
group设置远程文件的所属组
owner设置远程文件的所有者
mode设置远程文件的权限。使用数值表示时不能省略第一位,如 0644。也可以使用 ‘u+rwx’ 或 ‘u=rw,g=r,o=r’ 等方式设置
src拷贝本地源文件到远程,可使用绝对路径或相对路径。如果路径是目录,且目录后加了斜杠 “/”, 则只会拷贝目录中的内容到远程,如果目录后不加斜杠,则拷贝目录本身和目录内的内容到远程。

代码示例:

# 将源文件,copy 到被控端
[student@ansible ~/ansible]$ ansible node1 -m copy -a 'src=/etc/fstab dest=/var/tmp/fstab'

4. template 模块

参数解释
backup拷贝的同时也创建一个包含时间戳信息的备份文件,默认为 no
dest目标路径
force设置为 yes (默认)时,将覆盖远程同名文件。设置为 no 时,忽略同名文件的拷贝
group设置远程文件的所属组
owner设置远程文件的所有者
mode设置远程文件的权限。使用数值表示时不能省略第一位,如 0644。
srcansible 控制器上 Jinja2 格式的模板所在位置,可以是相对或绝对路径
validate在复制到目标主机后但放到目标位置之前,执行此选项指定的命令。一般用于检查配置文件语法,正确则保存到目标位置。如果要引用目标文件名,则使用 %s。

代码示例:

[student@ansible ~/ansible]$ ansible node1 -m template -a 'src=/usr/share/doc/httpd/httpd-vhosts.conf dest=/etc/httpd/conf.d/httpd-vhosts.conf group=root owner=root mode=0644'

5. file 模块

参数解释
group设置文件的所属组
owner设置文件的所有组
mode修改权限
path指定代操作的文件
recurse递归修改文件属性,要求 state=directory
src原文件名
statedirectory: 如果目录不存在则递归创建 <br> file: 文件不存在时,不会被创建(默认值) <br> touch: 创建新文件 <br> link: 修改或创建软链接 <br> hard: 修改或创建硬链接 <br> absent: 目录和其中的文件会被递归删除,文件或链接将取消链接状态

代码示例:

# 修改文件的权限属性和 context 值
[student@ansible ~/ansible]$ ansible node1 -m file -a 'path=/var/tmp/fstab mode=g+w mode=o+w group=galaxy owner=galaxy setype=samba_share_t'

# 新建文件
[student@ansible ~/ansible]$ ansible node1 -m file -a 'path=/var/tmp/bbb state=touch'

# 新建目录
[student@ansible ~/ansible]$ ansible node1 -m file -a 'path=/var/tmp/cc state=directory'

# 删除文件或者目录
[student@ansible ~/ansible]$ ansible node1 -m file -a 'path=/var/tmp/cc state=absent'

# 创建软链接
[student@ansible ~/ansible]$ ansible node1 -m file -a 'dest=/var/tmp/chenyu src=/var/tmp/bbb state=link'

# 创建硬链接
[student@ansible ~/ansible]$ ansible node1 -m file -a 'dest=/var/tmp/chenyu1 src=/var/tmp/aaa state=hard'

6. lineinfile 模块

参数解释
path必须参数,指定要操作的文件路径
line必须参数,指定要替换的文本内容
regexp匹配正则语句,与要过滤的关键字
state状态语句:state=absent 则是删除,state=present 默认
backrefs表示是否开启反向引用,默认 no
create当文件不存在时,是否创建对应的文件
backup是否在修改文件之前对文件进行备份
insertafter借助 insertafter 参数可以将文本插入到”指定的行”之后
insertbefore借助 insertbefore 参数可以将文本插入到”指定的行”之前

代码示例:

# 通过正则匹配查找 /etc/selinux/config 文本中开头是 SELINUX= 的行,并替换成 SELINUX=disabled
[student@ansible ~/ansible]$ ansible node1 -m lineinfile -a 'path=/etc/selinux/config regexp="^SELINUX=" line="SELINUX=disabled"'

# 通过正则匹配查找 /etc/selinux/config 文本,并在文本末尾插入一行 www.alone.com
[student@ansible ~/ansible]$ ansible node1 -m lineinfile -a 'path=/etc/selinux/config regexp="EOF" line="www.alone.com"'

# 通过正则匹配查找 /etc/selinux/config 文本,并在文本行首插入一行 www.alone.com
[student@ansible ~/ansible]$ ansible node1 -m lineinfile -a 'path=/etc/selinux/config regexp="BOF" line="www.alone.com"'

# 通过正则匹配查找 /etc/selinux/config 文本,删除所有的 www.alone.com 字段.
[student@ansible ~/ansible]$ ansible node1 -m lineinfile -a 'path=/etc/selinux/config regexp="^www.alone.com" state=absent'

# 通过正则匹配查找 /etc/selinux/config 文本中在开头是 SELINUX=disabled 行的行后插入一段话 www.alone.com
[student@ansible ~/ansible]$ ansible node1 -m lineinfile -a 'path=/etc/selinux/config insertafter="^SELINUX=" line="www.alone.com"'

# 通过正则匹配查找 /etc/selinux/config 文本中在开头是 SELINUX=disabled 行的行前插入一段话 www.alone.com
[student@ansible ~/ansible]$ ansible node1 -m lineinfile -a 'path=/etc/selinux/config insertbefore="^SELINUX=" line="www.alone.com"'

7. yum_repository 模块

参数解释
baseurl地址
mirrorlist设置 mirrorlist 地址
description描述信息
enabled是否启用该仓库
file保存此仓库的文件,不设置该项的话则默认以 name 选项中的名称命名
gpgcheck是否要进行 gpgcheck
name仓库的名称
reposdir保存 .repo 文件的目录
staterepo 文件的状态,present/absent

代码示例:

# 配置 yum 仓库
[student@ansible ~/ansible]$ ansible node1 -m yum_repository -a 'file=server name=BaseOS description=BaseOS baseurl=file:///mnt/BaseOS enabled=yes gpgcheck=no'
[student@ansible ~/ansible]$ ansible node1 -m yum_repository -a 'file=server name=AppStream description=AppStream baseurl=file:///mnt/AppStream enabled=yes gpgcheck=no'

8. yum 模块

参数解释
name用于指定安装包的包名
state用于指定软件包的状态,默认值为 present
disable_gpg_check用于禁用对 rpm 包的公钥 gpg 验证,默认值为 no
enablerepo用于指定安装软件包时临时启用的 yum 源
disablerepo用于指定安装软件包时临时禁用的 yum 源
exclude排除哪些包不安装,仅在 state=present 或 latest 时生效
list类似于 yum list
update_cache强制更新 yum 的 cache

代码示例:

# 安装软件:通过 Yum 模块批量的安装 httpd 服务到指定主机上.
[student@ansible ~/ansible]$ ansible node1 -m yum -a "name=httpd state=installed"

# 卸载软件:通过 Yum 模块批量的卸载 httpd 服务主机.
[student@ansible ~/ansible]$ ansible node1 -m yum -a "name=httpd state=removed"

9. service 模块

参数解释
name此参数用于指定需要操作的服务名称
state此参数用于指定服务的状态, started、stopped、restarted、reloaded
enabled此参数用于指定是否将服务设置为开机启动项

代码示例:

# 设置服务开机自启动,设置 httpd 服务开机自启动.
[student@ansible ~/ansible]$ ansible node1 -m service -a "name=httpd state=started enabled=yes"

# 关闭服务开机自启动,关闭 httpd 服务开机自启动.
[student@ansible ~/ansible]$ ansible node1 -m service -a "name=httpd state=stopped enabled=no"

10. fetch 模块

参数解释
dest目标绝对路径
src复制的源文件路径,源文件只能是文件
flat改变拉取后的路径存储方式。如果设置为 yes, 且当 dest 以 “/” 结尾时,将直接把源文件的 basename 存储在 dest 下。显然,应该考虑多个主机拉取时的文件覆盖情况。
fail on missing当设置为 yes 时,如果拉取的源文件不存在,则此任务失败。默认为 no.
validate_checksum远程主机上的源文件。只能是文件,不支持目录。

代码示例:

# 将远程主机的 /etc/fstab 文件拉取到本地来,存储的名字为 /tmp/node1/etc/fstab
[student@ansible ~/ansible]$ ansible node1 -m fetch -a 'src=/etc/fstab dest=/tmp'

# 将某台远程主机的 /etc/fstab 文件拉取到本地来,存储的名字为 /tmp/fstab
[student@ansible ~/ansible]$ ansible node1 -m fetch -a 'src=/etc/fstab dest=/tmp/ flat=yes'

# 将远程主机的 /etc/fstab 文件拉取到本地来,存储的名字为 /tmp/fstab-node1
[student@ansible ~/ansible]$ ansible node1 -m fetch -a 'src=/etc/fstab dest=/tmp/fstab-{{inventory_hostname}} flat=yes'

11. firewalld 模块

参数解释
icmp_block在防火墙中添加或者移除的 ICMP 块
icmp_bolck_inversion开启/关闭防火墙区域 ICMP 报文反转功能
immediate如果将此配置设置为永久性,则应立即应用此配置,yes or no,默认 no
interface在防火墙中添加或移除 interface
masquerade在防火墙中开启或关闭 masquerade 功能
offline是否在防火墙离线时运行此模块,yes or no
permanent该配置是否在运行的防火墙配置中,或者在重新启动时仍然存在。注意,如果这是 no, immediate 被假定为 yes。
port在防火墙中添加或移除端口名称或端口范围。格式:PORT/PROTOCOL 或 PORT-PORT/PROTOCOL
rich_rulerich_rule 添加或删除到防火墙
service在防火墙中添加或移除服务名称。该服务必须在 firewall-cmd --get-services 的输出中列出
source在防火墙中添加或移除某个来源的网络
state启用或禁用一项设置。对于端口:该端口是否接受(enabled)或拒绝(disabled)连接。状态的(present)和(absent)只能在区域级别操作中使用。
timeout该规则应在非永久性时生效的时间,默认 0
zone添加或移除的防火墙区域。默认 public。

代码示例:

# 允许 http 流量的传入
[student@ansible ~/ansible]$ ansible node1 -m firewalld -a 'service=http permanent=yes state=enabled immediate=yes'

# 富规则 允许 192.168.111.0/24 主机 http 流量的传入
[student@ansible ~/ansible]$ ansible node1 -m firewalld -a 'zone=public rich_rule="rule family=ipv4 source address=192.168.111.0/24 service name=http accept" permanent=yes state=enabled immediate=yes'

12. replace 模块

参数解释
path必须参数,指定要操作的文件名称
regexp必须参数,指定一个正则表达式
replace指定最终要替换成的文本
backup在修改文件之前对文件进行备份, yes/no

代码示例:

# 将 /tmp/zsl 文件中的“abc”替换成“yyy”
[student@ansible ~/ansible]$ ansible node1 -m replace -a 'path=/tmp/zsl regexp="abc" replace="yyy"'

# 将 /tmp/zsl 文件中的“yyy”替换成“iii”,且把替换前的 /tmp/zsl 文件备份
[student@ansible ~/ansible]$ ansible node1 -m replace -a 'path=/tmp/zsl regexp="yyy" replace="iii" backup=yes'

13. parted 模块

参数解释
device指定硬盘设备路径 比如 /dev/vdb
label指定分区表类型 gpt mbr
number指定分区序号
part_start分区起始位置
part_end分区结束位置
state指定操作方式 创建(present) 、删除(absent) 、查信息(info)

代码示例:

# 新建扩展分区
[student@ansible ~/ansible]$ ansible node1 -m parted -a 'device=/dev/sda number=4 part_type=extended part_start=46GiB part_end=49.8GiB state=present'

# 新建逻辑分区
[student@ansible ~/ansible]$ ansible node1 -m parted -a 'device=/dev/sda number=5 part_type=logical part_start=46.1GiB part_end=48.2GiB state=present'

14. filesystem 模块

参数解释
dev要格式化的分区
fstype文件系统类型 比如 ext4 xfs
force强制格式化,如果以前分区中有数据

代码示例:

# 给 /dev/sda5 格式化,类型是 xfs
[student@ansible ~/ansible]$ ansible node1 -m filesystem -a 'fstype=xfs dev=/dev/sda5'

15. mount 模块

参数解释
path挂载点
src挂载的文件
fstype挂载的硬盘类型 比如 iso9660、ext4、xfs、nfs、cifs(samba)、ntfs
opts传递给 mount 命令的参数
statepresent 开机挂载,仅将挂载配置写入 /etc/fstab 并不会真的挂载 <br> mounted 挂载设备,并将配置写入 /etc/fstab <br> unmounted 卸载设备,不会清除 /etc/fstab 写入的配置 <br> absent 卸载设备,并清理 /etc/fstab 写入的配置

代码示例:

# 新建挂载点 /common
[student@ansible ~/ansible]$ ansible node1 -m file -a 'path=/common state=directory'

# 查看 /dev/sda5 的 UUID
[student@ansible ~/ansible]$ ansible node1 -m shell -a 'blkid /dev/sda5'

# 将分区 /dev/sda5 挂载到 /common 目录
[student@ansible ~/ansible]$ ansible node1 -m mount -a 'path=/common src="UUID=d162b8b9-2326-4ee4-a559-80861461c4f0" fstype=xfs state=mounted'

# 卸载
[student@ansible ~/ansible]$ ansible node1 -m mount -a 'path=/common src="UUID=d162b8b9-2326-4ee4-a559-80861461c4f0" fstype=xfs state=absent'

16. lvg 模块 (LVM卷组)

参数解释
vg卷组名称
statepresent 创建(默认) 或者 absent 删除
force可以在删除时使用
pvs指定物理卷
pesize设定 pe 大小

代码示例:

# 新建卷组 vg0
[student@ansible ~/ansible]$ ansible node1 -m lvg -a 'vg=vg0 pesize=16M pvs=/dev/sda5'

17. lvol 模块 (LVM逻辑卷)

参数解释
lv定义逻辑卷名称
size定义逻辑卷大小
vg逻辑卷的空间来自哪个 vg
statepresent 创建(默认) 或者 absent 删除
force强制删除或者调整逻辑卷大小

代码示例:

# 新建逻辑卷 lv0
[student@ansible ~/ansible]$ ansible node1 -m lvol -a 'lv=lv0 size=1000M vg=vg0'

# 在线扩容逻辑卷
[student@ansible ~/ansible]$ ansible node1 -m lvol -a 'lv=lv0 size=1600M vg=vg0 resizefs=yes'

18. sefcontext 模块 (SELinux)

参数解释
target指定目标目录
setype设置安全性本文
state模块状态:present 代表增加目录的安全性本文;absent 代表删除目录的安全性本文

代码示例:

# 修改 context 值
[student@ansible ~/ansible]$ ansible node1 -m sefcontext -a 'target="/share(/.*)?" setype=samba_share_t state=present'

# 应用新的 selinux 文件的 context 值
[student@ansible ~/ansible]$ ansible node1 -m command -a 'restorecon -Rv /share'

19. debug 模块

参数解释
msg调试输出的消息
var将某个任务执行的输出作为变量传递给 debug 模块,debug 会直接将其打印输出
verbositydebug 的级别(默认是 0 级,全部显示)

代码示例:

# 输出 Alone
[student@ansible ~/ansible]$ ansible node1 -m debug -a 'msg=Alone'

20. cron 模块

参数解释
user用于设置当前计划任务属于哪个用户,当不使用此参数时,默认为管理员用户
job指定计划的任务中需要实际执行的命令或者脚本
name用于设置计划任务的名称,计划任务的名称会在注释中显示
state相关状态信息,当删除计划任务时,需要将 state 的值设置为 absent,用于创建 present(默认)
disabled当计划任务有名称时,我们可以根据名称使对应的任务失效
backup此参数的值设置为 yes,那么当修改或者删除对应的计划任务时,会对计划任务备份
$time指定具体的执行时间、minute 分、hour 时、day 天、month 月、weekday、0-7 代表周

代码示例:

# 创建计划任务,任务名称为 mkdirs test,于每天 1 点 5 分,执行输出一段话 echo hello lyshark
[student@ansible ~/ansible]$ ansible node1 -m cron -a "name='mkdirs test' minute=5 hour=1 job='echo hello lyshark'"

# 删除计划任务 mkdirs test,删除前做好备份.
[student@ansible ~/ansible]$ ansible node1 -m cron -a "name='mkdirs test' state=absent backup=yes"

21. get_url 模块

参数解释
dest文件下载到远程的那个目录下。如果 dest 是一个目录,则使用 url 的 base name 作为文件名;如果 dest 是一个目录,则 force 选项不生效;如果 dest 是一个目录,则总是会下载目标文件,但只在已存在的文件变化了才会替换旧文件;如果设置为 yes, 且 dest 不是一个目录时,则总是会下载文件,但只在已存在的文件变化了才会替换旧文件;如果设置为 no(默认),则只会在目录路径下不存在该文件时才会进行下载
force是否强制覆盖 yes/no
url指定一个 URL 地址
backup下载文件时间时创建一个名称中包含时间戳的备份文件
tmp_dest下载时临时存放目录,在任务执行完成前会删除下载的临时文件
group文件/目录的所属组
owner文件/目录的所有者
timeout请求 url 时的超时时间,默认 10 秒钟

代码示例:

# 下载一个指定文件到远程主机
[student@ansible ~/ansible]$ ansible node1 -m get_url -a "url=http://mirrors.aliyun.com/repo/Centos-7.repo dest=/root"

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注