Ansible核心内容(模块)

官方文档

Ansible执行命令结果(状态颜色)

绿色:命令以用户期望的执行了,但是状态没有发生改变;

黄色:命令以用户期望的执行了,并且状态发生了改变;

紫色:警告信息,说明ansible提示你有更合适的用法;

红色:命令错误,执行失败;

蓝色:详细的执行过程;

ping测试连通性

官方文档

命令语法

ansible 主机组 -m 模块名  [模块参数]

查看模块解释

[root@master-61 ~]#ansible-doc -s ping
- name: Try to connect to host, verify a usable python and return `pong' on success
  ping:
      data:                  # Data to return for the `ping' return value. If this parameter is set to `crash', the
                               module will cause an exception.
[root@master-61 ~]#

执行

[root@master-61 ~]#ansible web -m ping
172.16.1.8 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
172.16.1.9 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
172.16.1.7 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

command 简单命令模块

官方文档

语法

[root@master-61 ~]#ansible-doc -s command
​
ansible 主机组 -m command -a "需要批量执行的命令"

该模块作用:在远程节点上执行一个命令

command模块是ansible命令基本模块

  • 使用command模块执行远程命令,命令不得用变量($HOME)

  • 不得出现特殊符号

    < 、>、|、;、&

    否则无法识别,需要则使用shell模块实现

    • 也就是无法使用复杂的linux命令

远程查看主机名

[root@master-61 ~]#ansible web -m command -a hostname
172.16.1.7 | CHANGED | rc=0 >>
web-7
172.16.1.9 | CHANGED | rc=0 >>
web-9
172.16.1.8 | CHANGED | rc=0 >>
web-8

简写,command是ansible的基础模块,默认就是-m command

[root@master-61 ~]#ansible web -a hostname
172.16.1.7 | CHANGED | rc=0 >>
web-7
172.16.1.9 | CHANGED | rc=0 >>
web-9
172.16.1.8 | CHANGED | rc=0 >>
web-8

查看远程主机内存

[root@master-61 ~]#ansible web -m command -a "free -m"

远程创建文件、查看文件

image-20240921093946537

[root@master-61 ~]#ansible web -m command -a "touch /opt/linux.log"
[root@master-61 ~]#ansible web -m command -a "ls /opt/"

远程获取机器负载

[root@master-61 ~]#ansible web -m command -a "uptime"

关闭告警信息

[root@master-61 ~]#ansible web -m command -a "touch /opt/linux.log warn=False"

在所有机器上,创建yang01用户

[root@master-61 ~]#ansible all -m command -a 'useradd yang01'
[root@master-61 ~]#ansible all -m command -a 'grep yang01 /etc/passwd'

使用command提供的专有命令

这些命令用于编写ansible-playbook,完成服务器部署的各种复杂条件限定。

选项参数

是否必须

选项说明

chdir

no

在执行命令执行,通过cd命令进入指定目录

creates

no

定义一个文件是否存在,若不存在,则运行相应命令;存在则跳过

free_form

yes

参数信息中可以输入任何系统命令,实现远程管理

removes

yes

定义一个文件是否存在,如果存在,则运行相应命令;如果不存在则跳过

Command练习

备份/var/log日志目录,需要先进入根目录

cd / && tar -zcvf /opt/log.tgz /var/log

注意你备份文件存放的文件夹是否存在

[root@master-61 ~]#ansible backup -m command -a "tar -zcf /opt/log.tgz var/log chdir=/"

在/opt下创建yangge666.log

ansible backup -m command -a "touch yangge666.log chdir=/opt"
或者
ansible backup -m command -a "touch /opt/yangge666.log"

备份/etc所有配置文件到 /backup_config/etc.tgz 。练习removes命令

1.这里就得提前考虑 /backup_config文件夹是否存在,必须先有文件夹,才能执行该备份命令
​
2.判断如果该文件夹不存在,则不执行备份
[root@master-61 ~]#ansible backup -m command -a 'tar -zcf /backup_config/etc.tgz removes=/backup_config'
172.16.1.41 | SUCCESS | rc=0 >>
skipped, since /backup_config does not exist
​
3.你必须先创建该文件夹
[root@master-61 ~]#ansible backup -m command -a 'mkdir /backup_config'
​
4.再次执行该命令
[root@master-61 ~]#ansible backup -m command -a 'tar -zcf /backup_config/etc.tgz /etc removes=/backup_config'

测试creates命令,如果目标目录已经存在了,就别创建该目录了

