ansible学习日记-基本模块使用(3)

ansible 附带了很多可以直接在远端主机或者通过 Playbooks 执行的模块

用户也可以写出属于自己的模块.这些模块可以控制系统的资源 ,像服务,包管理,文件,或执行系统命令.

ansible具有幂等性,幂等性能够保证我们重复的执行一项操作时,得到的结果是相同的,比如拷贝文件,生成新文件等时,如果重复执行并不会覆盖,而是检测出已经操作后跳过。

一、文件操作模块

1.ping(第一节使用的模块,可以测试主机间联通性)

用法示例:

ansible all -m ping

2.fetch(从远端主机拉取文件到主控端)

用法示例:

从所有被控端中的/etc/fstab文件拷贝至主控端的/testdir/ansible/,这里会再次生成文件夹区分不同主机拉取过来的文件。下图为使用结果,可见第一次执行时,"changed": true。第二次执行时为false。是通过md5文件校验,如果是相同的文件的话那就跳过,校验出文件内容不同就覆盖。

[root@ansible-master ansible]# ansible all -m fetch -a 'src=/etc/fstab dest=/testdir/ansible'
192.168.174.145 | CHANGED => {
    "changed": true,
    "checksum": "8ee76552824594fa89cbb31970950bb125cdb7b6",
    "dest": "/testdir/ansible/192.168.174.145/etc/fstab",
    "md5sum": "1b8c9ff7f4c278819822b244d2ecd4d3",
    "remote_checksum": "8ee76552824594fa89cbb31970950bb125cdb7b6",
    "remote_md5sum": null
}
192.168.174.144 | CHANGED => {
    "changed": true,
    "checksum": "8ee76552824594fa89cbb31970950bb125cdb7b6",
    "dest": "/testdir/ansible/192.168.174.144/etc/fstab",
    "md5sum": "1b8c9ff7f4c278819822b244d2ecd4d3",
    "remote_checksum": "8ee76552824594fa89cbb31970950bb125cdb7b6",
    "remote_md5sum": null
}
[root@ansible-master ansible]# ls
192.168.174.144  192.168.174.145
[root@ansible-master ansible]# ansible all -m fetch -a 'src=/etc/fstab dest=/testdir/ansible'
192.168.174.145 | SUCCESS => {
    "changed": false,
    "checksum": "8ee76552824594fa89cbb31970950bb125cdb7b6",
    "dest": "/testdir/ansible/192.168.174.145/etc/fstab",
    "file": "/etc/fstab",
    "md5sum": "1b8c9ff7f4c278819822b244d2ecd4d3"
}
192.168.174.144 | SUCCESS => {
    "changed": false,
    "checksum": "8ee76552824594fa89cbb31970950bb125cdb7b6",
    "dest": "/testdir/ansible/192.168.174.144/etc/fstab",
    "file": "/etc/fstab",
    "md5sum": "1b8c9ff7f4c278819822b244d2ecd4d3"
}
[root@ansible-master ansible]#

2.copy

(copy模块的作用就是拷贝文件,与fetch模块类似,不过,fetch模块是从远程主机中拉取文件到ansible主机,而copy模块是将ansible主机上的文件拷贝到远程主机中。)

src参数    :指定需要copy的文件或目录

dest参数  :指定文件将被拷贝到远程主机的哪个目录中,dest为必须参数

content参数  :使用content直接指定文件内容,src与content两个参数必有其一,否则会报错。

force参数  :  远程主机中存在的同名文件且内容不同时,是否强制覆盖,默认值为yes,表示覆盖,如果设置为no,则不会执行覆盖拷贝操作,远程主机文件保持不变。

backup参数 :  远程主机中存在的同名文件且内容不同时,是否对远程主机的文件进行备份,可选值有yes和no,当设置为yes时,会先备份远程主机中的文件,然后再将ansible主机中的文件拷贝到远程主机。

owner参数 : 指定文件拷贝到远程主机后的属主,但是远程主机上必须有对应的用户,否则会报错。

group参数 : 指定文件拷贝到远程主机后的属组,但是远程主机上必须有对应的组,否则会报错。

