Ansible 常用模块

3.4)Ansible 常用模块

Ansible 默认提供了很多模块来供我们使用。
我们可以通过 ansible-doc -l 命令查看到当前 ansible 都支持哪些模块

通过 ansible-doc -s 模块名 可以查看该模块有哪些参数可以使用。

目前 2023 为止:模块总量基本保存在 3387 个。

虽然模块众多,但最常用的模块也就 2 - 30 个而已,针对特定业务只用 10 几个模块。

bash 复制代码
[root@ansible ~] ansible-doc -l | wc -l
3387

常用模块帮助文档参考:
https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html
https://docs.ansible.com/ansible/2.9/modules/list_of_all_modules.html

3.4.1)Command 模块

Comand 模块不会通过 Shell 处理命令,因此不支持像 $HOME 这样的变量。

以及 < > | ; 和 & 等都是无效的。

功能: 在远程主机执行系统命令 ,此为默认模块,可忽略 -m 选项
注意: 此命令不支持 $VARNAME < > | ; & 等,建议用 Shell 模块实现
注意: 此模块不具有幂等性
范例:

bash 复制代码
# command 模块不支持重定向
ansible websrvs -m command -a 'echo hello > /root/hello.log'
ansible websrvs -m command -a 'cat /root/hello.log'
 
# command 模块不支持变量引用  
ansible websrvs -m command -a "echo $HOSTNAME"

# command 模块不支持管道符
ansible websrvs -m command -a 'echo 123456 | passwd --stdin wangj'
bash 复制代码
# 仅支持简单的 Shell 命令, 且不具备幂等性
# 首行 WARNING 是告知我们所执行的操作可以使用其他模块代替
ansible websrvs -m command -a 'mkdir /data'
ansible websrvs -m command -a 'touch /data/1.log'
ansible websrvs -m command -a 'ls /data'

command 模块的部分参数演示

名称 必选 备注
chdir no 运行 command 命令前先 cd 到这个目录
creates no 如果这个参数对应的文件存在,就不运行 command
bash 复制代码
# chdir 参数
# 先切换到 /data 目录, 然后执行 ls -l 命令
ansible websrvs -m command -a 'chdir=/data ls -l'

# creates 参数
# 如果 /data/mysql 目录存在, 则跳过创建.
# 如果 /data/mysql 目录不存在, 则创建 /data/mysql 目录.
ansible websrvs -m command -a 'creates=/data/mysql mkdir /data/mysql'
ansible websrvs -m command -a 'creates=/data/mysql mkdir /data/mysql'

总结:

  • command 模块的命令不支持启动 Shell,直接通过 SSH 执行命令
  • command 不支持 Bash 的特性,如管道和重定向等功能
  • 若需要通过 Shell 运行一个命令,比如 < > | 等,你实际上需要使用 Shell 模块。
  • command 模块更安全,因为它不受用户环境的影响

3.4.2)Shell 模块

让远程主机在 Shell 进程下执行命令,从而支持 Shell 的特性,如管道等。

与 command 模块几乎相同,但在执行命令的时候使用的是 /bin/sh。
注意: Command 和 Shell 模块都只能去执行一些非交互式的命令,不能去执行一些交互式的命令,比如 vim 或 top。

功能: 和 command 相似,用 Shell 执行命令,支持各种符号,比如:*,$, >
注意: 此模块不具有幂等性
范例:

bash 复制代码
# Shell 模块支持变量引用
[root@ansible ~] ansible websrvs -m shell -a 'echo $HOSTNAME'

# Shell 模块支持管道符
[root@ansible ~] ansible websrvs -m shell -a 'useradd wangj'
[root@ansible ~] ansible websrvs -m shell -a 'echo 123456 | passwd --stdin wangj'
[root@ansible ~] ansible websrvs -m shell -a 'ls -l /etc/shadow'
bash 复制代码
# Shell 模块支持重定向
[root@ansible ~] ansible websrvs -m shell -a 'echo hello > /data/hello.log'
[root@ansible ~] ansible websrvs -m shell -a 'cat /data/hello.log'