[root@master-61 ~]#ansible backup -m command -a 'mkdir /opt creates=/opt'
172.16.1.41 | SUCCESS | rc=0 >>
skipped, since /opt exists

执行命令,且忽略警告,要求你已经确认该命令是无误的。

[root@master-61 ~]#ansible backup -m command -a 'touch /home/666.log warn=False'
172.16.1.41 | CHANGED | rc=0 >>

远程过滤进程信息,无法使用(这时候就得用万能的shell模块了)

[root@master-61 ~]#ansible backup -m command -a 'ps -ef|grep ssh'
    
ansible backup -m shell -a 'ps -ef|grep ssh'

shell模块(万能模块)

shell模块功能:在远程节点上执行命令(复杂的命令)

官方文档

也就是等于你在linux上直接执行任何复杂的命令都可以,但是ansible的使用理念是,人家提供了几千个模块,并且有很复杂的功能,你在用shell模块之前,先查一查是否有对应的模块。

Shell练习

远程过滤ssh进程信息

[root@master-61 ~]#
[root@master-61 ~]#ansible backup -m shell -a 'ps -ef|grep ssh'
172.16.1.41 | CHANGED | rc=0 >>
root       2088      1  0 16:34 ?        00:00:00 sshd: root@pts/0
root       2128      1  0 16:37 ?        00:00:00 /usr/sbin/sshd -D
root       3951   2128  0 19:36 ?        00:00:00 sshd: root@pts/1
root       5907   2128  0 19:57 ?        00:00:00 sshd: root@pts/2
root       6099   6098  0 19:58 pts/2    00:00:00 /bin/sh -c ps -ef|grep ssh
root       6101   6099  0 19:58 pts/2    00:00:00 /bin/sh -c ps -ef|grep ssh

使用重定向符号,创建文件

[root@master-61 ~]#ansible backup -m shell -a "echo 666 >> /tmp/t1.log"
172.16.1.41 | CHANGED | rc=0 >>
​
[root@master-61 ~]#ansible backup -m shell -a "echo 666 >> /tmp/t1.log"
172.16.1.41 | CHANGED | rc=0 >>
​
[root@master-61 ~]#ansible backup -m shell -a "cat /tmp/t1.log"
172.16.1.41 | CHANGED | rc=0 >>
666
666

远程执行复杂linux命令

这个命令就无法在command中执行

通过一条命令,做如下事情

  • 创建文件夹

  • 生成sh脚本文件

  • 赋予脚本可执行权限

  • 执行脚本

  • 忽略warning信息

[root@master-61 ~]#ansible backup -m shell -a "mkdir -p /server/scripts/;echo 'hostname' > /server/scripts/hostname.sh;chmod +x /server/scripts/hostname.sh;/usr/bin/bash /server/scripts/hostname.sh  warn=false"
​
[WARNING]: Consider using the file module with state=directory rather than running 'mkdir'.  If you need to use command
because file is insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in
ansible.cfg to get rid of this message.
172.16.1.41 | CHANGED | rc=0 >>
rsync-41

小结shell模块

shell命令别过度依赖,那就等于用ansible远程帮你执行了个普通的shell命令;

你应该多去琢磨其他模块,如文件模块、拷贝模块,脚本模块,定时任务模块,yum模块等等等。

copy拷贝文件

copy模块是远程推送数据模块,只能把数据推送给远程主机节点,无法拉取数据到本地。

既然是文件拷贝,可用参数也就是围绕文件属性。

参数

是否必须

默认值

选项

说明

src

no

用于定位ansible执行的机器上的文件,需要绝对路径。如果拷贝的是文件夹,那么文件夹会整体拷贝,如果结尾是"/",那么只有文件夹内的东西被考过去。一切的感觉很像rsync

content

no

用来替代src,用于将指定文件的内容,拷贝到远程文件内

dest

yes

用于定位远程节点上的文件,需要绝对路径。如果src指向的是文件夹,这个参数也必须是指向文件夹

backup

no

no

yes/no

备份远程节点上的原始文件,在拷贝之前。如果发生什么意外,原始文件还能使用。

directory_mode

no

这个参数只能用于拷贝文件夹时候,这个设定后,文件夹内新建的文件会被拷贝。而老旧的不会被拷贝

follow

no

no

yes/no

当拷贝的文件夹内有Iink存在的时候,那么拷贝过去的也会有link

force

no

yes

yes/no

默认为yes,会覆盖远程的内容不一样的文件(可能文件名一样)。如果是no,就不会拷贝文件,如果远程有这个文件

group

no

设定一个群组拥有拷贝到远程节点的文件权限

mode

no

