Ansible系列基础篇 1.5、常用模块
一、ping
功能:ping主机是否通。
# 示例 ansible all -m ping
二、copy
功能:将ansible主机上的文件拷贝到远程主机中。
参数 | 说明 |
src | 用于指定需要copy的文件或目录 |
dest | 用于指定文件将被拷贝到远程主机的哪个目录中,dest为必须参数 |
content | 当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src与content两个参数必有其一,否则会报错 |
force | 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖,可选值有yes和no,默认值为yes,表示覆盖,如果设置为no,则不会执行覆盖拷贝操作,远程主机中的文件保持不变 |
backup | 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否对远程主机的文件进行备份,可选值有yes和no,当设置为yes时,会先备份远程主机中的文件,然后再将ansible主机中的文件拷贝到远程主机 |
owner | 指定文件拷贝到远程主机后的属主,但是远程主机上必须有对应的用户,否则会报错 |
group | 指定文件拷贝到远程主机后的属组,但是远程主机上必须有对应的组,否则会报错 |
mode |
指定文件拷贝到远程主机后的权限,如果你想将权限设置为"rw-r--r--",则可以使用mode=0644表示,如果你想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示 示例:u=rwX,g=rX,o=rX ; u=rwX,g=,o= (如果权限为0,可以等号后内容不写,但要加上这格式) |
# 示例 # 把~/test.txt文件,拷贝到/usr/local/logs/目录下 ansible all -m copy -a "src=~/test.txt dest=/usr/local/logs/" # 把当前目录下authorized_keys文件,拷贝到/home/servyou/.ssh/authorized_keys - name: servyou账号,上传authorized_keys文件 copy: src: authorized_keys dest: /home/servyou/.ssh/authorized_keys owner: servyou group: servyou mode: '0600'
三、file
功能:完成一些对文件的基本操作,比如,创建文件或目录、删除文件或目录、修改文件权限等。
参数 | 说明 |
path | 必须参数,用于指定要操作的文件或目录,在之前版本的ansible中,使用dest参数或者name参数指定要操作的文件或目录,为了兼容之前的版本,使用dest或name也可以 |
state | 此参数非常灵活,此参数对应的值需要根据情况设定,比如,当我们需要在远程主机中创建一个目录的时候,我们需要使用path参数指定对应的目录路径,假设,我想要在远程主机上创建/testdir/a/b目录,那么我则需要设置path=/testdir/a/b,但是,我们无法从"/testdir/a/b"这个路径看出b是一个文件还是一个目录,ansible也同样无法单单从一个字符串就知道你要创建文件还是目录,所以,我们需要通过state参数进行说明,当我们想要创建的/testdir/a/b是一个目录时,需要将state的值设置为directory,"directory"为目录之意,当它与path结合,ansible就能知道我们要操作的目标是一个目录,同理,当我们想要操作的/testdir/a/b是一个文件时,则需要将state的值设置为touch,当我们想要创建软链接文件时,需将state设置为link,想要创建硬链接文件时,需要将state设置为hard,当我们想要删除一个文件时(删除时不用区分目标是文件、目录、还是链接),则需要将state的值设置为absent,"absent"为缺席之意,当我们想让操作的目标"缺席"时,就表示我们想要删除目标 |
src | 当state设置为link或者hard时,表示我们想要创建一个软链或者硬链,所以,我们必须指明软链或硬链链接的哪个文件,通过src参数即可指定链接源 |
force | 当state=link的时候,可配合此参数强制创建链接文件,当force=yes时,表示强制创建链接文件,不过强制创建链接文件分为两种情况,情况一:当你要创建的链接文件指向的源文件并不存在时,使用此参数,可以先强制创建出链接文件。情况二:当你要创建链接文件的目录中已经存在与链接文件同名的文件时,将force设置为yes,回将同名文件覆盖为链接文件,相当于删除同名文件,创建链接文件。情况三:当你要创建链接文件的目录中已经存在与链接文件同名的文件,并且链接文件指向的源文件也不存在,这时会强制替换同名文件为链接文件 |
owner | 用于指定被操作文件的属主,属主对应的用户必须在远程主机中存在,否则会报错 |
group | 用于指定被操作文件的属组,属组对应的组必须在远程主机中存在,否则会报错 |
mode | 用于指定被操作文件的权限,比如,如果想要将文件权限设置为"rw-r-x---",则可以使用mode=650进行设置,或者使用mode=0650,效果也是相同的,如果你想要设置特殊权限,比如为二进制文件设置suid,则可以使用mode=4700,很方便吧 |
recurse | 当要操作的文件为目录,将recurse设置为yes,可以递归的修改目录中文件的属性 |
# 示例 # 在主机上创建一个名为testfile的文件,如果testfile文件已经存在,则会更新文件的时间戳,与touch命令的作用相同 ansible all -m file -a "path=/usr/local/testfile state=touch" # 在主机上创建一个名为testdir的目录,如果testdir目录已经存在,则不进行任何操作 ansible all -m file -a "path=/usr/local/testdir state=directory" # 在主机上为testfile文件创建软链接文件,软链接名为linkfile ansible all -m file -a "path=/usr/local/linkfile state=link src=/usr/local/testfile" # 在主机上为testfile文件创建硬链接文件,硬链接名为hardfile ansible all -m file -a "path=/usr/local/hardfile state=hard src=/usr/local/testfile" # 在创建链接文件时,如果源文件不存在,或者链接文件与其他文件同名时,强制覆盖同名文件或者创建链接文件,参考上述force参数的解释。 ansible all -m file -a "path=/usr/local/linkfile state=link src=/usr/local/testfile force=yes" ansible all -m file -a "path=/usr/local/hardfile state=hard src=/usr/local/testfile force=yes" # 删除远程机器上的指定文件或目录 ansible all -m file -a "path=/usr/local/testdir state=absent" # 在创建文件或目录的时候指定属主、属组、权限,或者修改远程主机上的文件或目录的属主、属组、权限。 ansible all -m file -a "path=/usr/local/testfile owner=root group=root mode=0755" ansible all -m file -a "path=/usr/local/testfile owner=root group=root mode=mode=u=rwx,g=rx,o=rx" # 当操作远程主机中的目录时,同时递归的将目录中的文件的属主属组都设置为zsy。 ansible all -m file -a "path=/usr/local/testfile owner=root group=root mode=0755 recurse=yes"
四、command
功能:帮助我们在远程主机上执行命令。
注意:使用command模块在远程主机中执行命令时,不会经过远程主机的shell处理,在使用command模块时,如果需要执行的命令中含有重定向、管道符等操作时,这些符号也会失效,比如"<", ">", "|", ";" 和 "&" 这些符号,如果你需要这些功能,可以参考后面介绍的shell模块,还有一点需要注意,如果远程节点是windows操作系统,则需要使用win_command模块。
参数 | 说明 |
free_form | 必须参数,指定需要远程执行的命令,需要说明一点,free_form参数与其他参数并不相同,在之前的模块示例中,如果想要使用一个参数,那么则需要为这个参数赋值,举个例子,之前的示例模块中,大多都有path参数,当我们需要指定要操作的文件时,通常需要对path参数赋值,比如,path=/testdir/test,表示我们想要操作/testdir/test文件,但是free_form参数则不同,"free_form"并不是一个"实际存在"的参数名,比如,当我们想要在远程主机上执行ls命令时,我们并不需要写成"free_form=ls" ,这样写反而是错误的,因为并没有任何参数的名字是free_form,当我们想要在远程主机中执行ls命令时,直接写成ls即可,这就是free_form参数的含义,因为command模块的作用是执行命令,所以,任何一个可以在远程主机上执行的命令都可以被称为free_form,如果你还是不明白,看下面的小示例就行了。 |
chdir | 此参数的作用就是指定一个目录,在执行对应的命令之前,会先进入到chdir参数指定的目录中。 |
creates | 看到creates,你可能会从字面上理解这个参数,但是使用这个参数并不会帮助我们创建文件,它的作用是当指定的文件存在时,就不执行对应命令,比如,如果/testdir/test文件存在,就不执行我们指定的命令。 |
removes | 与creates参数的作用正好相反,它的作用是当指定的文件不存在时,就不执行对应命令,比如,如果/testdir/tests文件不存在,就不执行我们指定的命令,此参数并不会帮助我们删除文件。 |
# 远程主机上执行命令,默认在使用用户的家目录下执行 ansible all -m command -a "ls" # 进入指定的目录执行命令 ansible all -m command -a "chdir=/usr/local/ ls" # 远程有此文件或目录,则不执行命令 ansible all -m command -a "creates=/usr/local/ ls" # 远程无文件或目录,则不执行命令 ansible all -m command -a "removes=/usr/local/ ls"
五、shell
功能:shell模块可以帮助我们在远程主机上执行命令,与command模块不同的是,shell模块在远程主机中执行命令时,会经过远程主机上的/bin/sh程序处理。
参数 | 说明 |
free_form | 功能同command模块一样 |
chdir | 功能同command模块一样 |
creates | 功能同command模块一样 |
removes | 功能同command模块一样 |
executable | 默认情况下,shell模块会调用远程主机中的/bin/sh去执行对应的命令,通常情况下,远程主机中的默认shell都是bash,如果你想要使用其他类型的shell执行命令,则可以使用此参数指定某种类型的shell去执行对应的命令,指定shell文件时,需要使用绝对路径。 |
# 使用shell模块可以在远程服务器上执行命令,它支持管道与重定向等符号。 ansible all -m shell -a "chdir=/usr/local/ echo test > test" # 指定shell ansible all -m shell -a "executable=/usr/bin/bash echo test > test"
六、script
功能:帮助我们在远程主机上执行ansible主机上的脚本,也就是说,脚本一直存在于ansible主机本地,不需要手动拷贝到远程主机后再执行。
参数 | 说明 |
free_form | 功能同command模块一样 |
chdir | 功能同command模块一样 |
creates | 功能同command模块一样 |
removes | 功能同command模块一样 |
# 把本地脚本在远程主机上运行 ansible all -m script -a "/usr/local/test.sh"
七、copy
功能:将 ansible 管理主机上的文件拷贝到远程主机中。
参数 | 说明 |
src | 用于指定需要copy的文件或目录。 |
dest | 用于指定文件将被拷贝到远程主机的哪个目录中,dest为必须参数。 |
content | 当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src与content两个参数必有其一,否则会报错。 |
force | 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖,可选值有yes和no,默认值为yes,表示覆盖,如果设置为no,则不会执行覆盖拷贝操作,远程主机中的文件保持不变。 |
backup | 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否对远程主机的文件进行备份,可选值有yes和no,当设置为yes时,会先备份远程主机中的文件,然后再将ansible主机中的文件拷贝到远程主机。 |
owner | 指定文件拷贝到远程主机后的属主,但是远程主机上必须有对应的用户,否则会报错。 |
group | 指定文件拷贝到远程主机后的属组,但是远程主机上必须有对应的组,否则会报错。 |
mode | 指定文件拷贝到远程主机后的权限,如果你想将权限设置为”rw-r--r--“,则可以使用mode=0644表示,如果你想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示。 |
# 示例 ansible 10.96.0.59 -m copy -a "src=~/test.txt dest=/usr/local/ backup=yes owner=root group=root mode=644" # playbook示例 - name: 文件拷贝 copy: src: /mine/ntp.conf dest: /etc/ntp.conf owner: root group: root mode: '0644' backup: yes
copy模块拓展:https://www.jianshu.com/p/e000205cee60
八、fetch
功能:将远程主机中的文件拷贝到管理主机上。
注意:不能拷贝目录
参数 | 说明 |
src | 在远程拉取的文件,并且必须是一个file,不能是目录。用来存放文件的目录,例如存放目录为/backup,源文件名称为/etc/profile/pythonserver,那么保存为/backup/<主机名或ip(inventory中的内容)>/etc/profile/pythonserver。 |
dest | 用来存放文件的目录 |
flat | 如果flat为yes,不按照src的目录来创建目录。flat为no就创建和src一样的目录. |
Fail_on_missing | 当源文件不存在的时候,标识为失败 |
Validate_checksum | 当文件fetch之后进行md5检查 |
# 从远程下拉文件 ansible all -m fetch -a "src=/usr/local/test.txt dest=/root/" # 不建立远程的目录 ansible all -m fetch -a "src=/usr/local/test.txt dest=/root/ flat=true"
示例代码一结果:
示例代码二结果:
九、setup
功能:用于收集远程主机的一些基本信息。
参数 | 说明 |
fact_path |
搜集主机自定义的信息,区别于setup模块搜集的系统信息,可以在"ansible_local"下查看自定义变量。 默认会去目标主机的/etc/ansible/facts.d目录下查找主机中的自定义信息,并且规定,自定义信息需要写在以 |
filter | 用于进行条件过滤。 |
gather_subset |
控制facts的收集种类,默认值为all。参考:https://www.cnblogs.com/mauricewei/p/10056494.html 参数有all, min, hardware, network, virtual, ohai, facter,可以使用列表的格式指定多个参数,使用「!」指定不收集的facts类型。
|
gather_timeout | 设置超时时间,默认10秒。 |
# 搜集远程主机信息
ansible 10.96.0.59 -m setup
# 过滤信息
ansible 10.96.0.59 -m setup -a "filter=ansible_all_ipv4_addresses"
# 泛过滤
ansible 10.96.0.59 -m setup -a "filter=*mb"
# 示例 fact_path 功能
# 远程机器,自定义变量结构,/etc/ansible/facts.d/
/etc/ansible/facts.d/
└── test.fact
# test.fact 文件内容
[pe]
name=pe
age=2
# 执行命令(默认路径):ansible 10.96.0.59 -m setup -a "filter=ansible_local"
# 执行命令(自定义路劲):ansible 10.96.0.59 -m setup -a "filter=ansible_local fact_path=/etc/ansible/"
# 在ansible_local下查到自定义的变量
10.96.0.59 | SUCCESS => {
"ansible_facts": {
"ansible_local": {
"test": {
"pe": {
"age": "2",
"name": "pe"
}
}
},
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
# 关于gather_subset的使用,个人不理解各个之间的区别,只是感觉显示内容多少是有差别的
ansible all -m setup -a 'gather_subset=!all,!any,facter'
ansible all -m setup -a 'gather_subset=network'
十、debug
功能:调试playbook
参数 | 说明 |
msg | 调试输出文本消息 |
var | 将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出,不可与msg选项共用。 |
verbosity | debug的级别(默认是0级,全部显示) |
# var使用示例 --- - hosts: 10.96.0.59 remote_user: root vars: testvar: value of test variable tasks: - name: debug demo debug: var: testvar #或者 msg: value of test variable ...
# 获取setup中的系统变量
---
- hosts: all
remote_user: root
tasks:
- name: debug demo
debug:
msg: "{{ ansible_all_ipv4_addresses }}" # 这里一定要加上引号,否则失败
...
https://www.cnblogs.com/wanwz/archive/2004/01/13/12921827.html
cron
service
lineinfile
user
group
blockinfile
find
replace