注意: 即使是调用 bash 执行命令

类似 cat /tmp/test.md | awk -F'|' '{print $1,$2}' &> /tmp/example.txt 这些复杂命令

使用 Shell 模块也可能会失败。
解决办法: 建议写到脚本中,copy 到远程,执行,再把需要的结果拉回执行命令的机器

小技巧: 使用 Shell 模块替代 command,设为默认模块

bash 复制代码
[root@ansible ~] vim /etc/ansible/ansible.cfg
# 修改下面一行
module_name = shell
# 验证
ansible websrvs -a 'echo 123456 > /data/1.log'    # 默认是 shell 模块
ansible websrvs -m command -a 'echo 123456 > /data/1.log'    # 指定 command 模块 ( 不支持重定向等操作 )

3.4.3)Script 模块

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

bash 复制代码
ansible websrvs -m script -a '/root/test.sh'

3.4.4)Copy 模块

功能: 从 ansible 服务器 主控端复制文件到远程主机
注意: src=file 如果没指明绝对路径,则为当前目录或当前目录下的 files 目录下的 file 文件

参数解析

  • src:推送数据的源文件信息
  • dest:推送数据的目标路径
  • backup:对推送传输过去的文件,进行备份
  • content:直接批量在被管理端文件中添加内容
  • group:将本地文件推送到远端,指定文件属组信息
  • owner:将本地文件推送到远端,指定文件属主信息
  • mode:将本地文件推送到远端,指定文件权限信息
bash 复制代码
# backup 参数
# 如目标存在, 默认覆盖, 此处指定先备份
# ansible websrvs -m shell -a 'useradd wangj'
ansible websrvs -m copy -a 'src=/root/test.sh dest=/root/test01.sh owner=wangj group=bin mode=600 backup=yes'
bash 复制代码
# content 参数
# 指定内容, 直接生成目标文件    
ansible websrvs -m copy -a "content='test line1\ntest line2\n' dest=/tmp/test.txt"

copy 模块 小细节

bash 复制代码
# 复制 /etc 目录自身. ( 注意: /etc 后面没有 / )
# ansible websrvs -m shell -a "mkdir /backup"
ansible websrvs -m copy -a "src=/etc dest=/backup"
bash 复制代码
# 复制 /etc/ 下的文件, 不包括 /etc 目录自身. ( 注意: /etc/ 后面有 / )
ansible websrvs -m copy -a "src=/etc/ dest=/backup"

3.4.5)Get_url 模块

功能: 用于将文件从 http、https 或 ftp 下载到被管理机节点上。
注意: 被管理机节点必须要能够直接访问对应的远程资源。

yaml 复制代码
常用参数如下:
url:下载文件的 URL,支持 HTTP, HTTPS 或 FTP 协议
dest:下载到目标路径(绝对路径),如果目标是一个目录,就用服务器上面文件的名称,如果目标设置了名称就用目标设置的名称
owner:指定属主
group:指定属组
mode:指定权限
force:如果 yes, dest 不是目录,将每次下载文件, 如果内容改变, 替换文件. 如果否, 则只有在目标不存在时才会下载该文件.
checksum:对目标文件在下载后计算摘要,以确保其完整性
    示例: checksum="sha256:D98291AC[...]B6DC7B97",
    checksum="sha256:http://example.com/path/sha256sum.txt"