mode参数 : 指定文件拷贝到远程主机后的权限,如果你想将权限设置为”rw-r–r–“,则可以使用mode=0644表示,如果你想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示。

示例1:

先在主控端的/opt目录下创建一个测试文件
[root@ansible-master opt]# cat ansible_copy.txt
this a test txt
[root@ansible-master opt]#

将测试文件拷贝到两个被控端

ansible all -m copy -a "src=/opt/ansible_copy.txt dest=/opt/"

[root@ansible-master opt]# ansible all -m copy -a "src=/opt/ansible_copy.txt dest=/opt/"
192.168.174.144 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "checksum": "13a6b0d3b8d7771d93a10ac91e73596e8a2e7e9a",
    "dest": "/opt/ansible_copy.txt",
    "gid": 0,
    "group": "root",
    "md5sum": "19b4bc05ccc1ba06e72ac796671fe7ad",
    "mode": "0644",
    "owner": "root",
    "secontext": "system_u:object_r:usr_t:s0",
    "size": 16,
    "src": "/root/.ansible/tmp/ansible-tmp-1687503705.25-123895-131610591640067/source",
    "state": "file",
    "uid": 0
}
192.168.174.145 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "checksum": "13a6b0d3b8d7771d93a10ac91e73596e8a2e7e9a",
    "dest": "/opt/ansible_copy.txt",
    "gid": 0,
    "group": "root",
    "md5sum": "19b4bc05ccc1ba06e72ac796671fe7ad",
    "mode": "0644",
    "owner": "root",
    "secontext": "system_u:object_r:usr_t:s0",
    "size": 16,
    "src": "/root/.ansible/tmp/ansible-tmp-1687503705.27-123897-98867555672959/source",
    "state": "file",
    "uid": 0
}
[root@ansible-master opt]#

示例2:

在远程主机的/opt目录下生成文件test,test文件中有两行文本,第一行文本为aaa,第二行为bbb,当使用content指定文件内容时,dest参数对应的值必须是一个文件,而不能是一个路径。

ansible all -m copy -a 'content="aaa\nbbb\n" dest=/opt/test'


[root@ansible-master opt]# ansible all -m copy -a 'content="aaa\nbbb\n" dest=/opt/test'
192.168.174.144 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "checksum": "90c206af0bfefa95541d3e724efe1dbc1ed3877f",
    "dest": "/opt/test",
    "gid": 0,
    "group": "root",
    "md5sum": "8b652b8c79f357694a04bd793f533c96",
    "mode": "0644",
    "owner": "root",
    "secontext": "system_u:object_r:usr_t:s0",
    "size": 8,
    "src": "/root/.ansible/tmp/ansible-tmp-1687503803.32-124539-262138023152781/source",
    "state": "file",
    "uid": 0
}
192.168.174.145 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "checksum": "90c206af0bfefa95541d3e724efe1dbc1ed3877f",
    "dest": "/opt/test",
    "gid": 0,
    "group": "root",
    "md5sum": "8b652b8c79f357694a04bd793f533c96",
    "mode": "0644",
    "owner": "root",
    "secontext": "system_u:object_r:usr_t:s0",
    "size": 8,
    "src": "/root/.ansible/tmp/ansible-tmp-1687503808.37-124541-219095991713360/source",
    "state": "file",
    "uid": 0
}
[root@ansible-master opt]#

示例3:

将ansible主机中/testdir/copytest文件复制到远程主机的/opt目录中时,如果远程主机中已经存在/opt/copytest文件,并且文件内容与ansible主机中的copytest文件的内容不一致,则不执行拷贝操作,远程主机中的/opt/copytest文件内容不会被改变。

ansible all -m copy -a "src=/opt/ansible_copy.txt dest=/opt/ force=no"

示例4:

将ansible主机中/testdir/copytest文件复制到远程主机的/opt目录中时,如果远程主机中已经存在/opt/copytest文件,并且文件内容与ansible主机中的copytest文件的内容不一致,会执行拷贝操作,但是在执行拷贝操作之前,会将远程主机中的原文件重命名,以作备份,然后再进行拷贝操作。