等同于chmod,参数可以为“u+rwx or u=rw, g=r,o=r"

owner

no

设定一个用户拥有拷贝到远程节点的文件权限

copy练习

语法

ansible 主机组 -m copy -a "参数"

简单发送文件

[root@master-61 ~]#ansible backup -m copy -a 'src=/tmp/yangge.log dest=/opt/'
​
[root@master-61 ~]#ansible backup -m shell -a 'ls /opt'
172.16.1.41 | CHANGED | rc=0 >>
yangge.log

发送文件且指定文件属性

权限改为600、修改为www用户(要求目标机器存在该用户)

创建www用户
[root@master-61 ~]#ansible backup -m shell -a "useradd www"
​
远程拷贝文件,修改权限
[root@master-61 ~]#ansible backup -m copy -a "src=/opt/master61.log  dest=/tmp/ owner=www group=www mode=600"
​
远程检查文件信息
[root@master-61 ~]#ansible backup -m shell -a "ls -l /tmp/master61.log"

发送文件且先做好备份

使用backup参数,防止覆盖远程文件,丢失备份,提前备份该目标机器的数据

1.检查目标机器的文件
[root@master-61 ~]#ansible backup -m shell -a "cat /opt/master61.log"
172.16.1.41 | CHANGED | rc=0 >>
超哥牛比
​
​
2.远程拷贝文件,且做好备份 backup=yes
[root@master-61 ~]#ansible backup -m copy -a "src=/opt/master61.log  dest=/opt/ owner=www group=www mode=600 backup=yes"
172.16.1.41 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "backup_file": "/opt/master61.log.14596.2022-04-25@15:49:21~", 
    "changed": true, 
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
    "dest": "/opt/master61.log", 
    "gid": 1889, 
    "group": "www", 
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e", 
    "mode": "0600", 
    "owner": "www", 
    "size": 0, 
    "src": "/root/.ansible/tmp/ansible-tmp-1650872960.6-29130-227131703855286/source", 
    "state": "file", 
    "uid": 1889
}
​
3.发现ansible帮你做好了备份
[root@master-61 ~]#ansible backup -m shell -a "ls /opt -l"
172.16.1.41 | CHANGED | rc=0 >>
total 4
-rw------- 1 www  www   0 Apr 25 15:49 master61.log
-rw-r--r-- 1 root root 13 Apr 25 15:47 master61.log.14596.2022-04-25@15:49:21~

指定数据写入到远程文件中

向rsyncd.conf中填入账号密码,覆盖其原有的文件内容

[root@master-61 ~]#ansible backup -m copy -a "content='rsync_backup:yang666' dest=/etc/rsync.passwd mode=600" 
​
[root@master-61 ~]#ansible backup -m shell -a "cat /etc/rsync.passwd"
172.16.1.41 | CHANGED | rc=0 >>
rsync_backup:yang666

注意像这样的覆盖操作,还是添加备份参数更合适

[root@master-61 ~]#ansible backup -m copy -a "content='rsync_backup:yangge666' dest=/etc/rsync.passwd mode=600 backup=yes" 
​
[root@master-61 ~]#ansible backup -m shell -a 'ls /etc/rsync*'

复制文件夹,注意结尾斜杠

[root@master-61 ~]#mkdir /opt/yang/666/sixsixsix -p
​
远程拷贝/opt/yang/下的所有内容
[root@master-61 ~]#ansible backup -m copy -a  "src=/opt/yang/ dest=/opt/"
​
远程拷贝/opt/yang整个目录到目标机器
[root@master-61 ~]#ansible backup -m copy -a  "src=/opt/yang dest=/opt/"

file文件操作模块

file模块作用是创建、以及设置文件目录属性。

file模块可以帮助我们完成一些对文件的基本操作,比如,创建文件或目录、删除文件或目录、修改文件权限等
​
此处我们介绍一些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,可以递归的修改目录中文件的属性。

file模块主要用于创建文件、目录数据,以及对现有的文件、目录权限进行修改。

官方文档

直接看examples示例用法即可

或者看命令帮助
[root@master-61 ~]#ansible-doc -s file

远程创建文件

ansible每次命令的执行,都会记录下当前的状态

state参数、path参数

[root@master-61 ~]#ansible backup -m file -a 'path=/opt/yang666.log state=touch'

创建文件夹

state参数、path参数

[root@master-61 ~]#ansible backup -m file -a 'path=/opt/yang666 state=directory'

创建文件且设定权限

state参数、path参数、owner参数、group参数

[root@master-61 ~]#ansible backup -m file -a 'path=/opt/chaoge.pwd state=touch owner=www group=www mode=700'