url_username:用于 HTTP 基本认证的用户名。对于允许空密码的站点,可以不使用 url_password 参数
url_password:用于 HTTP 基本认证的密码。如果未指定 url_username 参数,则不会使用  url_password 参数
validate_certs:如果 no, SSL 证书将不会被验证. 适用于自签名证书在私有网站上使用
timeout:URL 请求的超时时间, 秒为单位
参数 说明
url 下载资源的URL(支持http、https、ftp协议)
dest 下载的资源在目标主机上的保存路径(绝对路径)
owner 指定属主
group 指定属组
mode 指定权限
force =yes|no,是否强制下载;默认为no。
设为yes,即强制下载,如果同名文件存在,则覆盖;设为no,则只有在文件不存在时才下载。
url_username 基于http basic认证的用户名(如果访问的URL需要的话);
url_password 基于http basic认证的密码,和url_username一起使用(如果URL允许使用空密码,则仅需提供url_username即可);
在没有指定url_username时,单独指定url_password也没有意义。
validate_certs yes|no,是否校验 SSL 证书,默认为yes;
当设为no时,SSL证书将不会被校验(建议仅在URL访问的站点使用可被信任的自签名证书的情况下使用validate_certs=no)
timeout URL 请求的超时时间,单位为 s
checksum 对下载后的文件计算校验和,与 checksum 指定的校验和进行比对,确保下载文件的完好性

范例:

bash 复制代码
# 提前下载好软件包验证哈希值
[root@ansible ~] wget http://nginx.org/download/nginx-1.18.0.tar.gz
bash 复制代码
# 使用如下两条命令验证哈希值
[root@ansible ~] openssl md5 nginx-1.18.0.tar.gz
[root@ansible ~] md5sum nginx-1.18.0.tar.gz 
b2d33d24d89b8b1f87ff5d251aa27eb8  nginx-1.18.0.tar.gz
bash 复制代码
# ansible get_url 模块使用
[root@ansible ~] ansible websrvs -m get_url -a 'url=http://nginx.org/download/nginx-1.18.0.tar.gz dest=/usr/local/src/nginx.tar.gz checksum="md5:b2d33d24d89b8b1f87ff5d251aa27eb8"'

3.4.6)Fetch 模块

功能: 从远程主机提取文件至 Ansible 的主控端

与 copy 模块相反,目前不支持目录( 建议:可以将目录打包,然后将压缩包拷贝至 ansible 主控端 )
常用于: 复制客户端的日志文件至 ansible 主控端

bash 复制代码
[root@ansible ~] ansible websrvs -m fetch -a 'src=/var/log/messages dest=/root/logs'
[root@ansible ~] tree

3.4.7)File 模块

功能: 文件管理模块,用于对文件或文件夹相关的操作

主要用来设置文件、链接、目录的属性,或者移除文件、链接、目录。
比如: 创建文件或目录,删除文件或目录,设置文件目录属性,创建目录软链接等等
幂等性: 任意次执行所产生的影响均与一次执行的影响相同

参数 说明
path 指定远程主机目录或文件信息
state directory:在远端创建目录
touch:在远端创建文件
link:link 或 hard 表示创建链接文件
absent:表示删除文件或目录
owner 设置所有者
group 设置所属的组
mode 权限 0000
recurse 递归 yes or no
bash 复制代码
# 创建空文件
ansible all -m file -a 'path=/data/test.txt state=touch'
ansible all -m file -a "path=/root/test.txt state=touch owner=wangj mode=755"

案例

bash 复制代码
# 创建目录 state=directory
ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql"

# 创建软链接 state=link
ansible all -m file -a 'src=/data/testfile dest=/data/testfile-link state=link'

# 递归修改目录属性, 但不递归至子目录
ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql"

# recurse 参数
# 递归修改目录及子目录的属性
ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql recurse=yes"

# 删除文件或目录 state=absent
ansible all -m file -a "path=/data/mysql state=absent"

3.4.8)stat 模块

stat 模块将获取指定文件或目录的信息,并使用 register 参数将其保存。

功能: 检查文件或文件系统的状态
注意: 对于 Windows 目标,请改用 win_stat 模块
选项:

path: 文件/对象的完整路径 (必须)

常用的返回值判断:

exists:判断是否存在

isuid:调用用户的 ID 与所有者 ID 是否匹配

范例:

bash 复制代码
[root@ansible ~] ansible 127.0.0.1 -m stat -a 'path=/etc/passwd'

案例:

bash 复制代码
- name: install | Check if file is already configured.
    stat: path={{ nginx_file_path }}
    connection: local
    register: nginx_file_result
    
- name: install | Download nginx file
    get_url: url={{ nginx_file_url }} dest={{ software_files_path }} validate_certs=no
    connection: local
    when:, not. nginx_file_result.stat.exists

范例: 使用 stat 模块验证文件状态,通过文件状态推进下一步实施动作

bash 复制代码
# 检查 websrvs 主机组中的所有主机上的 /data/mysql 路径是否存在
# 如果路径不存在, 它将在每个主机上输出一条调试信息, 说明该路径不存在
[root@ansible ansible] cat stat.yml
---
- hosts: websrvs
  tasks:
    - name: Check file
      stat: path=/data/mysql
      register: st
    - name: debug
      debug:
        msg: "/data/mysql is not exist"
      when: not st.stat.exists

 [root@ansible ansible] ansible-playbook stat.yml

3.4.9)unarchive 模块

功能: 解包解压缩

实现有两种用法:

1)将 ansible 主机上的压缩包传到远程主机后解压缩至特定目录,设置 copy=yes,此为默认值,可省略

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

常见参数:

copy:默认为 yes,当 copy=yes,拷贝的文件是从 ansible 主机复制到远程主机上.

如果设置为 copy=no,会在远程主机上寻找 src 源文件

remote_src:和 copy 功能一样且互斥

yes 表示在远程主机,不在 ansible 主机

no 表示文件在 ansible 主机上

src:源路径,可以是 ansible 主机上的路径,也可以是远程主机(被管理端或者第三方主机)上的路径,

如果是远程主机上的路径,则需要设置 copy=no

dest:远程主机上的目标路径

mode:设置解压缩后的文件权限

范例:

bash 复制代码
# copy=yes ( 默认值 )
# 拷贝的文件是从 ansible 控制主机复制到远程主机上
ansible all -m unarchive -a 'src=/root/nginx-1.18.0.tar.gz dest=/usr/local/src owner=wangj group=bin'
bash 复制代码
# copy=no ( 在远程被控主机上寻找 src 源文件 )
# ansible websrvs -m get_url -a 'url=http://nginx.org/download/nginx-1.18.0.tar.gz dest=/root/nginx-1.18.0.tar.gz'
ansible all -m unarchive -a 'src=/root/nginx-1.18.0.tar.gz dest=/usr/local/src copy=no mode=0777'
bash 复制代码
# 下载压缩包并解压缩至指定目录 ( 需要添加参数 copy=no )
ansible websrvs -m unarchive -a 'src=http://nginx.org/download/nginx-1.18.0.tar.gz dest=/usr/local/src/ copy=no'
bash 复制代码
# remote_src=yes ( 表示内容在远程主机上 )
ansible websrvs -m unarchive -a 'src=https://releases.ansible.com/ansible/ansible-2.1.6.0-0.1.rc1.tar.gz dest=/usr/local/src owner=root remote_src=yes'

3.14.10)Archive 模块

功能: 打包压缩 保存在被管理节点
范例:

bash 复制代码
ansible websrvs -m archive  -a 'path=/var/log/ dest=/data/log.tar.bz2 format=bz2 owner=wangj mode=0600'

3.4.11)Hostname 模块

功能: 管理主机名
范例:

bash 复制代码
# 使用
ansible 192.168.80.18 -m hostname -a 'name=node18.wuhanjiayou.cn' 