ansible all -m copy -a "src=/opt/ansible_copy.txt dest=/opt/ backup=yes"

示例5:

拷贝文件时,指定文件的属主和组,指定权限,需要注意,远程主机上必须存在对应的用户与组。

ansible all -m copy -a "src=/opt/ansible_copy.txt dest=/opt/ owner=yyy group=yyy mode=0640"


[root@ansible-master opt]# ansible all -m copy -a "src=/opt/ansible_copy.txt dest=/opt/ owner=yyy group=yyy mode=0640"
192.168.174.144 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "checksum": "13a6b0d3b8d7771d93a10ac91e73596e8a2e7e9a",
    "dest": "/opt/ansible_copy.txt",
    "gid": 1000,
    "group": "yyy",
    "md5sum": "19b4bc05ccc1ba06e72ac796671fe7ad",
    "mode": "0640",
    "owner": "yyy",
    "secontext": "system_u:object_r:usr_t:s0",
    "size": 16,
    "src": "/root/.ansible/tmp/ansible-tmp-1687504151.31-126216-68361554824478/source",
    "state": "file",
    "uid": 1000
}
192.168.174.145 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "checksum": "13a6b0d3b8d7771d93a10ac91e73596e8a2e7e9a",
    "dest": "/opt/ansible_copy.txt",
    "gid": 1000,
    "group": "yyy",
    "md5sum": "19b4bc05ccc1ba06e72ac796671fe7ad",
    "mode": "0640",
    "owner": "yyy",
    "secontext": "system_u:object_r:usr_t:s0",
    "size": 16,
    "src": "/root/.ansible/tmp/ansible-tmp-1687504151.32-126218-258738177370559/source",
    "state": "file",
    "uid": 1000
}
[root@ansible-master opt]#

3.file

file模块可以帮助我们完成一些对文件的基本操作,比如,创建文件或目录、删除文件或目录、修改文件权限等

path参数 :必须参数,用于指定要操作的文件或目录。

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,效果也是相同的(最前面的0代表了特殊权限)。

recurse参数:当要操作的文件为目录,将recurse设置为yes,可以递归的修改目录中文件的属性。

对应上述参数示例命令如下:

示例1:

批量创建一个名为testfile的文件,与touch命令的作用相同。

ansible all -m file -a "path=/opt/ceshi.txt state=touch"

[root@ansible-master opt]# ansible all -m file -a "path=/opt/ceshi.txt state=touch"
192.168.174.145 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "dest": "/opt/ceshi.txt",
    "gid": 0,
    "group": "root",
    "mode": "0644",
    "owner": "root",
    "secontext": "unconfined_u:object_r:usr_t:s0",
    "size": 0,
    "state": "file",
    "uid": 0
}
192.168.174.144 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "dest": "/opt/ceshi.txt",
    "gid": 0,
    "group": "root",
    "mode": "0644",
    "owner": "root",
    "secontext": "unconfined_u:object_r:usr_t:s0",
    "size": 0,
    "state": "file",
    "uid": 0
}
[root@ansible-master opt]#

示例2:

批量创建一个名为testdir的目录。

ansible all -m file -a "path=/opt/testdir state=directory"

[root@ansible-master opt]# ansible all -m file -a "path=/opt/testdir state=directory"
192.168.174.145 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "gid": 0,
    "group": "root",
    "mode": "0755",
    "owner": "root",
    "path": "/opt/testdir",
    "secontext": "unconfined_u:object_r:usr_t:s0",
    "size": 6,
    "state": "directory",
    "uid": 0
}
192.168.174.144 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "gid": 0,
    "group": "root",
    "mode": "0755",
    "owner": "root",
    "path": "/opt/testdir",
    "secontext": "unconfined_u:object_r:usr_t:s0",
    "size": 6,
    "state": "directory",
    "uid": 0
}
[root@ansible-master opt]#

示例3:

为testfile文件创建软链接文件,软链接名为linkfile,执行下面命令的时候,testfile已经存在。