创建软连接文件

软连接,也就是在目标机器上,指定源文件,创建软连接

src、dest、state

给web服务器组的 /etc/hosts文件,添加软连接到/opt/hosts文件

[root@master-61 ~]#ansible backup -m file -a "src=/etc/hosts dest=/tmp/hosts_link state=link"

修改已存在文件/文件夹的属性

修改文件
[root@master-61 ~]#ansible backup -m file -a "path=/opt/chaoge.pwd mode=660"
​
修改文件夹
[root@master-61 ~]#ansible backup -m file -a "path=/opt/yang666  mode=660 owner=www group=www"

script脚本模块

官方文档

模块功能:把本地脚本传输到远程节点上并运行脚本

比起 shell模块,script 模块功能更强大,本地有一份脚本,就可以在所有机器上运行。

scripts模块的功能参数

选项参数

是否必须

选项说明

creates

no

定义一个文件是否存在,若不存在,则运行相应命令;存在则跳过

free_form

yes

参数信息中可以输入任何系统命令,实现远程管理

removes

no

定义一个文件是否存在,如果存在,则运行相应命令;如果不存在则跳过

远程执行脚本

为什么要用ansible,主要是ansible使用对应的模块,执行完命令后,记录了每一次文件修改的状态,这个状态,一是让你更清晰文件的情况、而是也防止反复修改文件,提升效率。

1.管理机创建测试脚本
cat > echo_server_info.sh <<EOF
#!/bin/bash
echo "$(hostname -I)" >> /tmp/server_info.log
echo "$(uptime)" >> /tmp/server_info.log
echo "$(free -m)" >> /tmp/server_info.log
EOF
​
2.添加执行权限
[root@master-61 ~]#chmod +x echo_server_info.sh 
​
3.远程执行
[root@master-61 ~]#ansible backup -m script -a "/root/echo_server_info.sh"
​
4.检查结果
[root@master-61 ~]#ansible backup -m shell -a 'cat /tmp/server_info.log'

利用script模块批量让所有被管控机器执行脚本,该脚本不用在远程主机上存在

远程一键部署rsync服务

可以先恢复rsync-41机器,再执行如下操作

1.编写rsync部署脚本  install_rsync.sh
#!/bin/bash
yum install rsync -y
​
cat > /etc/rsyncd.conf << 'EOF'
uid = www 
gid = www 
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
[backup]
comment = chaoge rsync backup!
path = /backup
EOF
​
useradd -u 1000 -M -s /sbin/nologin www
mkdir -p /{backup,data}
chown -R www:www /{backup,data}
echo "rsync_backup:yuchao666" > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
systemctl start rsyncd
​
​
2.远程执行脚本
[root@master-61 ~]#
[root@master-61 ~]#chmod +x install_rsync.sh 
[root@master-61 ~]#ansible backup -m script -a "/root/install_rsync.sh"
​
3.检查rsync服务
[root@master-61 ~]#ansible backup -m shell -a 'systemctl status rsyncd'
​
4.测试rsync服务
[root@master-61 ~]#export RSYNC_PASSWORD=yuchao666
[root@master-61 ~]#rsync -avzp /tmp/ rsync_backup@172.16.1.41::backup
远程检查数据
[root@master-61 ~]#ansible backup -m shell -a 'ls /backup'
​
5.但是该方式依然是不合理的,shell不会帮你去检测文件是否重复性修改,软件是否重复性安装,因此我们会将一键部署rsync这样的任务,全部改造为ansible的模块脚本。
​
你现在多次执行该脚本的话,ansible已经尽力在检查哪些步骤是无须在做的了
[root@master-61 ~]#ansible backup -m script -a "/root/install_rsync.sh"

查看命令执行详细过程

-vvvvv 参数显示详细过程,v越多,越详细

[root@master-61 ~]#ansible backup  -vvvvv -m script -a "/root/install_rsync.sh"
​
[root@master-61 ~]#man ansible
       -v, --verbose
          verbose mode (-vvv for more, -vvvv to enable connection debugging)

cron定时任务模块

官方文档

cron模块用于管理定时任务的记录,编写任务

cron模块通常使用的参数如下,你可以先大概的了解一下这些参数,然后再结合后面的示例去理解:

参数

说明

minute

此参数用于设置计划任务中分钟设定位的值,比如,上述示例1中分钟设定位的值为5,minute=5,当不使用此参数时,分钟设定位的值默认为"*"

hour

此参数用于设置计划任务中小时设定位的值,比如,上述示例1中小时设定位的值为1,即hour=1,当不使用此参数时,小时设定位的值默认为"*"

