ansible 模块

Ansible playbook 常用模块

service /systemd 模块 服务器状态

# service  centos6
- name: restart XXX
  service:
    name: iptables 
    state: started/stoped/restarted/reloaded
    enabled:no
    when: ansible_os_family == 'RedHat'
   
# systemd centos7 
- name: stop CentOS Firewall
  systemd:
    name: firewalld
    state: stopped
    enabled: no
  when: ansible_os_family == 'RedHat'
  
- name: stop Ubuntu Firewall
  systemd:
    name: ufw
    state: stopped
    enabled: no
  when: ansible_os_family == 'Debian'
  
- name: disable SELinux #临时关闭selinux
      selinux:
        state: disabled

lineinfile 模块 行文件 行替换

path: 指定要操作的文件对象
regexp: 匹配条件
line:  想要替换成的行
insertbefore: 在某行之前插入
insertafter: 在某行之后插入
state: 
    present 插入
    absent  删除
    
- name: Disable SELinux #永久关闭selinux
  lineinfile:
    dest: /etc/selinux/config
    regexp: '^SELINUX='
    line: 'SELINUX=disabled'
    state: present

replace 模块 替换字符串 类似 sed命令

path: 指定要操作的文件对象
regexp: 正则表达式
replace: 要替换成的字符串
backup: 修改前是否备份原文件

#实例
- name: Set_selinux_disabled_centos7
- name: Disable SELinux disabled centos7
  replace:
    path: /etc/selinux/config
    regexp: 'SELINUX=(enforcing|permissive)'
    replace: 'SELINUX=disabled'
    backup: yes

copy 模块

src    管理主机文件默认是从files里拷贝
dest   远程节点文件路径
owner  属主
group  属组
mode   拷贝到远程主机文件的权限 =0755
remote_src=yes 表示将远程主机上的数据进行移动操作
remote_src=no 表示将管理主机上的数据进行分发操作
content 当不使用src指定拷贝的文件时,可以使用content直接指定文件内容
force  已经存在同名文件 强制覆盖 force=yes or force=no
backup 已经存在同名文件 强制备份 backup=yes or backup=no

when 模块 判断

1 简单条件判断
- name: 判断其系统是否是centos7
  debug:
    msg: "is OS CentOS"
  when:
    - ansible_distribution == "CentOS"
    - ansible_distribution_major_version == "7"

2 条件判断
==  :相等为真
!=  :不等为真
>   :大于为真
<   :小于为真
>=  :大于等于等为真
<=  :小于等于等为真为真
and :逻辑与
or  :逻辑或
not  :取反

# 实例: 根据shell执行的返回成功失败执行下面的语句
- name: task1
  shell: "ls test/s"
  register: returnmsg #执行了命令后的结果返回给一个变量,这个变量的值在playbook的task之间相互传递变量
  ignore_errors: true  #忽略错误

- name: task2
  debug: msg="run ok"
  when: returnmsg.rc == 0
- name: task3
  debug: msg="run no"
  when: returnmsg.rc != 0

3 条件判断与 tests(exist)
4 判断变量的一些测试(defined,undefined,none)
5 判断执行结果的一些测试(成功,失败,更改,跳过)
6 判断路径的一些测试(file,directory,link,mount,exists)
7 判断字符串的一些测试(lower,upper)
8 判断整除的一些测试(偶数,奇数,整除)
9 版本 比较判断版本号
10 其他一些判断的测试 (subset,superset,string,number)
11 block模块 结合
12 fai模块 结合
13 failed_when
14 changed_when

package yum apt dnf pip 包管理模块

package:使用操作系统本机的自动检测软件包管理器管理软件包
yum:使用yum管理软件包
apt:使用APT管理软件包
dnf:使用dnf管理软件包
pip:从PyPI管理Python软件包


name:
    要安装的软件包名,多个软件包以英文逗号隔开 state 对当前指定的软件安装、移除操作 支持的参数有:
present:
    安装,但不升级
inistalled:
    确认安装
latest:
    安装且升级为最新
absent和removed:
    移除

# 通过操作系统的自动监测软件包管理器管理软件(就是ubuntu 自动用apt centos7自动用yum rocky9 用 dnf)
- name: Install Update Remove pkg
  package:
    name: package_name
    state: present/latest/absent/removed

# apt ubuntu系列 更新缓存
- name: apt update
  apt:
    update_cache: yes

# yum/dnf centos系列 清除缓存并更新
- name: Clean all Yum cache and Makecache
  yum/dnf:
    name: '*'
    state: latest
    clean_all: yes
    update_cache: yes

file 模块

path   要操作的文件或目录
owner  属主
group  属组
mode   权限 =0755
state  state=touch
    touch     创建空文件
    directory 创建空目录
    absent    递归删除
    file      查看指定目录信息是否存在
    hard      硬链接
    link      软连接
recurse =yes递归

### 模块实例
# 1 修改目录/data属性,属主root,属组root
file: path=/data owner=root group=root
# 2 创建/data2目录,并设置父目录、子目录属主属组都为root 权限为755
file: path=/data owner=root group=root mode=755 state=directory recurse=yes
# 3 创建文件aa.txt
file: name=/data/aa.txt state=touch
# 4 创建 软 链接文件
file: src=/data path=/tmp/data state=link

unarchive 解压模块

