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
posted @   难德糊涂  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示