day

此参数用于设置计划任务中日设定位的值,当不使用此参数时,日设定位的值默认为"*"

month

此参数用于设置计划任务中月设定位的值,当不使用此参数时,月设定位的值默认为"*"

weekday

此参数用于设置计划任务中周几设定位的值,当不使用此参数时,周几设定位的值默认为"*"

special_time

在上述示例3与示例4中,计划任务的时间设定格式为@rebot或者@houny,@reboot表示重启时执行,@houry表示每小时执行一次,相当于设置成 "0 * * * *",这种@开头的时间设定格式则需要使用special_time参数进行设置,specdia_time参数的可用值有rebo0(重启后)、yeary(每年)、annualy(每年,与yeary相同)、monthly(每月)、weekly(每周)、daily(每天)、hourly(每时)。 注意:当上述时间单位设定参数都未指定时,计划任务的时间设定默认会被设定为 " * * * * ",这样表示每分钟都会执行一次计划任务,所以,在使用cron模块时,我们应该确定对应的时间参数设置正确。

user

此参数用于设置当前计划任务属于哪个用户,当不使用此参数时,默认为管理员用户。

job

此参数用于指定计划的任务中需要实际执行的命令或者脚本,比如上例中的 "echo test" 命令。

name

此参数用于设置计划任务的名称,计划任务的名称会在注释中显示,当不指定计划任务的名称时,ansibie会默认为计划任务加入注释,注释的内容为#Ansible: None,假设指定计划任务的名称为test,那么注释的内容为#Ansible:test,在一台机器中,计划任务的名称应该具有唯一性,方便我们以后根据名称修改或删除计划任务。

state

当计划任务有名称时,我们可以根据名称修改或删除对应的任务,当删除计划任务时,需要将state的值设置为absent

disabled

当计划任务有名称时,我们可以根据名称使对应的任务"失效"(注释掉对应的任务), 注意,使用此参数时,除了需要指定任务的名称,还需要同时指定任务的job以及任务的时间设定,而且任务的时间设定必须和对应任务完全相同,否则在注释任务的同时,任务的时间设定会被修改,除非你确定这样做,如果你不明白这段话的意思可以参老下文中的示例。

backup

如果此参数的值设置为yes,那么当修改或者删除对应的计划任务时,会先对计划任务进行备份,然后再对计划任务进行修改或者删除,cron模块会在远程主机的/mp目录下创建备份文件,以croniab开头并且随机加入一些字符,具体的备份文件名称会在返回信息的backup_file字段中看到,推荐将此此参数设置为yes。

对比ansible的cron模块,和crontab

img

常见的参数如此,使用ansible编写定时任务,和直接编写是没有什么区别的

添加ntpdate定时任务

添加每5分钟执行一次和阿里云时间同步

[root@master-61 ~]#ansible nfs -m cron -a "name=ntp aliyun job='/usr/sbin/ntpdate ntp.aliyun.com > /dev/null 2>&1' minute=*/5"
​
查看远程机器的crontab记录
[root@master-61 ~]#ansible nfs -m shell -a "cat /var/spool/cron/root"
172.16.1.41 | CHANGED | rc=0 >>
* * * * * /usr/sbin/ntpdate time1.aliyun.com > /dev/null 2>&1
#Ansible: chaoge_cron
*/5 * * * * /usr/sbin/ntpdate ntp.aliyun.com > /dev/null 2>&1

cron模块创建定时任务
[root@master-61 ~]#ansible nfs  -m cron   -a "name='ntp aliyun' minute=*/5 job='ntpdate -u ntp.aliyun.com' "
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "ntp aliyun"
    ]
}
​
查看远程机器的crontab记录
[root@master-61 ~]#ansible nfs -m shell -a "crontab -l"
172.16.1.31 | CHANGED | rc=0 >>
* * * * * /usr/sbin/ntpdate time1.aliyun.com > /dev/null 2>&1
#Ansible: ntp aliyun
*/5 * * * * ntpdate -u ntp.aliyun.com

删除定时任务

只能基于cron模块指定名字的修改

[root@master-61 ~]#ansible nfs -m cron -a "name='ntp aliyun' state=absent"
172.16.1.41 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": []
}
​
[root@master-61 ~]#
[root@master-61 ~]#ansible nfs -m shell -a "cat /var/spool/cron/root"
172.16.1.41 | CHANGED | rc=0 >>
* * * * * /usr/sbin/ntpdate time1.aliyun.com > /dev/null 2>&1
​
[root@master-61 ~]#ansible nfs  -a 'crontab -l'
172.16.1.41 | CHANGED | rc=0 >>
* * * * * /usr/sbin/ntpdate time1.aliyun.com > /dev/null 2>&1