# 验证
ansible 192.168.80.18 -m shell -a 'hostname'
bash 复制代码
# 注意:
# 千万别以分组来修改主机名 ( 不然整个组的主机名都是同一个 ) 
# 除非你确实有这个需求 
ansible websrvs -m hostname -a 'name=node.wuhanjiayou.cn'
ansible websrvs -m shell -a 'hostname'

3.4.12)Cron 模块

功能: Cron 模块可以 帮助我们批量管理远程主机中的计划任务
支持时间: minute,hour,day,month,weekday

分,时,日,月,周
范例:

bash 复制代码
# 创建任务
ansible 10.0.0.8 -m cron -a 'hour=2 minute=30 weekday=1-5 name="backup mysql" job=/root/mysql_backup.sh'
ansible websrvs -m cron -a "minute=*/5 job='/usr/sbin/ntpdate ntp.aliyun.com &>/dev/null' name=Synctime"

# 禁用计划任务
ansible websrvs -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.20.0.1 &>/dev/null' name=Synctime disabled=yes"

# 启用计划任务
ansible websrvs -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.20.0.1 &>/dev/null' name=Synctime disabled=no"

# 删除任务
ansible websrvs -m cron -a "name='backup mysql' state=absent"
ansible websrvs -m cron -a 'state=absent name=Synctime'

演示

bash 复制代码
ansible websrvs -m cron -a "minute=*/5 job='/usr/sbin/ntpdate ntp.aliyun.com &>/dev/null' name=Synctime"

3.4.13)Yum 和 Apt 模块

功能:

Yum 模块:管理软件包,支持 RHEL,CentOS,fedora,不支持 Ubuntu 其它版本

Apt 模块:管理 Debian 相关版本的软件包

后续:我们可以通过判断 Linux 系统版本来决定使用哪个模块。
范例:

bash 复制代码
// 安装: present
ansible websrvs -m yum -a 'name=httpd state=present'

// 卸载: absent
ansible websrvs -m yum -a 'name=httpd state=absent'

// 启用 epel 源进行安装
ansible websrvs -m yum -a 'name=nginx state=present enablerepo=epel'

// 升级除 kernel 和 foo 开头以外的所有包 ( 安装多个软件包 )
ansible websrvs -m yum -a 'name=* state=lastest exclude=kernel*,foo*'

// 一次安装多个软件包
[root@ansible ~] ansible websrvs -m yum -a 'name=sl,cowsay'

范例:

bash 复制代码
# 直接基于远程主机上的软件包安装
[root@ansible ~] ansible websrvs -m yum -a "name=https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/5.2/rhel/7/x86_64/zabbix-agent-5.2.5-1.el7.x86_64.rpm state=present"

范例:

bash 复制代码
# 安装软件包
# 注意: RadHat 使用 yum 模块, Ubuntu 使用 apt 模块
[root@centos8 ~] ansible 192.168.80.18 -m apt -a 'name=bb,sl,cowsay,cmatrix,oneko,hollywood,boxes,libaa-bin,x11-apps state=present'

# 卸载软件包
# 注意: RadHat 使用 yum 模块, Ubuntu 使用 apt 模块
[root@centos8 ~] ansible websrvs -m apt -a 'name=sl,cowsay state=absent'

范例: 查看包

bash 复制代码
[root@ansible ~] ansible localhost -m yum -a "list=tree"

3.4.14)yum_repository 模块

功能: 可以帮助我们批量管理远程主机上的 Yum 仓库

bash 复制代码
- name: Add multiple repositories into the same file (1/2)
  yum_repository:
    name: epel
    description: EPEL YUM repo
    file: external_repos
    baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/
    gpgcheck: no
    
- name: Add multiple repositories into the same file (2/2)
  yum_repository:
    name: rpmforge
    description: RPMforge YUM repo
    file: external_repos
    baseurl: http://apt.sw.be/redhat/el7/en/$basearch/rpmforge
    mirrorlist: http://mirrorlist.repoforge.org/el7/mirrors-rpmforge
    enabled: no
    
