avatar

Wz Blog

运维学习・持续更新

  • 首页
  • 文章
  • 登录/注册
  • 管理后台
主页 Ansible
文章

Ansible

发表于 2026-10-11 更新于 2026-10- 11
作者 Administrator
14~18 分钟 阅读

检查剧本格式(缩进,空格):

ansible-playbook 剧本.yml --syntax-check

ansible-playbook 剧本.yml -c

• 为什么要使用ansible?

大批量部署的时候,需要使用到ansible自动化部署和维护工具。Ansible是一款自动化运维配置管理工具,用于管理多台操作系统,分为控制端和被控端,基于SSH协议去管理客户端,Ansible会读取控制端hosts文件,根据其中配置对被控端机器实现批量、并发的配置管理和维护。如果任务比较复杂可以写成PlayBook剧本进行分发管理。

• 在ansible主机上配置hosts文件:


vim /etc/hosts

• 修改ansible主机清单文件:

▪ 查看ansible的配置文件:

rpm -qc ansible

▪ 配置主机清单文件:


vim /etc/ansible/hosts

文件最后添加:被控主机名列表

▪ 测试主机清单是否正常:


ansible 主机名 -m ping

-m:指定使用模块 ping:模块名

tips:需要配置免密

**▶ Ansible模块学习**

**• 查看ansible的帮助手册:**


ansible -doc ping

tips:/搜索查看EXAMPLE示例(优先看)

•查看主机清单:

ansible-inventory --list

ansible-inventory --graph

**• 查看系统有哪些模块:**

ansible-doc --list

**• command模块:**

1.不会通过shell处理命令,因此不支持$HOME这样的变量

2.功能:在远程主机执行系统命令,默认模块,可忽略-m选项

3.注意:此命令不支持变量,<> | ; &等,建议使用shell模块实现

4.此模块不具有幂等性

5.参数chdir:执行命令前先切换到此目录

tips:幂等性:

比如要多次执行一个剧本,有动作第一次执行成功,之后执行剧本的时候不会再执行

**• shell模块**

和command相似,不具有幂等性,支持各种符号,正则匹配,管道符,环境变量等

shell: /usr/local/nginx/sbin/nginx #手动启动nginx

因为shell脚本不具有幂等性,所以每次都会允许,如何避免?

creates: /usr/local/nginx/logs/nginx.pid

tips:启动nginx之后才会有nginx.pid文件,停止后该文件消失

**• 剧本:**


vim ping.yml

- hosts: all #-和hosts中间空格,冒号之后空格必须有

tasks:

- name: ping all server #name,任意写

ping:

tips:剧本,使用yaml语言,改语言有严格的格式要求:

1.左边是键

2.右边是值

3.有严格的缩进 2个空格

4.层级关系是通过缩进来表示

**• script模块**

功能:在远程主机上运行ansible服务器上的脚本,不具有幂等性

- hosts: all

tasks:

- name: run scripts

script:

cmd: ansible服务器上脚本路径

**• yum模块**

- hosts: all

tasks:

- name: install epel-relaese packages

yum:


name: epel-release
state: latest
state:
present:默认,没有就装,有就不装,不会升级
latest:确保最新版。没有就装,有但是版本旧,升级到最新
absent:确保卸载
####  **• yum_repository模块** stats:persent(默认) absent:删除配置
功能:帮助我们批量管理远程主机上的yum仓库
- hosts: all
tasks:
-name: xxxx
yum_repository:
name: cd room #指定仓库名称,对应[]内容
baseurl: file:///mnt #指定源地址,对应baseurl
description: xxx #注释信息,对应name
enabled: yes
gpgcheck: no
####  **• service模块
name:定义要启动的服务的名称
state:指定服务状态
started:启动服务
stopped:停止服务
restarted:重启服务
reloaded:重载服务
enabled:开机自启
####  **• cpoy模块
功能:从主控端复制文件到远程主机
![](/upload/Image-eiAn.png)
- name: 名字
copy:
src: /root/test.sh
dest: /root/new_test.sh
mode: 777

将本地test.sh文件copy到远程主机

**• fetch模块**

功能:把远端文件拷贝到本地

- name:xxx

fetch:

src: /var/log/messages

dest: /root

把远端messages文件拷贝到本地root目录下,会在本地生成/root/主机名/root/log/messages

**• get_url模块**

- name: xxx

get_url:

url: http://xxxxxxxxxxx

dest: 下载保存到被控端的地址目录

checksum: 对目标文件在下载后计算摘要,以确保其完整性

**• file模块**

path:指定远程主机目录或文件信息

state:directory,在远端创建目录

touch:在远端创建文件

link:link或hard表示创建链接文件

absent:表示删除文件或目录

owner:设置所有者

group:设置所属组

mode:设置权限

recurse:递归操作文件夹本身和其子目录子文件,yes 或 no

**• archive模块**

功能:打包压缩,保存在被控端

- name: 打包远端log目录到/root下面

archive:

path: /var/log

dest: /root/log.tar.gz

owner: centos

mode: 644

**• unarchive模块**

功能:将主控端上的压缩包传到远程主机后解压至特定目录

设置copy=no,会将远程主机上某个压缩包解压到指定路径下

remote_src和copy功能一样,只是相反

压缩包在主控本地:copy=yes remotes_src=no

