ansible - 模块介绍
执行指令或脚本
command - 执行shell命令
- 远端节点执行命令(若通过此命令执行脚本, 则脚本需要在远端节点上)
不支持
管道、重定向、&&等操作(可理解为只执行命令
)
---
- command: /sbin/shutdown -r now
args:
# 执行命令的远端节点目录
chdir: /root/
# 文件不存在才执行, 存在不执行
creates: xxx.log
# 文件存在才执行; 不存在不执行
removes: xxx.log
# exp1: 文件存在, 查看大小
- command: ls -l xxx.log
args:
chdir: /tmp
removes: xxx.log
# exp2: 文件不存在, 创建
- command: touch xxx.log
args:
chdir: /tmp
creates: xxx.log
shell - 执行"命令+额外操作"
- 远端节点执行命令(若执行脚本, 脚本在远端节点上)
支持
管道、重定向、&&等操作。可理解为进阶command模块
---
- shell: cat a.sh >> a.log
# 参数用法与 command 相同
args:
chdir: /root/
creates: a.sh
removes: a.sh
script - 远端节点执行本地脚本
在远端节点执行本地脚本
- 参数用法同上
- 如果需要获取执行结果, 建议脚本输入到 /tmp/xxx(在远端节点上),再用 copy 复制回来
---
- script: localpath/a.sh
args:
creates: a.log
removes: b.log
# 接位置参数
script: xx.sh '{{ var }}'
操作文件 - File
复制
copy - 复制到远端
- 复制文件到远端节点,源位置可以是
执行节点
,也可以是远端节点
---
- copy:
# 本地文件或目录
# 如果是目录, 且以 / 结尾, 则复制目录下所有内容
# 如果是目录, 不以 / 结尾, 则复制包括目录和目录下所有内容
src:
# 远端节点位置
# 远程节点绝对路径
# 如果 src 是路径, 这 dest 必须为目录
dest:
# 是否备份一个带有时间戳的文件, 用于恢复,默认no
backup:
# 如果文件已存在, 是否覆盖, 默认 yes
force: yes/no
# 从哪里查找源文件
# yes: 从远端节点查找(从远端节点目录cp到远端节点目录)
# no[default]: 从执行节点查找
remote_src: yes/no
unarchive - 解压到远端
- 解压压缩文件到远端节点,源位置可以是
执行节点
、远端节点
和http 获取
- 理解为
copy
+unzip
---
- unarchive:
# 源 tar 包, 支持"http://xx.xx.xx/xx.tgz"
src:
# 解压的目的位置
dest:
# 是否展示压缩包中的文件列表
# yes: 展示, no[default]: 不展示
list_files: yes/no
# 不需要的条目, 格式为列表
exclude: [".git", ".gitignore"]
# 同 copy 模块的 remote_src 参数用法
remote_src:
fetch - 远端拉取到本机
- 从远端节点拉取文件到执行节点
---
- fetch:
# 远端节点的文件路径, 必须是文件
src:
# 执行节点存放位置
dest:
# 远端节点未找到源文件时, 任务是否失败
# yes: 未找到文件失败, no[default]: 未找到文件不失败
fail_on_missing: yes/no
# 多用于处理多主机收集文件使用, 复制包含路径
# yes: 不包含层级路径复制, no: 包含层级路径复制
flat: yes/no
template - 渲染并复制到远端
- 在本地渲染文件,并将渲染好的文件复制到远端
- 参数用法类似 copy
- 放在 template 目录下, 使用 jinja2 语法渲染
---
- template:
src:
dest:
backup:
force:
文件状态
file - 创建和删除文件
- 创建/删除 文件/目录/软连接
---
- file:
# 目录或文件名,别名(dest/name)
path(dest,name):
# 操作关键字
# file(文件), directory(目录), link(软链), hard(硬链), absent(删除)
state:
owner: root
group: root
mode: 0644
stat - 检查文件是否存在
- 检查文件或者目录是否存在, 配合 register 将结果保存, 使用 when 关键字进行后续处理
---
- stat:
# 检查的文件或路径
path:
# 注册变量r,将结果保存到r中
register: r
- fail:
msg: "not exist"
when: r.stat.exists == false
find - 查找符合条件的文件
---
# 根据条件返回文件列表
- find:
# 选择创建大于等于 age 的文件, "-"表示小于等于
# 单位: s, m, h, d, w
age:
#
patterns(pattern):
#
contains:
paths:
file_type:
# 递归显示目录下内容
# yes: 显示, no[default]: 不显示
recurse: yes/no
size:
age_stamp:
hidden:
get_checksum:
use_regex:
文件内容
replace - 替换字符串
---
# 使用 replace 替换 dest 中所有符合 regexp 要求的 str
- replace:
# 要修改的文件
dest(name, destfile): /etc/sysconfig/selinux
# 正则, 使用 python 正则
regexp: '^SELINUX='
# 替换的内容, 如果未设置表示删除匹配项
replace: "SELINUX=disabled"
lineinfile - 替换字符串(高级)
---
# 可以实现 replace 模块的功能
# 未找到, 可
- lineinfile:
# 操作的文件
path:
# 操作关键字
# present[default]: 确保存在, absent: 确保不存在(有会删除)
# present + 匹配到多行结果: 只会替换最后一样
# absent + 匹配到多行结果: 匹配结果会都删除
state: present/absent
# 正则匹配字符串
regexp: "^.*$"
# 还一个和正则分组有关的区别, 没看懂
# 如果它启用, insertbefore 和 insertafter 忽略
# yes: 没有匹配成功时, 不追加到文件末尾, no[default]: 没有匹配成功, 会将line追加到文件末尾
backrefs:
# 默认模式为插入到文件末尾: 即 insertafter: "EOF"
# 使用 insertafter 时, 可以只写[path][insertafter][line], insertbefore 同理
# EOF[default]: 插入 line 到文件末尾, "正则表达式": 插入 line 到正则匹配的 str 后
insertafter:
# BOF: 插入 line 到文件开头, "regex": 插入 line 到正则匹配的 str 前
insertbefore:
# 用于替换/插入的文本内容
line:
Network
get_url - 下载文件
---
# 从 http, https, ftp 下载文件到节点
- get_url:
# 下载地址
url: (http|https|ftp)://[user[:pass]]@host.domain[:port]/path
# 下载位置(远端节点目录)
dest:
# header 信息
headers: 'k1:v1,k2:v2'
# 如果需要验证用户名密码
url_username:
url_password:
# 检查校验和
checksum: md5:xxxxxxx 或 sha256:xxxxxx
# 是否强制发送 headers, 默认不发送, 设置为 yes 可以解决因为身份验证未正常运行, 登录失败的问题(报错 401)
force_basic_auth: yes/no
# 超时时间, 默认为 10s
timeout: 30s
uri - 发送请求
---
# 模拟发送请求
- uri:
# 请求的 url
url:
# 作为下载时的路径
dest:
# 请求的用户名和密码
user:
password:
# 请求体
body:
# body 的传输类型
# json(推荐): 设置为 json 类型, raw: 设置为 raw 类型
body_format: json
# 请求方法, 必须大写
# GET[default], POST, PUT, DELETE, PATCH, REFRESH
method: POST
# 是否返回正文, 默认不返回
return_content: yes/no
# 设置为 yes, 可解决 401 状态问题
force_basic_auth: yes
# 有指定文件时下载
creates:
# 没有指定文件时下载
removes:
# 返回的状态码, 默认为 200
status_code: 202
# 超时时间, 单位为秒, 默认 30
timeout: 60
# 设置 header 内容
headers:
# 单独设置 header 字段内容
HEADER_Cookie:
HEADER_Content-Type:
# 是否验证 ssl 证书
validate_certs: no
# 重定向限制
# yes: all 模式(无限制), no[default]: safe 模式(有限制)
follow_redirects:
# 如果需要忽略错误状态码, 并拿到结果(在 uri 同级加入, 而不是作为 uri 模块的参数)
ignore_errors: yes
Package
yum - yum install
- enablerepo, disablerepo, conf_file
---
# yum install
- yum:
# 包名, 可配合 with_items 遍历安装
name(pkg):
# 操作关键字
# present[default]/installed/latest: 安装, absent/removed: 卸载
# present 和 installed 完全相同, 和 latest 略有不同
# absent 和 removed 完全相同
state: present
# 是否检查签名, 默认不检查
disable_gpg_check: yes/no
# 是否更新缓存, 默认不更新
update_cache: yes/no
enablerepo:
disablerepo:
conf_file:
# 示例
# yum 安装
- name: yum install drbd
yum:
name: nfs
# yum 安装
- name: yum install drbd
yum:
name: ["kmod-drbd84", "drbd84-utils"]
# yum 安装
- name: yum install drbd
yum:
name:
- kmod-drbd84
- drbd84-utils
apt - apt-get install
---
# apt-get install
- apt:
# 包名
name(pkg, package):
# 操作关键字
# present[default]: 安装, absent: 卸载, latest: , build-dep:
state:
rpm_key - rpm --import
---
# Adds or removes (rpm --import) a gpg key to your rpm database.
- rpm_key:
# 可以是 file, url, 删除时可以接收 keyid
key: http://apt.sw.be/RPM-GPG-KEY.dag.txt | /path/to/key.gpg | DEADB33F
# 操作关键字
# present[default]: 安装, absent: 删除
state:
pip - pip install
---
# pip install
- pip:
# 包名
name: scapy
# 包版本
version: 0.3.3
# 文件位于远程节点本地, 与 chdir 配合使用可以写相对路径
requirements:
# 与 requiremnts 配合使用
chdir:
# 操作关键字
# present: 安装, absent: 卸载, forcereinstall: 重装
state:
# 额外参数, 可指定 pip 源地址
extra_args: -i https://example.com/pypi/simple
System
authorized_key - ssh-keygen
---
# Adds or removes an SSH authorized key file
- authorized_key:
# authorized key 的使用者
user:
# 接收 str 或者 url
key: {{ lookup("file", "/root/.ssh/id_rsa.pub") }}
# 存放位置, 默认 user_homedir/.ssh/authorized_keys
path:
# 操作关键字
# present: 添加, absent: 删除
state:
# 是否使用默认目录, 默认是 yes
manager_dir:
# 是否需要删除文件中不匹配的公钥, 默认是 no
# 不支持遍历, 使用 with_items 进行遍历
exclusive:
filesystem - 格式化文件系统
配合 stat 模块判断 块设备是否存在, 再进行操作
---
- filesystem:
# 文件系统
fstype:
# 设备名
dev:
# 是否强制格式化
force: yes/no
# 其他参数
opt:
# exp, mkfs.xfs -f -K /dev/sda
- name: mkfs.xfs /dev/sda
filesystem:
fstype: xfs
dev: /dev/sda
force: yes
opt: -K
mount - 挂载
---
# 挂载
- mount:
# 挂载的目录
name:
# 挂载的盘
src:
# 挂载的文件类型, 挂载时必填, 卸载时不必要
# iso9660(光盘), xfs, ext4
fstype:
# 操作关键字
# present/mounted: 挂载, absent/unmounted: 卸载
state:
# 操作的挂载文件, 默认为/etc/fstab, 建议不修改它
fstab:
# 是否需要开机自动挂载, 默认 yes, CentOS无效, 仅适用于Solaris系统。
boot: yes/no
systemd - 管理系统服务
---
# 由 systemd 管理服务的系统
- systemd:
# 服务名
name(unit,service):
# 操作关键字
# started: 启动, stopped: 停止, restarted: 重启, reloaded: 重载
state:
# 是否开机自启
enabled: yes/no
# 是否重载系统配置, 默认不重载, 建议配置 yes
daemon_reload: yes/no
service - 管理系统服务
- pattern
---
# 由 service 管理的, 也支持 systemd 管理的
- service:
# 服务名称
name:
# 操作关键字
# started: 启动, stopped: 停止, restarted: 重启, reloaded: 重载
state:
# 是否开机自启
enabled: yes/no
# 重启时, 在 stop 和 start 之间等待时间
sleep:
# 执行级别
runlevel:
pattern:
hostname - 设置主机名
---
- hostname:
name: node-01
Utile
wait_for - 检测
---
# 等待条件满足, 继续执行
- wait_for:
# 检查的主机 IP, 不指定默认使用 127.0.0.1
host:
# 等待超时时间, 默认为 300s
timeout: 600
# wait_for 内部轮训时间隔时间, 默认为 0
delay:
# 执行下一步前, 等待时间, 默认为 5
connect_timeout:
# 端口, present/started: 已启动, absent/stopped: 已停止, drained: 无活动链接
port: 22
# 文件必须在本机存在才能继续
path:
# 文件或套接字中的字符串正则匹配规则
search_regex:
# 操作关键字
# started|stopped 检查端口开启和关闭, drained 检查活动链接
# present|absent 检查文件是否存在
state: present|absent|started|stopped|drained
# 两次检查间的间隔
sleep:
debug - 打印信息
---
# 单行数据, 也可以不加引号
- debug:
msg: text
# 多行数据
- debug:
msg:
- line 1
- "line 2"
# msg 参数打印变量, 必须加引号
- debug:
msg: "{{ r }}"
# var 代替 msg, 直接写变量名
- debug:
var: r
# 打印级别, 0~4, 不修改即可
- debug:
var: r
verbosity: 0
fail - 停止playbook
---
# 失败模块, 配合 when + 上一步注册变量使用
- fail:
# 失败时的提示信息
msg:
when: condition
Extras
expect - 非交互执行
需要python >= 2.6, 且安装 pexpect,version >= 3.3
---
- expect:
# 执行的命令
command:
# 这三个参数用法同 shell 模块
chdir:
creates:
removes:
# 预期的字符串或正则规则和响应的映射关系, 按顺序写, 提示信息支持正则,但是速度慢
responses:
"第 1 次提示": "第 1 次交互"
"第 2 次提示": "第 2 次交互"
"第 3 次提示": "第 3 次交互"
# 等待时间, 默认为 30 秒
timeout:
# 是否显示我输入的字符串, yes 会显示, 默认是 no(不显示)
echo: yes
lvg - lvm/vg
---
- lvg:
# vg 名
vg:
# 下层 pv 的名字
pvs: /dev/sda2
# 操作关键字
# present[default]: 创建, absent: 删除
state:
# 创建 vg 时, 给 vgcreate 传递其他选项
vg_options:
# 以下参数不需要改
# 如果 yes, 允许有 lv 的情况下删除 vg ##
# force:
# 好像 lvm2 后, 这个设置用处不大了 ##
# pesize:
# exp1, vgcreate thc_vg /dev/sda /dev/sdb
- lvg:
vg: thc_vg
pvs: /dev/sda,/dev/sdb
# exp2, vgremove thc_vg
- lvg:
vg: thc_vg
state: absent
lvol - lvm/lv
---
- lvol:
# lv 属于哪个 vg
vg:
# lv 的名字
lv:
# 空间大小, 默认为 m, 可接收"g"
size: 512m | 2g | 90%VG
# 操作关键字
# present[default]: 创建, absent: 删除
state:
# 以下参数通常不需要改
# 是否激活
# yes[default]: 已激活并对主机可见, no: 不激活
# active:
# 缩小 lv 或者删除 lv 时有用, 默认为 false, 不建议修改
# force: false
# exp1, lvcreate -L 500G -n thc_lv thc_vg
- lvol:
vg: thc_vg
lv: thc_lv
size: 500g
# exp2, lvremove /dev/thc_vg/thc_lv
- lvol:
vg: thc_vg
lv: thc_lv
state: absent
pause - 暂停
会弹出提示信息
Ctrl+C + C 提前结束暂停
Ctrl+C + A 直接终止
---
- pause:
# 暂停(分钟)
minutes:
# 暂停(秒)
seconds:
# 提示
prompt:
docker
docker_container
# 启动 docker
- docker_container:
# 容器名
name: "{{ docker_name }}"
# 镜像
image: registry.prodops.ucbj.service.thc/test/benchmark_iaas_network:latest
# 主机网络模式
network_mode: host
# 挂载的卷信息
volumes:
- /tmp:/tmp
# -d 参数
detach: yes
# 删除 docker
- docker_container:
name: "{{ docker_name }}"
state: absent
欢迎加 1092845214 交流沟通呀~
本文来自博客园,作者:难德糊涂,转载请注明原文链接:https://www.cnblogs.com/yangkaiyue/p/18238415
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