创建每分钟执行的任务

不指定任何时间规则,默认是每分钟

1.每分钟定时执行脚本,注意要求该脚本存在于目标机器上
[root@master-61 ~]#cat echo_hostname.sh 
#!/bin/bash
echo "$(date +%T) $(hostname)" >> /tmp/hostname.log
​
2.远程拷贝脚本
[root@master-61 ~]#ansible backup -m copy -a "src=/root/echo_hostname.sh dest=/opt/echo_hostname.sh"
​
3.设置定时任务,多次执行该命令,会覆盖同name的任务
[root@master-61 ~]#ansible backup -m cron -a "job='/bin/bash /opt/echo_hostname.sh' name=yangge_cron_hostname"
每分钟向文件中写入一句话,人定胜天
[root@master-61 ~]#ansible nfs -m cron -a "name='一句话'  job='echo "人定胜天" >>/tmp/hello.log ' "
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "一句话"
    ]
}
[root@master-61 ~]#
[root@master-61 ~]#ansible nfs -m shell -a "crontab -l"
172.16.1.31 | CHANGED | rc=0 >>
#Ansible: 一句话
* * * * * echo 人定胜天 >>/tmp/hello.log 

修改指定名称的定时任务

[root@master-61 ~]#ansible backup -a "crontab -l"
[root@master-61 ~]#ansible backup -a "cat /tmp/hostname.log"
​
修改定时任务为每天晚上11点15分执行
[root@master-61 ~]#ansible backup -m cron -a "name='chaoge_cron_hostname' job='bin/bash /opt/echo_hostname.sh' minute=15 hour=23"
​
[root@master-61 ~]#ansible backup -a "crontab -l"

group模块

管理系统用户组的模块

官方文档

语法

模块参数    参数描述
name    创建指定的组名
gid        组的GID
state        absent,移除远程主机的组
             present,创建远端主机的组

对组管理,也就是创建、删除、查看了

创建chaoge_ops组,gid=1234

[root@master-61 ~]#ansible backup -m group -a "name=chaoge_ops gid=1234"
​
[root@master-61 ~]#ansible backup -a "grep chaoge_ops /etc/group"
172.16.1.41 | CHANGED | rc=0 >>
chaoge_ops:x:1234:

删除组

[root@master-61 ~]#ansible backup -m group -a "name=chaoge_ops gid=1234 state=absent"
​
[root@master-61 ~]#ansible backup -a "grep chaoge_ops /etc/group"

user用户模块

用户管理,也就是关于用户的

  • uid

  • 用户名

  • 用户主组

  • 用户附加组

  • 创建用户

  • 删除用户

  • 创建关于用户的公私钥

  • 用户过期时间

  • 用户密码过期时间

这里主要就是于超老师讲解的用户管理篇的知识,如果忘了回头看即可,这里就不做太多ansible的模块讲解,后续遇见了再操作。

官方文档

语法参数

实例用法

模块参数

参数描述

create_home

创建家目录,设置no则不创建家目录

group

创建用户组

name

创建用户的名字

password

创建用户的密码

uid

创建用户的UID

shell

用户登录解释器

state

Absent(删除用户)present(默认参数,创建)

expires

账户过期时间

创建chaoge01用户,uid为8888

[root@master-61 ~]#ansible backup -m user -a "name=chaoge01 uid=8888"
​
[root@master-61 ~]#ansible backup -a "grep chaoge01 /etc/passwd"
172.16.1.41 | CHANGED | rc=0 >>
chaoge01:x:8888:8888::/home/chaoge01:/bin/bash

创建用户cc01

  • uid、gid为1777

  • 没有家目录、不允许登录

1.注意该用户组是否存在,否则报错
[root@master-61 ~]#ansible backup -m group -a "name=cc01 gid=1777"
​
2.创建用户,设置权限
[root@master-61 ~]#ansible backup -m user -a "name=cc01 uid=1777 group=1777 create_home=no shell=/sbin/nologin"
​
3.检查用户
[root@master-61 ~]#ansible backup -a 'grep cc01 /etc/passwd'
172.16.1.41 | CHANGED | rc=0 >>
cc01:x:1777:1777::/home/cc01:/sbin/nologin

yum安装软件

yum模块明显就是一个专门用于管理软件的模块。

参数

是否必须

默认值

选项值

说明

conf_file

no