ansible all -m file -a "path=/testdir/linkfile state=link src=/testdir/testfile"

为testfile文件创建硬链接文件,硬链接名为hardfile,执行下面命令的时候,testfile已经存在。

ansible all -m file -a "path=/testdir/hardfile state=hard src=/testdir/testfile"

 

示例4:

删除远程机器上的指定文件或目录

ansible all -m file -a "path=/testdir/testdir state=absent"

在创建文件或目录的时候指定属主属组权限,或者修改远程主机上的文件或目录的属主属组权限。

ansible all -m file -a "path=/testdir/abc state=touch owner=yyy group=yyy mode=0644"

ansible all -m file -a "path=/testdir/abc owner=yyy group=yyy mode=0644"

ansible all -m file -a "path=/testdir/abc state=directory owner=yyygroup=yyy mode=0644"


示例5

 

当操作远程主机中的目录时,同时递归的将目录中的文件的属主属组都设置为yyy。

ansible all -m file -a "path=/testdir/abd state=directory owner=yyy group=yyy recurse=yes"

 

4.blockinfile

这个只取其中一种用法

示例1:

向/etc/resolv.conf文件末尾添加dns服务器

ansible all -m blockinfile -a 'path=/etc/resolv.conf block="nameserver 114.114.114.114\nnameserver 8.8.8.8"'

使用path参数指定要操作的文件,使用block参数指定文本块内容,使用\n表示换行.执行上述命令后,/etc/resolv.conf的文件尾部会多出如下文本块

[root@ansible-slave1 etc]# cat /etc/resolv.conf
# BEGIN ANSIBLE MANAGED BLOCK
nameserver 114.114.114.114
nameserver 8.8.8.8
# END ANSIBLE MANAGED BLOCK
[root@ansible-slave1 etc]#

示例2:

修改之前标记的文本块

ansible all -m blockinfile -a 'path=/etc/resolv.conf block="nameserver 114.114.114.114"'

结果就是nameserver 8.8.8.8被删除了。这里重复执行也只会执行一次。

其余文件操作模块

find  replace读者自行查阅学习。

二、命令类模块

1.command模块

可以帮助我们在远程主机上执行命令,这个不经过远程主机shell。如果含有重定向、管道符等操作时,这些符号也会失效。

chdir参数 :  此参数的作用就是指定一个目录,在执行对应的命令之前,会先进入到chdir参数指定的目录中。

creates参数 :用是当指定的文件存在时,就不执行对应命令,比如,如果/testdir/test文件存在,就不执行我们指定的命令。

removes参数 :与creates参数的作用正好相反,如果/testdir/tests文件不存在,就不执行我们指定的命令,此参数并不会帮助我们删除文件

示例1:

ansible all -m command -a "ls"

[root@ansible-master opt]# ansible all -m command -a "ls"
192.168.174.144 | CHANGED | rc=0 >>
anaconda-ks.cfg
192.168.174.145 | CHANGED | rc=0 >>
anaconda-ks.cfg
[root@ansible-master opt]#

示例2:

如下命令表示/testdir/test文件如果存在于远程主机中,则不执行对应命令,如果不存在,才执行”echo test”命令

ansible all -m command -a "creates=/testdir/test echo test"

2.shell模块

shell模块可以帮助我们在远程主机上执行命令,与command模块不同的是,shell模块在远程主机中执行命令时,会经过远程主机上的/bin/sh程序处理。

示例1:

ansible all -m shell -a "chdir=/testdir echo test > test"

3.script模块

可以帮助我们在远程主机上执行ansible主机上的脚本,也就是说,脚本一直存在于ansible主机本地,不需要手动拷贝到远程主机后再执行。

示例:

如下命令表示ansible主机中的/testdir/atest.sh脚本将在test70主机中执行,执行此脚本之前,会先进入到test70主机中的/opt目录

ansible all -m script -a "chdir=/opt /testdir/atest.sh"

三、系统类模块

1.cron模块

顾名思义,与crontab(linux下的定时任务)相关

示例:

ansible all -m cron -a " name='test crontab' minute=5 hour=1 job='echo test'"

