Ansible常用模块介绍 ansible内置了丰富的模块供用户使用,但是经常使用到的模块却不多。本文主要记录了ansible的一些常用模块以及详细参数 、注意事项等 ,供大家学习。
模块的应用语法格式: ansible 主机名称/主机组名称/主机地址信息/all -m(指定应用的模块信息) 模块名称 -a(指定动作信息) “执行什么动作”
ansible官方网站:
https://docs.ansible.com/
命令模块 ping 应用场景: 测试主机和ansible之间的连通性 举例: 对webserver主机组测试是否连通
1 ansible webservers -m ping
command 基础模块 概要 命令模块 适合使用简单的命令(cat、ls) 无法支持”<”,”>”,”|”,”;”,”&”等符号 官方文档:https://docs.ansible.com/ansible/latest/modules/command_module.html#command-module
参数 解释 chdir 在执行命令前,进入到指定目录中 creates 判断指定文件是否存在,如果存在,不执行后面的操作 removes 判断指定文件是否存在,如果存在,执行后面的操作 free_form 必须要输入一个合理的命令
1 2 3 4 5 [root@zabbix ~]# ansible webservers -m command -a "hostname" 10.1.1.60 | CHANGED | rc=0 >> db01 10.1.1.20 | CHANGED | rc=0 >> web01
shell 万能模块 概要 类似command模块升级版—万能模块 官方文档:https://docs.ansible.com/ansible/latest/modules/shell_module.html#shell-module
参数 解释 chdir 在执行命令前,进入到指定目录中 creates 判断指定文件是否存在,如果存在,不执行后面的操作 removes 判断指定文件是否存在,如果存在,执行后面的操作 free_form 必须要输入一个合理的命令
文件模块 copy 拷贝文件 功能:实现主控端向目标主机copy文件。
官网文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/copy_module.html#copy-module
参数:
1 2 3 4 5 6 7 #src 主控端文件位置 #dest 要将源文件复制到远程机器的绝对路径,必选项。 #owner 文件复制过去后的所有者 #group 文件复制过去后的所属组 #mode 文件的权限设定,执行a+x这种方式 #backup 在覆盖之前将源文件备份,备份文件包含时间信息。 如果与远程主机下的文件不一致,才会备份 #directory_mode:递归设定目录的权限。
拷贝文件:
1 ansible webservers -m copy -a "src=/root/tcp dest=/tmp/"
拷贝文件,设置权限:
1 ansible webservers -m copy -a "src=/root/tcp dest=/tmp/ mode=600"
在传输数据文件信息时对远程主机源文件进行备份:
1 ansible webservers -m copy -a "src=/root/tcp dest=/tmp/ backup=yes"
在传输文件时修改文件的属主和属组信息:
1 ansible webservers -m copy -a "src=/root/tcp dest=/tmp/ owner=nobody group=nobody"
创建一个文件并直接编辑文件的信息:
1 ansible webservers -m copy -a "content='www.boysec.cn' dest=/tmp/tcp"
file 设置文件属性 file 模块可以帮助我们完成一些对文件的基本操作。比如,创建文件或目录、删除文件或目录、修改文件权限等。 官方文档:https://docs.ansible.com/ansible/latest/modules/file_module.html#file-module
包含如下选项:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no group:定义文件/目录的属组 mode:定义文件/目录的权限 owner:定义文件/目录的属主 path:必选项,定义文件/目录的路径 recurse:递归设置文件的属性,只对目录有效 src:被链接的源文件路径,只应用于state=link的情况 dest:被链接到的路径,只应用于state=link的情况 state: =directory:如果目录不存在,就创建目录 =file:即使文件不存在,也不会被创建 =link:创建软链接 =hard:创建硬链接 =touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间 =absent:删除目录、文件或者取消链接文件
实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 # 创建一个目录,如果目录存在,则不做任何操作。 ansible 10.1.1.60 -m file -a 'dest=/tmp/boysec state=directory' # 创建一个文件,如果文件存在,则更新文件时间,与touch 命令相同 ansible 10.1.1.60 -m file -a 'dest=/tmp/boysec/text state=touch' # 创建软链接文件信息 ansible 10.1.1.60 -m file -a 'src=/tmp/boysec/text dest=/tmp/test state=link' # 创建硬链接文件信息 ansible 10.1.1.60 -m file -a 'src=/tmp/boysec/text dest=/tmp/text state=hard' # 删除远程文件或者是目录 ansible 10.1.1.60 -m file -a 'dest=/tmp/text state=absent' ansible 10.1.1.60 -m file -a 'path=/tmp/test state=absent' # 创建文件时,指定属主或者修改属主 ansible 10.1.1.60 -m file -a 'dest=/tmp/boysec/text state=touch owner=nobody group=nobody' ansible 10.1.1.60 -m file -a 'dest=/tmp/boysec/text state=touch owner=root' # 创建文件或目录时,指定权限 或者修改权限 ansible 10.1.1.60 -m file -a 'dest=/tmp/boysec/text1 state=touch mode=0644' # 递归修改属主 ansible 10.1.1.60 -m file -a 'dest=/tmp/boysec state=directory owner=mysql recurse=yes'
fetch 批量拉取数据 它用于从远程机器获取文件,并将其本地存储在由主机名组织的文件树中。
– src:远程系统上要获取的文件。 这必须是一个文件,而不是一个目录。 后续版本可能会支持递归提取。 – dest:保存文件的目录。 例如,如果dest目录是/backup,在主机host.example.com上命名为/ etc/profile的src文件将被保存。 官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/fetch_module.html
将/tmp/tcp拉取到ansible管理端本地的/tmp/目录下:
1 ansible 10.1.1.60 -m fetch -a 'src=/tmp/tcp dest=/tmp/tcp-{{ inventory_hostname }} flat=yes'
定时任务 cron cron模块主要用于添加、删除、更新操作系统的crontab任务计划
官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/cron_module.html
cron模块使用详解:
1 2 3 4 5 6 7 8 9 10 11 name:任务计划名称 cron_file:替换客户端该用户的任务计划的文件 minute:分(0-59, * ,*/2) hour:时(0-23, * ,*/2) day:日(1-31, * ,*/2) month:月(1-12, * , */2) weekday:周(0-6或1-7, *) job:任何计划执行的命令,state要等于present backup:是否备份之前的任务计划 user:新建任务计划的用户 state:指定任务计划present、absent
实例:
1 2 3 4 5 6 7 8 9 ansible all -m cron -a "minute=0 hour=0 day=* month=* weekday=* name='sync time' backup=yes job='/usr/sbin/ntpdate time.windows.com >/dev/null 2>&1'" 也可以简写 ansible all -m cron -a "minute=0 name='time1' job='/usr/sbin/ntpdate time.windows.com >/dev/null 2>&1'" #其他默认为* # 删除 ansible all -m cron -a "minute=0 hour=0 day=* month=* weekday=* name='sync time' state=absent" # 注释定时任务 ansible all -m cron -a "minute=0 name='time1' job='/usr/sbin/ntpdate time.windows.com >/dev/null 2>&1' disabled=yes"
挂载模块 mount 用于批量管理主机进行挂载卸载操作
官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/posix/mount_module.html
mount模块参数:
1 2 3 4 5 6 7 8 9 10 src: 需要挂载的存储设备或文件信息 path: 指定目标挂载点目录 fstype: 指定挂载时的文件系统类型 state present/mounted --- 进行挂载 present: 不会实现立即挂载,修改fstab文件,实现开机自动挂载 mounted: 会实现立即挂载, 并且会修改fstab文件,实现开机自动挂载 ***** absent/unmounted --- 进行卸载 absent: 会实现立即卸载, 并且会删除fstab文件信息,禁止开机自动挂载 unmounted: 会实现立即卸载, 但是不会会删除fstab文件信息 *****
实例:
1 2 3 4 5 6 7 8 9 10 # 实现远程批量挂载操作 ansible 10.1.1.20 -m mount -a "src=10.1.1.60:/data path=/mnt/test fstype=nfs state=present" # ansible 10.1.1.20 -m mount -a "src=10.1.1.60:/data path=/mnt/test fstype=nfs state=mounted" # # 卸载 ansible 10.1.1.20 -m mount -a "src=10.1.1.60:/data path=/mnt/test fstype=nfs state=absent" ansible 10.1.1.20 -m mount -a "src=10.1.1.60:/data path=/mnt/test fstype=nfs state=unmounted"
安装模块 yum_repository yum_repository模块管理远程主机上的yum仓库
官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/yum_repository_module.html
参数解释:
1 2 3 4 5 6 7 8 name :相当于.repo文件定义中括号的[仓库ID] baseurl :相当于.repo文件中baseurl description :相当于.repo文件中的name file :相当于.repo文件的名称,不使用时默认以name加.repo命令 enabled=yes|no :相当于.repo文件中enabled gpgcheck=yes|no :相当于.repo文件中gpgcheck gpgkey :前提是gpgcheck=yes,相当于.repo文件中gpgkey,验证gpg公钥 state=present|absent :默认present,absent表示删除
实例:
创建阿里云epel源 1 ansible all -m yum_repository -a 'name=epel baseurl=https://mirrors.aliyun.com/epel/7/x86_64/ enabled=yes gpgcheck=no gpgcakey=https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-7 state=present file=AlicloudEpel'
删除阿里云epel源 1 ansible all -m yum_repository -a 'file=AlicloudEpel name=epel state=absent'
yum 使用yum软件包管理器安装,升级,降级,删除和列出软件包和组。
官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/yum_module.html
模块参数解释:
1 2 3 4 5 6 7 8 name --- 指定安装软件名称 state --- 指定是否安装软件 installed --- 安装软件 present latest absent --- 卸载软件 removed latest --- 安装最新的软件
安装软件:
1 ansible 10.1.1.20 -m yum -a "name=iotop state=installed"
服务模块 service 用于管理服务运行状态
官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/service_module.html#service-module
模块参数解释:
1 2 3 4 5 6 name: --- 指定管理的服务名称 state: --- 指定服务状态 started 启动 restarted 重启 stopped 停止 enabled --- 指定服务是否开机自启动
启动服务
1 ansible 10.1.1.60 -m service -a "name=nfs state=started enabled=yes"
用户模块 group 远程批量创建用户组信息
官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/group_module.html
参数解释:
1 2 3 4 5 gid :指定创建的组ID信息 name : 指定创建组名称信息 state absent : 删除指定的用户组 present : 创建指定的用户组
创建用户组:
1 ansible 10.1.1.12 -m group -a "name=boysec gid=1111"
删除用户组:
1 ansible 10.1.1.12 -m group -a "name=boysec gid=1111 state=absent"
user 远程批量创建用户信息
官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/user_module.html
参数解释:
1 2 3 4 5 6 7 8 9 name 指定用户名信息 uid 指定用户uid信息 group 指定用户主要属于哪个组 groups 指定用户属于哪个附加组信息 shell 指定是否能够登录 create_home 是否创建家目录信息 home 指定家目录创建在什么路径默认/home password * 设置密码时不能使用明文方式,只能使用密文方式 可以给用户设置密码还可以给用户修改密码
实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 # 普通用法 ansible 10.1.1.60 -m user -a "name=boysec01" # 指定用户uid信息 ansible 10.1.1.60 -m user -a "name=boysec02 uid=1111" # 指定用户组信息 ansible 10.1.1.60 -m user -a "name=boysec03 group=boysec02" ansible 10.1.1.60 -m user -a "name=boysec04 groups=boysec02" # 创建虚拟用户 ansible 10.1.1.60 -m user -a "name=boysec create_home=no shell=/sbin/nologin" # 给指定用户创建密码 # 方法一 PS: 利用ansible程序user模块设置用户密码信息,需要将密码明文信息转换为密文信息进行设置 生成密文密码信息方法: [root@zabbix ]# ansible 10.1.1.60 -m debug -a "msg={{ '123456' | password_hash('sha512', 'boysec01') }}" 10.1.1.60 | SUCCESS => { "msg": "$6$boysec01$OE3fthAQpwCRsNwaSZbFN0/CW/aJSAOVtDqK1KoyZ.IdfcfcdNSWTStWydm/pCxH3UlF0NsRngNOSsP1LvvQi." } # 方法二 yum install -y python-pip pip install passlib python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))" Password: $6$rJJeiIerQ8p2eR82$uE2701X7vY44voF4j4tIQuUawmTNHEZhs26nKOL0z39LWyvIvZrHPM52Ivu9FgExlTFgz1VTOCSG7KhxJ9Tqk. ansible 10.1.1.60 -m user -a "name=boysec password='$6$rJJeiIerQ8p2eR82$uE2701X7vY44voF4j4tIQuUawmTNHEZhs26nKOL0z39LWyvIvZrHPM52Ivu9FgExlTFgz1VTOCSG7KhxJ9Tqk'" # 删除用户 ansible 10.1.1.60 -m user -a "name=boysec02 state=absent"
压缩解压 unarchive解压 unarchive模块:从管理端选择文件后将其解包. 解压缩的功能
官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/unarchive_module.html
参数解释:
1 2 3 4 5 dest (required) :解压到目标主机的路径信息 src (required) :本地端需要解压的压缩包的路径信息 copy :默认为yes,当copy=yes,则把本地的压缩包拷贝到远程主机,然后执行压缩,那么当copy=no时则直接解压远程主机上给出的压缩包。 mode :设置解压缩后的文件权限 owner :解压后文件或目录的属主
实例:
1 2 ansible 10.1.1.60 -m unarchive -a "dest=/tmp/boysec src=test.tar.gz" # 解压远程的包到受控端 ansible 10.1.1.60 -m unarchive -a 'src=/package/test.tar.gz dest=/tmp/ copy=no' # 解压受控端本地的包到本地目录
archive压缩 archive模块: 压缩命令的模块
参数解释:
1 2 3 path :需要压缩的文件或目录 dest :压缩后的文件位置 format:bz2, gz, tar, xz, zip :指定打包的类型
实例:
1 ansible 10.1.1.60 -m archive -a 'path=/var/log dest=/tmp/system_log.tar.gz'
文件修改 lineinfile 官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/lineinfile_module.html
lineinfile 模块:类似linux工具中的sed工具,确保某一行文本
存在于指定的文件中,或者确保从文件中删除指定的文本
(即确保指定的文本不存在于文件中),还可以根据正则表达式,替换修改某一行文本
。
参数解释:
1 2 3 4 5 6 7 8 9 path :必须参数,指定要操作的文件。 line : 使用此参数指定文本内容。 regexp :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。 state :当想要删除对应的文本时,需要将state参数的值设置为absent,absent为缺席之意,表示删除,state的默认值为present。 backrefs :默认是yes,backrefs为yes时,如果没有匹配,则文件保持不变。如果匹配了,把匹配内容替被换为line内容,backrefs为no时,如果没有匹配,则添加一行line。如果匹配了,则把匹配内容替被换为line内容。 insertafter :借助insertafter参数可以将文本插入到“指定的行”之后,insertafter参数的值可以设置为EOF或者正则表达式,EOF为End Of File之意,表示插入到文档的末尾,默认情况下insertafter的值为EOF,如果将insertafter的值设置为正则表达式,表示将文本插入到匹配到正则的行之后,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。 insertbefore :借助insertbefore参数可以将文本插入到“指定的行”之前,insertbefore参数的值可以设置为BOF或者正则表达式,BOF为Begin Of File之意,表示插入到文档的开头,如果将insertbefore的值设置为正则表达式,表示将文本插入到匹配到正则的行之前,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。 backup :是否在修改文件之前对文件进行备份。 create :当要操作的文件并不存在时,是否创建对应的文件。
实例:
1 2 ansible 10.1.1.60 -m lineinfile -a 'dest=/etc/fstab state=absent regexp="^#" backup=yes' ansible 10.1.1.60 -a "cat /etc/fstab"
replace replace模块:可以根据我们指定的正则表达式替换文件中的字符串,文件中所有被匹配到的字符串都会被替换。
官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/replace_module.html
参数解释:
1 2 3 4 5 6 7 path :必须参数,指定要操作的文件,2.3版本之前,只能使用 dest, destfile, name指定要操作的文件,2.4版本中,仍然可以使用这些参数名,这些参数名作为 path 参数的别名使用。 regexp : 必须参数,指定一个 python 正则表达式,文件中与正则匹配的字符串将会被替换。 replace : 指定最终要替换成的字符串。 backup :是否在修改文件之前对文件进行备份,最好设置为yes。
实例:
1 2 ansible 10.1.1.60 -m replace -a "path=/etc/fstab regexp='(^UUID.*)' replace='#\1' backup=yes" # 不要重启系统 ansible 10.1.1.60 -m replace -a "path=/etc/fstab regexp='^#(.*)' replace='\1' backup=yes"
下载文件 get_url 模块 官方文档:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/get_url_module.html
该模块主要用于从http、ftp、https服务器上下载文件(类似于wget),主要有如下选项:
1 2 3 4 5 6 sha256sum:下载完成后进行sha256 check; timeout:下载超时时间,默认10s url:下载的URL url_password、url_username:主要用于需要用户名密码进行验证的情况 dest:将文件下载到哪里的绝对路径。如果dest是目录,则使用服务器提供的文件名,或者如果没有提供,将使用远程服务器上的URL的基本名称。 headers:以格式“key:value,key:value”为请求添加自定义HTTP标头。
实例:
1 ansible 10.1.1.60 -m get_url -a "dest=/tmp/ url='http://download.boysec.cn/msfinstall' mode=755"
获取主机信息及调试 setup 可以用来查看远程主机的一些基本信息:
1 ansible 10.1.1.20 -m setup
只将主机某个信息打印出来
1 ansible rsync -m setup -a "filter=ansible_all_ipv4_addresses"
常用主机信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ansible_all_ipv4_addresses: 仅显示ipv4的信息。 ansible_devices: 仅显示磁盘设备信息。 ansible_distribution: 显示是什么系统,例:centos,suse等。 ansible_distribution_major_version: 显示是系统主版本。 ansible_distribution_version: 仅显示系统版本。 ansible_machine: 显示系统类型,例:32位,还是64位。 ansible_eth0: 仅显示eth0的信息。 ansible_hostname: 仅显示主机名。 ansible_kernel: 仅显示内核版本。 ansible_lvm: 显示lvm相关信息。 ansible_memtotal_mb: 显示系统总内存。 ansible_memfree_mb: 显示可用系统内存。 ansible_memory_mb: 详细显示内存情况。 ansible_swaptotal_mb: 显示总的swap内存。 ansible_swapfree_mb: 显示swap内存的可用内存。 ansible_mounts: 显示系统磁盘挂载情况。 ansible_processor: 显示cpu个数(具体显示每个cpu的型号)。 ansible_processor_vcpus: 显示cpu个数(只显示总的个数)。
debug 使用 Ansible 最痛苦的就是远程命令没有生效,但又看不到报错信息,Debug 就是为了解决这个烦恼。
1 2 3 msg:调试输出的消息 var:将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出 verbosity:debug的级别(默认是0级,全部显示)
实例:
1 2 3 4 5 6 7 8 9 - hosts: web remote_user: root tasks: - name: Get path shell: | pwd register: result - name: Get debug info debug: var=result verbosity=0
result.cmd
运行的命令result.stdout
运行的结果