设定远程yum执行时所依赖的yum配置文件

disable_gpg_check

no

no

yes/no

在安装包前检查包,只会影响state参数为present或者latest的时候

list

no

只能有ansible调用,不支持playbook

name

yes

你需要安装的包的名字,也能如此使用name=python=2.7安装python2.7

state

no

present

present/latest/absent

用于描述包的最终状态,present/latest用于安装包,absent用于remove安装包

update_cache

no

no

yes/no

用于安装包前执行更新list,只会影响state参数为present/latest的时候

在使用Ansible yum模块时,state选项有如下几种:

  • 安装

    • installed

    • latest

    • present

  • 卸载

    • absent

    • removed

比较疑惑的是present和installedabsent和removed的区别,其实他们含义是一样的,源码:

if state in ['installed', 'present']:
    if disable_gpg_check:
        yum_basecmd.append('--nogpgcheck')
    res = install(module, pkgs, repoq, yum_basecmd, conf_file, en_repos, dis_repos)
elif state in ['removed', 'absent']:
    res = remove(module, pkgs, repoq, yum_basecmd, conf_file, en_repos, dis_repos)
elif state == 'latest':
    if disable_gpg_check:
        yum_basecmd.append('--nogpgcheck')
    res = latest(module, pkgs, repoq,yum_basecmd, conf_file, en_repos, dis_repos)
else:
    # should be caught by AnsibleModule argument_spec
    module.fail_json(msg="we should never get here unless this all"
        " failed", changed=False, results='', errors='unexpected state')
return res

官方文档

yum模块其实就是在远程节点上,执行yum命令,你可以快速登录到目标机器,查看进程

安装最新版本软件包

1.安装net-tools最新版本

ansible all -m yum  -a "name=net-tools  state=installed"

latest参数也用于升级软件包

ansible backup -m yum -a "name=net-tools state=latest"

2.安装rsync服务

ansible backup -m yum -a "name=rsync state=present"
​
#检查rsync
[root@master-61 ~]#ansible backup -m shell -a "rpm -qa rsync"

卸载软件

1.卸载net-tools软件

ansible backup -m yum -a "name=net-tools state=removed"

2.卸载rsync服务

ansible backup -m yum -a "name=rsync state=abesent"

service/systemd模块

该模块作用是针对yum包管理

service适用于Centos6前的系统

systemd命令应用于Centos7系统

要注意的是service模块依旧对Centos7有效,但是建议大家使用systemd模块

  • systemd模块用于控制远程主机的systemd服务,说白了,就是Linux下的systemd命令。需要远程主机支持systemd

  • 用法和service模块基本相同

systemd模块参数

如果使用 systemctl 管理程序的话,可以使用 systemd 模块,systemctl 可以 控制程序启/停,reload,开机启动,观察程序状态(status)等,掌握使用后管理就更方便了
​
主要参数:
daemon_reload:在执行任何其他操作之前运行守护进程重新加载,以确保systemd已经读取其他更改
enabled:服务是否开机自动启动yes|no。enabled和state至少要有一个被定义
masked:是否将服务设置为masked状态,被mask的服务是无法启动的
name:必选项,服务名称
no_block(2.3后新增):不要同步等待操作请求完成
state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)
user:使用服务的调用者运行systemctl,而不是系统的服务管理者

安装、启动nginx服务

1.安装nginx服务
[root@master-61 ~]#ansible 172.16.1.7 -m yum -a "name=nginx state=installed"
​
2.启动服务
[root@master-61 ~]#ansible web -m systemd -a "name=nginx state=started"
​
3.查询状态,这里ansible未直接提供status参数,你可以借助command模块即可
[root@master-61 ~]#ansible web -a "systemctl status nginx"
​
4.停止nginx服务
[root@master-61 ~]#ansible web -m systemd -a "name=nginx state=stopped"
​
5.设置nginx开机自启
[root@master-61 ~]#ansible web -m systemd -a "name=nginx state=started enabled=yes"
​
6.检查nginx状态
[root@master-61 ~]#ansible web -a "systemctl is-enabled nginx"
​
[root@master-61 ~]#ansible web -a "systemctl status nginx"
​
7.关闭开机自启、且停止服务
[root@master-61 ~]#ansible web -m systemd -a "name=nginx state=stopped  enabled=no"
​
8.再次检查状态
[root@master-61 ~]#ansible web  -m shell -a "systemctl is-enabled nginx;systemctl status nginx"

mount挂载模块

官方文档

常用参数

参数

是否必须

说明

backup

no

创建一个包含时间戳信息的备份文件,这样如果您以某种方式错误地破坏了它,您就可以恢复原始文件。