- name: Remove repository from a specific repo file
    yum_repository:
      name: epel
      file: external_repos
      state: absent                           

范例: 创建和删除仓库

bash 复制代码
[root@ansible ~] cat yum_repo.yml
- hosts: websrvs
  tasks:
    - name: Add multiple repositories into the same file 
      yum_repository:
      name: test
      description: EPEL YUM repo
      file: external_repos
      baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/
      gpgcheck: no

[root@ansible ~] ansible-playbook yum_repo.yml
[root@web1 ~] cat /etc/yum.repos.d/external_repos.repo
[test]
baseurl = https://download.fedoraproject.org/pub/epel/$releasever/$basearch/
gpgcheck = 0
name = EPEL YUM repo

[root@ansible ~] cat remove_yum_repo.yml
- hosts: websrvs
  tasks:
    - name: remove repo 
      yum_repository:
        name: test
        file: external_repos
        state: absent
        
[root@ansible ~] ansible-playbook remove_yum_repo.yml        

3.4.15)Service 模块

功能: 可以帮助我们 批量管理远程主机上的服务

范例:

bash 复制代码
# 启动远程主机的 httpd 服务,并实现开机自启
ansible 192.168.80.18 -m service -a 'name=httpd state=started enabled=yes'

# 停止服务   
ansible websrvs -m service -a 'name=httpd state=stopped'

# 生效服务
ansible websrvs -m service -a 'name=httpd state=reloaded'

# 重启服务
ansible websrvs -m shell -a "sed -i 's/^Listen 80/Listen 8080/' /etc/httpd/conf/httpd.conf"
ansible websrvs -m service -a 'name=httpd state=restarted'

3.4.16)User 模块

功能: 管理用户

可以帮助我们 批量管理远程主机上的用户

比如创建用户、修改用户、删除用户、为用户创建密钥对等操作。
范例:

bash 复制代码
// 创建用户
ansible all -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'
ansible all -m user -a 'name=nginx comment=nginx uid=88 group=nginx groups="root,daemon" shell=/sbin/nologin system=yes create_home=no home=/data/nginx non_unique=yes'

// remove=yes 表示删除用户及家目录等数据, 默认 remove=no
ansible all -m user -a 'name=nginx state=absent remove=yes'

// 生成 123456 加密的密码
ansible localhost -m debug -a "msg={{ '123456'| password_hash('sha512','salt')}}"
localhost | SUCCESS => {
    "msg": "$6$salt$MktMKPZJ6t59GfxcJU20DwcwQzfMvOlHFVZiOVD71w."
}

// 用上面创建的密码创建用户
ansible websrvs -m user -a 'name=test password="$6$salt$MktMKPZJ6t59GfxcJU20DwcwQzfMvOlHFVZiOVD71w."'

// 创建用户 test, 并生成 4096bit 的私钥
ansible websrvs -m user -a 'name=test generate_ssh_key=yes ssh_key_bits=4096 ssh_key_file=.ssh/id_rsa'

3.4.17)Group 模块

功能: 管理组

范例:

bash 复制代码
// 创建组
ansible websrvs -m group  -a 'name=nginx gid=88 system=yes'

// 删除组
ansible websrvs -m group  -a 'name=nginx state=absent'

3.4.18)Lineinfile 模块

参考:
https://www.cnblogs.com/breezey/p/9297252.html

info
功能: 相当于 sed,可以修改文件内容

ansible 在使用 sed 进行替换时,经常会遇到需要转义的问题,而且 ansible 在遇到特殊符号进行替换时,存在问题,无法正常进行替换 。

其实在 ansible 自身提供了两个模块:lineinfile 模块和 replace 模块,可以方便的进行替换

一般在 ansible 当中去修改某个文件的单行进行替换的时候需要使用 lineinfile 模块
幂等性:重复执行不会创建多行内容,多次执行,依然只增加有最后一行。

范例:

regexp 参数:使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。如果想进行多行匹配进行替换需要使用 replace 模块。( 重点 )

bash 复制代码
# 将 Listen 开头的行,修改为 Listen 8080 ( regexp 参数 )
ansible 192.168.80.18 -m lineinfile -a "path=/etc/httpd/conf/httpd.conf regexp='^Listen' line='Listen 8080'"

# 批量禁用远程主机的 SELinux 功能
ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled'"

# 将 # 开头的行都删除
ansible 192.168.80.18 -m lineinfile -a 'dest=/etc/fstab state=absent regexp="^#"'

3.4.19)Replace 模块

知识点:
Lineinfile 模块 与 replace 模块 区别

  1. Lineinfile 模块 regexp 参数:使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。
  2. Replace 模块:可以根据我们指定的正则表达式替换文件中的字符串,文件中所有被匹配到的字符串都会被替换。

info
范例:

bash 复制代码
# 查找所有以 UUID 开头的行, 并将这些行注释掉
ansible all -m replace -a "path=/etc/fstab regexp='^(UUID.*)' replace='#\1'"

# 查找所有以 # 开头, 紧接着是 UUID 的 行 (这些行是被注释掉的)
# 并移除行首的 # 符号, 从而取消这些行的注释.
ansible all -m replace -a "path=/etc/fstab regexp='^#(UUID.*)' replace='\1'"

3.4.20)SELinux 模块

批量管理远端主机的 SELINUX 策略

info
范例:

bash 复制代码
# 启用
[root@ansible ~] ansible 192.168.80.18 -m selinux -a 'state=enforcing policy=targeted'

# 禁用
[root@ansible ~] ansible 192.168.80.18 -m selinux -a 'state=disabled'

# 验证
[root@centos8 ~] grep -v '#' /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted

[root@centos8 ~] getenforce 
Permissive

3.4.21)reboot 模块

注意: 对于 Windows 目标,请使用 win_reboot 模块

bash 复制代码
[root@ansible ~] ansible websrvs -m reboot

3.4.22)mount 模块

功能: 批量管理被控端设备挂载

参数 说明
src 本地或远程设备的路径
path 设备挂载至本地的路径
fstype 挂载的文件系统类型,xfs、nfs...
opts 挂载的参数,defaults、ro...
state 挂载的状态,absent、mounted、unmounted
bash 复制代码
// 临时挂载
mount websrvs -m mount -a 'src="UUID=b3e48f45-f933-4c8e-a700-22a159ec9077" path=/home fstype=xfs opts=noatime state=present'

// 临时取消挂载
mount websrvs -m mount -a 'path=/home fstype=xfs opts=noatime state=unmounted'

// 永久挂载
ansible websrvs -m mount -a 'src=10.0.0.8:/data/wordpress path=/var/www/html/wp-content/uploads opts="_netdev" state=mounted'

// 永久卸载
ansible websrvs -m mount -a 'src=10.0.0.8:/data/wordpress path=/var/www/html/wp￾content/uploads state=absent'

3.4.23)Setup 模块( 重要 )

功能: setup 模块 用于收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用

但是如果主机较多,会影响执行速度。我们可以使用 gather_facts: no 来禁止 Ansible 收集 facts 信息

info
范例:
filter 参数:用于进行条件过滤。如果设置,仅返回匹配过滤条件的信息。

bash 复制代码
// 这条命令会收集 inventory 中 websrvs 组下所有主机的所有 facts
// 并将这些信息打印出来
ansible websrvs -m setup

# 主机的节点名
ansible websrvs -m setup -a "filter=ansible_nodename"

# 主机的主机名
ansible websrvs -m setup -a "filter=ansible_hostname"

# 主机所属的域名 
ansible websrvs -m setup -a "filter=ansible_domain"

# 主机的总内存量
ansible websrvs -m setup -a "filter=ansible_memtotal_mb"