模式:
    copy=yes 将ansible主机上的 压缩包解压到指定目录  remote_src=no
    copy=no  将(被控主机)上的 压缩包解压到指定目录  remote_src=yes
src  tar.gz包的原路径
dest 指定解压的绝对路径
exec 解压时需要排除的目录和文件
owner  属主
group  属组
mode   权限 =0755

src=jdk-8u351-linux-x64.tar.gz dest=/usr/local/ copy=yes owner=root group=root

cron 模块 计划任务

name	计划任务名称
job	    指定计划的任务中需要实际执行的命令或者脚本
user	指定用户,默认是root用户
state	指定状态,prsent=添加(默认),absent=删除
backup	备份

minute	分钟,取值范围(0-59,*, */2)
hour	小时,取值范围(0-23,,/2)
day	    天,取值范围(1-31,,/2)
mouth	月,取值范围(1-12,,/2)
weekday	周,取值范围(0-6 for Sunday-Saturday, *)

#实例:
name='ntpdate' minute=0 hour=4 job='/usr/bin/docker restart kcacp_gpu_0' user='root' state='prsent'

register 注册变量 引用变量

# 查看全部端口 并把输出定义到host_port变量名里
- name: "get host port info"
  shell: netstat -lntp
  register: host_port
# 打印输出端口
- name: "print host port"
  debug:
    msg: "{{host_port['stdout_lines']}}"

# 查看时间 并把输出定义到date_output变量名里
- name: echo date 
  command: date 
  register: date_output 
# 使用 when 对关键字对分析后的进行判断 匹配测执行这个task()
 - name: echo date_output 
  command: echo "30"
  when: date_output.stdout.split(' ')[2] == "30"
# 因为 register 获取到的输出内容都是字符串,可以使用 python 字符串的方法对其做处理
# 比如本文中使用的 split,还可以使用 find 方法

uri 模块

uri
	url
until 直到后面的条件满足为真
retries 重试时长
delay   重试间隔时长

- name: check service is health
    uri:
      url: "http://127.0.0.1:{{ APP_PORT}}/healthz"
    register: result
    until: result.status == 200
    retries: 20		#(最长等待20*5=100s)
    delay: 5

authorized_key 分发公钥到远程主机

name  用户
key   公钥文件
state 状态
	present 添加key
  absent   移除key
exclusive  是否移除authorized_keys文件中其它非指定key(默认no)

# 使用authorized_key 模块免密登录(没验证过)
- name: push ssh pub key
  authorized_key:
    name: "root"
    key='{{ lookup('file', '/root/.ssh/id_rsa.pub') }}'"
    state: present

debug 模块 调试模块,用于在调试中输出信息

msg  输出的消息
var  指定变量(任务执行的输出作为变量)直接将其打印输出
verbosity  debug的级别 默认0


# 为每个主机打印回送地址和网关地址的示例
- debug:
    msg: "System {{ inventory_hostname }} has uuid {{ ansible_product_uuid }}"

- debug:
    msg: "System {{ inventory_hostname }} has gateway {{ ansible_default_ipv4.gateway }}"
  when: ansible_default_ipv4.gateway is defined

# 运行uptime状态信息,并显示信息
- shell: /usr/bin/uptime
  register: result

- debug:
    var: result
    verbosity: 2
# 输入hostname
- name: Display all variables/facts known for a host
  debug:
    var: hostvars[inventory_hostname]
    verbosity: 4

command、shell、raw 和 script 这四个模块的作用和用法都类似都用于远程执行命令或脚本

# 区别
command  执行简单的远程 shell 命令,不支持特殊符号< > | ; &
shell    执行简单的远程 shell 命令,支持解析特殊 shell 符号< > | ; &
raw      执行底层 shell 命令, 在没有python的远程主机上执行命令
script   在远程主机上执行管理主机上的脚本,不要求目标主机上已经装好python
#### 如果要安全且可预测地执行命令,最好改用 command 或 shell 模块 ###
# 实例 command 
- name: command uptime
  command:uptime
  args:
    chdir: /root
# 实例 shell 带特殊符号 进入目录 指定解析器
- name: shell uptime
  shell:uptime > /root/test.txt
  args:
    chdir: /root
    executable: /bin/bash
# 实例 raw 
- name: raw uptime
  war:uptime
  args:
    executable: /bin/bash
# 实例 script 在远程主机上执行管理机器上的脚本
- name: raw uptime
  script:"/bin/bash files/test.sh"
  args:
    executable: /bin/bash

expect 用于在给的的节点上执行一个命令并响应提示 (python 要安装pexpect模块才能执行)

command	   命令模块执行命令运行
responses  期望的字符串/正则表达式和字符串的映射来响应。 如果响应是一个列表,则连续的匹配将返回连续的响应

# 修改密码: 匹配不区分大小写的搜索用前缀?i (?!)password": 输入"kc@123456"
- name: change kcadmin password
  ansible.builtin.expect:
    command: passwd kcadmin
    responses:
      (?i)password: "kc@123456"
# 多次交互
vim sc.sh
read -p "111: " name1
read -p "222: " name2
read -p "pass: " name3
echo $name1 $name2 $name3

- name: Test Script
    expect:
      command: sc.sh
      responses:
        enter one: 'one'
        enter two: 'two'
        enter three: 'three'
        enter password: 'pass'
      echo: yes

posted on 2025-10-28 10:54  luokeli  阅读(2)  评论(0)    收藏  举报

导航