fstab

no

文件系统类型。当状态presentmounted或时必填ephemeral

path

yes

挂载点的路径。

src

no

要挂载到路径上的设备(或 NFS 卷,或其他内容) 。当状态设置为presentmounted或时必填ephemeral

state

yes

image-20240922193021497

常用state选项:

state选项

说明

mounted

立即挂载、写入fstab文件、创建挂载点

unmounted

卸载挂载设备、不会删除fstab文件的记录

present

只写入fstab文件记录、不会立即挂载

absent

删除fstab中记录、卸载设备、删除挂载点

remounted

重新挂载这个设备

语法

ansible 主机名(web) -m 模块名(mount) -a "src=挂载设备/路径  path=挂载点  fstype=文件类型  state=挂载选项"

给web-7机器挂载nfs目录(只写入/etc/fstab而不挂载)

[root@master-61 ~]#ansible web -m mount -a "src='172.16.1.1:/nfs-nginx-data' path=/usr/share/nginx/html fstype=nfs state=present"

给web-7机器挂载nfs目录(立即挂载且写入/etc/fstab)

[root@master-61 ~]#ansible web -m mount -a "src='172.16.1.31:/nfs-nginx-data' path=/usr/share/nginx/html fstype=nfs state=mounted"
​
检查
[root@master-61 ~]#ansible web -a "df -h"
[root@master-61 ~]#ansible web -a "cat /etc/fstab"

取消挂载,以及删除fstab记录

[root@master-61 ~]#ansible web -m mount -a "src='172.16.1.31:/nfs-nginx-data' path=/usr/share/nginx/html fstype=nfs state=absent"
​
验证
[root@master-61 ~]#ansible web -a "df -h"
[root@master-61 ~]#ansible web -a "cat /etc/fstab"

取消挂载,不删除fstab记录

[root@master-61 ~]#ansible web -m mount -a "src='172.16.1.31:/nfs-nginx-data' path=/usr/share/nginx/html fstype=nfs state=umounted"

总结参数

mounted 挂载设备且写入fstab
present 仅写入fstab 不挂载
absent  卸载且删除fstab记录
umounted 只卸载不删除fstab记录

archive压缩模块

官方文档

支持压缩类型

bz2
gz ← (default)
tar
xz
zip 
​
用法文档
https://docs.ansible.com/ansible/latest/collections/community/general/archive_module.html#examples
指定format即可

语法:

ansible 主机名(web) -m 模块名(archive) -a "path=要压缩的文件路径  dest=指定的路径/压缩包名称  format=压缩文件类型"

压缩/etc配置文件到指定路径

[root@master-61 ~]#ansible web -m archive -a "path=/etc dest=/opt/etc.tgz"
[root@master-61 ~]#ansible web -a "ls /opt -l"
[root@master-61 ~]#ansible web -a "file /opt/etc.tgz"

压缩/var/log为zip类型到指定路径

[root@master-61 ~]#ansible web -m archive -a "path=/var/log dest=/opt/log.zip format=zip"
​
[root@master-61 ~]#ansible web -a "file /opt/log.zip"

unarchive解压缩模块

官方文档

注意了,你现在是远程解压缩,而不是在本机直接解压缩

解压缩etc.tgz解压到指定目录(远程解压)

将web组机器里的压缩包文件etc.tgz解压到web机器组本地

remote_src远程数据源

语法:

ansible 主机名(web) -m 模块名(unarchive) -a "src=要解压的压缩包文件路径  dest=指定的解压文件存放路径 remote_src=yes "
指定目录必须存在
[root@master-61 ~]#ansible web -m file -a "path=/opt/etc_file state=directory"
​
解压缩
[root@master-61 ~]#ansible web -m unarchive -a "src=/opt/etc.tgz dest=/opt/etc_file/ remote_src=yes"
​
查看
[root@master-61 ~]#ansible web -a "ls /opt/etc_file/etc/"

将管理机的压缩包,解压到远程机器上

将master-61的压缩文件,解压到web机器上

语法:

ansible 主机名(web) -m 模块名(unarchive) -a "src=要解压的压缩包文件路径  dest=指定的解压文件存放路径"
1.生成etc.tgz数据
[root@master-61 ~]#cd / && tar -zcf /opt/etc.tgz etc
​
2.远程解压到web-7机器上
[root@master-61 /]#ansible web -m unarchive -a "src=/opt/etc.tgz  dest=/tmp/"
​
3.检查
[root@master-61 /]#ansible web -a "ls /tmp/etc/"