被控端结果:

[root@ansible-slave1 etc]# crontab -l
#Ansible: test crontab
5 1 * * * echo test
[root@ansible-slave1 etc]#

2.service模块

service模块可以帮助我们管理远程主机上的服务,比如,启动或停止远程主机中的nginx服务。

注:service模块能管理的必须是原来就能service,systemctl管理的服务才行

name参数:此参数用于指定需要操作的服务名称,比如nginx

state参数:此参数用于指定服务的状态,比如,我们想要启动远程主机中的nginx,则可以将state的值设置为started,如果想要停止远程主机中的服务,则可以将state的值设置为stopped,此参数的可用值有started、stopped、restarted、reloaded

enabled参数:此参数用于指定是否将服务设置为开机启动项,设置为yes表示将对应服务设置为开机启动,设置为no表示不会开机启动。

将所有主机中的nginx服务处于启动状态

ansible all -m service -a "name=nginx state=started"

将test70中的nginx服务处于停止状态

ansible all -m service -a "name=nginx state=stopped"

将test70中的nginx服务被设置为开机自动启动项

ansible all -m service -a " name='nginx' enabled=yes"

3.user模块、group模块

自行查阅。增加修改删除用户,组,密码等功能

四、包管理模块

注:各个模块中功能可能会存在重叠,即可以使用不同模块来实现相同的结果

1.yum_repository模块

自行查阅,设置yum仓库的

2.yum模块

yum模块可以帮助我们在远程主机上通过yum源管理软件包。

name参数:必须参数,用于指定需要管理的软件包,比如http

state参数:用于指定软件包的状态 ,默认值为present,表示确保软件包已经安装,除了present,其他可用值有installed、latest、absent、removed,其中installed与present等效,latest表示安装yum中最新的版本,absent和removed等效,表示删除对应的软件包。

disable_gpg_check参数:用于禁用对rpm包的公钥gpg验证,默认值为no,表示不禁用验证,设置为yes表示禁用验证,即不验证包,直接安装,在对应的yum源没有开启gpg验证的情况下,需要将此参数的值设置为yes,否则会报错而无法进行安装。

enablerepo参数:用于指定安装软件包时临时启用的yum源,假如你想要从A源中安装软件,但是你不确定A源是否启用了,你可以在安装软件包时将此参数的值设置为yes,即使A源的设置是未启用,也可以在安装软件包时临时启用A源。

disablerepo参数:用于指定安装软件包时临时禁用的yum源,某些场景下需要此参数,比如,当多个yum源中同时存在要安装的软件包时,你可以使用此参数临时禁用某个源,这样设置后,在安装软件包时则不会从对应的源中选择安装包。

enablerepo参数和disablerepo参数可以同时使用

示例:

通过yum源安装了nginx(对应yum源未开启gpg验证,所以需要设置disable_gpg_check=yes)

ansible all -m yum -a 'name=nginx state=installed disable_gpg_check=yes'

确保主机上安装了yum源中最新版本的nginx

ansible all -m yum -a 'name=nginx state=latest disable_gpg_check=yes'

确保主机上通过yum源安装的nginx被卸载了

ansible all -m yum -a 'name=nginx state=absent'

ansible all -m yum -a 'name=nginx state=removed'

在主机上安装telnet时不确定local源是否启用,使用enablerepo=local确保临时启用local源

ansible all -m yum -a 'name=telnet disable_gpg_check=yes enablerepo=local'

在主机上安装telnet时,确定多个源中都有telnet,但是不想从local源中安装,所以在安装时临时禁用local源

ansible all-m yum -a 'name=telnet disable_gpg_check=yes disablerepo=local'

ansible模块还有很多,这里只列了常见的。如果不知道用啥模块,推荐用shell(狗头)。如果shell模块解决起来不方便,可以自行查阅是否有别人做好的模块了。

参考:ansible笔记(10):初识ansible playbook-朱双印博客这篇文章可以教会你怎样编写ansible playbook,即编写ansible剧本https://www.zsythink.net/archives/2602

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值