压缩包在远程主机:copy=no remotes_src=yes

**▶ Ansible的角色**

**• 创建Role:**

ansible-galaxy init nginx

会生成一个标准的Role目录结构:

defaults:默认变量,优先级最低,外部playbook可以覆盖它

files:存放静态文件,直接拷贝到远程主机,不能插值变量,copy模块读从此目录取文件

handlers:触发器。只有被notify触发时才执行,常用于重启服务

meta:依赖关系。角色元信息,依赖清单,作者信息

tasks:核心任务。角色真正执行的任务列表,必写

templates:jinja2模板(后缀一般.j2),支持{{变量}}渲染,template模块读取这里

tests:自带的测试Playbook,用来调试本角色

vars:角色内部变量,优先级高。vars>外部变量>defaults

README.md:角色说明文档,用法、参数、示例

**• 角色使用步骤:**

1.创建Role:ansible-galaxy init <role_name>

2.编写tasks、handlers、templates、defaults

3.在外部playbook中引入角色(roles:)

- hosts: web

roles:

-nginx

4.执行外部playbook

vim ~/.vimrc

autocmd FileType yaml setlocal ts=2 sw=2 ai et

▶ Role 所有目录文件 + 编写示例 + tasks/main.yml 使用方式

• defaults/main.yml:

示例:

#defaults/main.yml

nginx_pkg: nginx

nginx_svc: nginx

nginx_port: 80

使用:

#tasks/main.yml


name: "{{ nginx_pkg }}"
####  • vars/main.yml:
示例:
#vars/main.yml
nginx_conf_dir: /etc/nginx/conf.d
使用:
#tasks/main.yml
path: "{{ nainx_conf_dir }}"
####  • templates(jinjia2模板文件)
示例:
templates/nginx.conf.j2
server{

listen {{ nginx_port }}; #vars或者defaults定义的变量

root {{ nginx_html_dir }};

}

使用:

- name:下发nginx配置模板


template:
src: nginx.conf.j2 #解析文件中变量
####  • handlers/main.yml:

触发器,只有changed并且notify才执行

示例:

#handlers/main.yml

内部是正常的yml剧本写法

- name: restart nginx

service:


name: xxx
state: restarted
enabled: yes
使用:
#tasks/main.yml
在任务末尾加notify:触发器名字
- name:xxx
xxxx
xxx
notify: restart nginx
####  • tasks目录下自己拆分出来的yml文件:
tasks/main.yml如何调用它:
import_tasks: install.yml
####  • files目录(静态文件,不会渲染变量):
文件:files/demo.html
<hi>hello ansible role files</h1>
使用:

使用copy模块,src直接写文件名,自动去files目录查找

- name: 拷贝静态网页文件

copy:

src: demo.html

• meta/main.yml

角色元信息,声明作者、ansible最低版本、角色依赖

两个用途:

1.上传到Ansible-Galaxy(Ansible官方角色仓库)是展示信息

2.Ansible执行时读取dependencies,自动先运行依赖的其他角色

示例:

#meta/main.yml

galaxy_info:

author: Wz #作者名字

description: 部署nginx服务 #这个角色干什么

min_ansible_version: "2.14" #运行本角色的最低ansible版本

license: MIT #开源许可证,别人可以自由使用下载

dependencies: [] #唯一一个会改变执行流程的配置

**角色依赖列表,运行当前这个nginx角色之前,必须先执行完列表里面的其他角色**

[]代表空列表,也就是没有任何依赖角色

**示例:**

**装nginx之前,需要先关闭防火墙,有一个角色firewalld_close**

dependencies:

-role: firewalld_close

执行顺序就变成了:

1.先跑完firewalld_close角色

2.跑完,才跑此角色

完全不需要在tasks里面写任何东西

当调用此role时,如果dependencies有角色列表,ansible会自动先执行依赖角色

自动化与CICD
笔记
许可协议:  CC BY 4.0
分享

相关文章

10月 11, 2026

jenkins流水线代码

▶ 指定命名空间创建: pipeline { agent { kubernetes { yaml ''' apiVersion: v1 kind: Pod metadata: labels: jenkins: agent spec: securityContext: runAsUser: 0 ru

10月 11, 2026

Jenkins部署yaml文件

▶ ServiceAccount.yaml apiVersion: v1 kind: ServiceAccount metadata: name: jenkins-k8s-sa namespace: devops --- apiVersion: rbac.authorization.k8s.io/

10月 11, 2026

Gitlab搭建

▶ 1.下载镜像 ▶ 2.准备宿主机映射目录 mkdir -p ~/gitlab/{etc,log,data} ▶ 写配置文件(~/gitlab/etc/girlab.rb) external_url 'http://47.98.48.243' #设置实例的外部访问URL gitlab_rail

下一篇

DevOps & CICD & Jenkins 简介

上一篇

Alertmanager

最近更新

  • Kubernetes v1.28.2 双Master堆叠etcd + Haproxy/Keepalived 高可用部署 SOP(Docker + cri-dockerd)
  • 名词解释
  • ECS 实例反复冻结 —— 故障根因分析报告
  • 运维六大工作内容
  • 磁盘相关命令

热门标签

监控 Linux 数据库 Docker 笔记 CI/CD Kubernetes Nginx

目录

©2026 Wz Blog. 保留部分权利。

使用 Halo 主题 Chirpy