# 主机的物理内存量
ansible websrvs -m setup -a "filter=ansible_memory_mb"

# 主机当前空闲的内存量
ansible websrvs -m setup -a "filter=ansible_memfree_mb"

# 主机操作系统的家族 // 例如 RedHat、Debian 等
ansible websrvs -m setup -a "filter=ansible_os_family"

# 主机操作系统的主版本号
ansible websrvs -m setup -a "filter=ansible_distribution_major_version"

# 主机操作系统的完整版本号
ansible websrvs -m setup -a "filter=ansible_distribution_version"

# 主机的虚拟 CPU 数量
ansible websrvs -m setup -a "filter=ansible_processor_vcpus"

# 主机的所有 IPv4 地址列表
ansible websrvs -m setup -a "filter=ansible_all_ipv4_addresses"

# 主机的架构类型
ansible websrvs -m setup -a "filter=ansible_architecture"

# 主机已运行的时间
ansible websrvs -m setup -a "filter=ansible_uptime_seconds"

# 以 ansible_processor 开头的所有 facts
ansible websrvs -m setup -a "filter=ansible_processor*"

# 主机的环境变量 
ansible websrvs -m setup -a 'filter=ansible_env'

范例:

bash 复制代码
[root@ansible ~] ansible all -m setup -a 'filter=ansible_python_version'

范例: 取 IP 地址

bash 复制代码
// 取所有 IP
ansible 192.168.80.18 -m setup -a 'filter=ansible_all_ipv4_addresses'

// 取默认 IP
ansible all -m setup -a 'filter="ansible_default_ipv4"'

3.4.24)debug 模块

此模块可以用于输出信息,并且通过 msg 定制输出的信息内容
注意: msg 后面跟变量时,需要加 " " 引起来
范例: debug 模块 默认输出 Hello world

bash 复制代码
# 默认输出 Hello world ( 默认没有指定 msg, 默认输出 "Hello world!" )
[root@ansible ~] ansible 192.168.80.18 -m debug

范例: 利用 debug 模块输出变量

bash 复制代码
[root@centos8 ~] vim debug.yaml
---
- hosts: websrvs
  tasks:
  - name: output variables
    debug:
      msg: Host "{{ ansible_nodename }}" Ip "{{ ansible_default_ipv4.address }}"
      
[root@centos8 ~] ansible-playbook debug.yaml

范例: 显示字符串特定字符

bash 复制代码
# cat debug.yml
- hosts: all
  gather_facts: n
  vars:
    a: "12345"
  tasks:
  - debug:
    msg: "{{a[2]}}"
    
// 定义了一个字符串变量 a, 如果想要获取 a 字符串的第 3 个字符
// 则可以使用 "a[2]" 获取, 索引从 0 开始, 执行上例 playbook, debug 的输出信息如下:
TASK [debug] *************************
ok: [test71] => {
    "msg": "3"
}    
相关推荐
leo__5208 小时前
自动化运维:使用Ansible简化日常任务
运维·自动化·ansible
风清再凯5 天前
自动化工具ansible,以及playbook剧本
运维·自动化·ansible
IT乌鸦坐飞机5 天前
ansible部署数据库服务随机启动并创建用户和设置用户有完全权限
数据库·ansible·centos7
遇见火星18 天前
如何使用Ansible一键部署MinIO集群?
ansible
粥周粥18 天前
ANSIBLE
ansible
码农101号18 天前
Linux中ansible模块补充和playbook讲解
linux·运维·ansible
码农101号18 天前
Linux的Ansible软件基础使用讲解和ssh远程连接
ansible
烟雨书信20 天前
ANSIBLE运维自动化管理端部署
运维·自动化·ansible
碎碎-li20 天前
ANSIBLE(运维自动化)
运维·自动化·ansible
@donshu@23 天前
Linux运维-ansible-python开发-获取inventroy信息
linux·运维·ansible