Ansible自动化运维Inventory与Ad-Hoc,腾讯架构师首发

③ 修改服务器Inventory主机清单配置,再次访问

[root@localhost ~]# vim /etc/ansible/hosts
[webserver]
host[1:3] ansible_ssh_user='root' ansible_ssh_pass='123'
host4     ansible_ssh_user='root' ansible_ssh_pass='123' ansible_ssh_port='9527'

[root@localhost ~]# ansible webserver -m ping -o
host2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host3 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host4 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
#可见全部成功

5. 组:变量

当一个组中需要大量定义变量,可以统一定义。定义完成后,改组的所有成员都将收到、适应这个变量。

[root@localhost ~]# vim /etc/ansible/hosts
[webserver]
host[1:3]
host4     ansible_ssh_port='9527'

[webserver:vars]
ansible_ssh_user='root'
ansible_ssh_pass='123'

[root@localhost ~]# ansible webserver -m ping -o
host1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host3 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host4 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
#全部返回成功

常用变量:

参数用途示例
ansible_ssh_host定义 hosts ssh 地址ansible_ssh_host=192.168.190.100
ansible_ssh_port定义 hosts ssh 端口ansible_ssh_port=9527
ansible_ssh_user定义 hosts ssh 认证用户ansible_ssh_user=root
ansible_ssh_pass定义 hosts ssh 认证密码ansible_ssh_pass=123
ansible_sudo定义 hosts sudo 用户ansible_sudo=zhangsan
ansible_sudo_pass定义 hosts sudo 密码ansible_sudo pass=123
ansible_sudo_exe定义 hosts sudo 路径ansible_sudo_exe=/usr/bin/sudo
ansible_connection定义 hosts 连接方式ansible_connection=local
ansible_ssh_private_ key_file定义 hosts 私钥ansible_ssh_private_key_file=/root/key
ansible_ssh_shell_ type定义 hosts shell 类型ansible_ssh_shell_type=bash
ansible_python_interpreter定义 hosts 任务执行python路径ansible_python_ interpreter=/usr/bin/python2.6
ansible_*_interpreter定义 hosts 其它语言解析路径ansible_*_interpreter=/usr/bin/ruby

6. 子分组

将不同的分组进行组合

[root@localhost ~]# vim /etc/ansible/hosts
[apache]
host[1:2]

[nginx]
host3
host4     ansible_ssh_port='9527'

[webserver:children]
apache
nginx

[webserver:vars]
ansible_ssh_user='root'
ansible_ssh_pass='123'

[root@localhost ~]# ansible webserver -m ping -o
host2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host3 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host4 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
#可见webserver这个总组调用了apache和nginx这两个从组

7. 自定义主机列表

打包主机清单,多处使用

将host4 ssh协议端口号改为默认22。

① 创建主机清单文件

[root@localhost ~]# vim /data/hostlist
[apache]
host[1:2]

[nginx]
host3
host4

[webserver:children]
apache
nginx

[webserver:vars]
ansible_ssh_user='root'
ansible_ssh_pass='123'

② 指定 Inventory 主机清单的位置,访问管理节点

[root@localhost ~]# ansible -i /data/hostlist webserver -m ping -o
host3 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host4 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
#访问成功,字体均为绿色

五、Ad-Hoc 点对点模式

1. 简介

指的是在不使用Playbook的情况下,直接使用ansible命令行工具执行临时命令。这些命令通常是一次性的、针对特定任务的,而不需要编写长期维护的Playbook。通过AD-Hoc命令,可以快速地在远程主机上执行特定的任务,比如文件操作、软件安装、服务管理等。

2. 模块

2.1 command 模块

command 模块允许用户在目标主机上执行特定的命令,主要功能是在远程主机执行命令,此为默认模块,可忽略 -m 选项;此命令不支持 $VARNAME < > | ; & 等,可能用shell模块实现 ;注意此模块不具有幂等性 。以下是 command 模块的一般用法:

ansible <host-pattern> -m command -a "<command>"
#<host-pattern> 是要操作的目标主机或主机组。
#-m command 指定要使用的模块是 "command"。
#-a "<command>" 传递给模块的参数,即要在目标主机上执行的命令。

示例: 复制文件至指定目录

如何修改默认模块?

[root@ansible ~]# vim /etc/ansible/ansible.cfg
114 #module_name = command

2.2 shell 模块

和command相似,用shell执行命令支持各种符号,比如:*,$, >,此模块不具有幂等性。

示例:创建文件hello.txt,写入内容hello

示例:提权操作

① 先在被控制端(host1)sudo授权

[root@localhost ~]# vim /etc/sudoers
 93 fql     ALL=(ALL)       NOPASSWD:ALL

② 以fql用户身份连接,然后以特权模式切换到fql用户,并执行whoami命令,查看当前登录用户

[root@ansible ~]# ansible host1 -m shell -a 'whoami' -u fql -k -b --become-user=fql
SSH password: 
[WARNING]: Module remote_tmp /home/fql/.ansible/tmp did not exist and was created with a mode of 0700, this may
cause issues when running as another user. To avoid this, create the remote_tmp dir with the correct permissions
manually
host1 | CHANGED | rc=0 >>
fql

2.3 script 模块

在远程主机上运行ansible服务器上的脚本(无需执行权限,本身不执行),此模块不具有幂等性。

示例:执行脚本新建hello文件

2.4 copy 模块

从ansible服务器主控端复制文件到远程主机,src=file 如果是没指明路径,则为当前目录或当前目录下的files目录下的file文件。关键字选项如下:

src       #代表源文件路径
dest      #代表文件落地路径
owner     #属主
group     #属组
mode      #代表权限
backup    #如果复制时有同名文件会先备份再复制(注意:源文件内容有变化才会备份)

准备:被管理节点新建用户fql

示例:拷贝管理节点文件至被管理节点指定目录,并指定属主及权限

注意:

  • etc不加/:连etc一起复制,etc会变成子目录
  • etc加/:只复制etc下的文件
2.5 get_url 模块

用于将文件从http、https或ftp下载到被管理节点上。关键字选项如下:

url:     #下载文件的URL,支持HTTP,HTTPS或FTP协议
dest:    #下载到目标路径(绝对路径),如果目标是一个目录,就用服务器上面文件的名称,如果目标设置了名称就用目标设置的名称
owner:   #指定属主
group:   #指定属组
mode:    #指定权限
force:   #如果yes,dest不是目录,将每次下载文件,如果内容改变,替换文件。如果否,则只有在目标不存在时才会下载该文件
checksum:#对目标文件在下载后计算摘要,以确保其完整性(md5sum)
##可以检测文件是否有问题
[root@ansible ~]# md5sum nginx-1.18.0.tar.gz 
3ca4a37931e9fa301964b8ce889da8cb  nginx-1.8.0.tar.gz

[root@ansible ~]# ansible web -m get_url -a 'url=https://nginx.org/download/nginx-1.18.0.tar.gz dest=/opt checksum="md5:3ca4a37931e9fa301964b8ce889da8cb"'

示例:下载nginx源码包至被管理节点指定目录

2.6 fetch 模块

从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录(可以将文件夹打包成压缩包传输)。

示例:拷贝被管理节点文件至服务端

2.7 file 模块

设置文件属性,创建软链接等,关键字选项如下:

path       #指定文件路径
state      #文件状态 有:新建(touch) 删除(absent) 文件夹(directory)  连接文件(link)等
src        #源文件
mode       #权限
owner      #属主
group      #属组
recurse    #递归,修改属性时有效

示例:

[root@ansible ~]# ansible web -m file -a 'path=/mnt/web.txt state=touch owner=fql group=fql mode=644'
#创建空文件
[root@ansible ~]# ansible web -m file -a 'path=/mnt/web state=directory'
#新建目录
[root@ansible ~]# ansible web -m file -a 'src=/mnt/web path=/opt/web-link state=link'
#新建软连接 path|dest|name   这三个选项都可以使用
[root@ansible ~]# ansible web -m file -a 'path=/opt/web-link state=absent'
#删除文件
[root@ansible ~]# ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql"
[root@ansible ~]# ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql recurse=yes"
#递归修改目录及子目录的属性
2.8 stat 模块

检查文件或文件系统的状态,对于Windows目标,请改用win_stat模块。

选项:

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

常用的返回值判断:

  • exists: 判断是否存在
  • isuid: 调用用户的ID与所有者ID是否匹配

示例:判断文件是否存在

[root@ansible ~]# ansible webserver -m stat -a 'path=/opt/xxxxxx' -o
host1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "stat": {"exists": false}}
host3 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "stat": {"exists": false}}
host4 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "stat": {"exists": false}}
host2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "stat": {"exists": false}}
#不存在
2.9 unarchive 模块

解包解压缩。实现有两种用法:

  • 将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes,此为默认值,可省略
  • 将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no

常见参数:

copy:      #默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到被控制节点上,如果设置为copy=no,会在被控制节点上寻找src源文件
remote_src:#和copy功能一样且互斥,yes表示在被控制节点,不在ansible主机,no表示文件在ansible主机上
src:       #源路径,可以是ansible主机上的路径,也可以是远程主机(被管理端或者第三方主机)上的路径,如果是远程主机上的路径,则需要设置copy=no
dest:      #被控制节点的目标路径
mode:      #设置解压缩后的文件权限 

示例:将管理节点压缩包解压到被管理节点

① 管理节点创建(或指定现有)压缩包

[root@ansible data]# touch {1..3}.txt
[root@ansible data]# ls
1.txt  2.txt  3.txt
[root@ansible data]# tar -zcvf file.tar.gz 1.txt 2.txt 3.txt .
[root@ansible data]# ls
1.txt  2.txt  3.txt  file.tar.gz

②  将管理节点压缩包解压到被管理节点

示例:将被管理节点压缩包解压到被管理节点,即压缩包从被管理节点寻找

2.10 archive 模块

对被管理节点文件进行压缩,打包压缩保存在被管理节点。

参数:

path=/var/log/:        #指定要打包的目录路径为/var/log/。
dest=/data/log.tar.bz2:#指定创建的归档文件名为log.tar.bz2,并保存在/data/目录下。
format=bz2:            #指定归档文件的格式为bz2,即使用 bzip2 进行压缩。
owner=fql:             #指定归档文件的所有者为fql。
mode=0600:             #指定归档文件的权限模式为0600,即只有所有者具有读写权限,没有执行权限

示例:

2.11 hostname 模块

管理主机名,一般不使用此模块,主机名会一致。

示例:修改host1主机名

[root@ansible ~]# ansible host1 -m hostname -a 'name=node1'
2.12 cron 模块

用于管理 cron 作业(定时任务),支持时间:minute,hour,day,month,weekday。

功能、参数:

功能:
添加/删除 cron 作业: #可以使用 Ansible 的 cron 模块添加新的 cron 作业或删除现有的作业。
修改 cron 作业:      #可以更新现有的 cron 作业的时间表、命令等信息。
列出 cron 作业:      #可以列出系统中所有的 cron 作业,以便进行查看和管理。

参数:
name:        #cron 作业的名称。
minute/hour/day/month/weekday:  #cron 作业执行的时间表设定。
user:        #作业执行的用户。
job:         #要执行的命令或脚本。
state:       #指定作业的状态,可以是 present(存在)、absent(不存在)等。

示例:创建备份计划任务

示例:关闭计划任务

示例:删除计划任务

管理节点另外写法:ansible websrvs -m cron -a ‘state=absent name=Synctime’

2.13 yum 和 apt 模块

yum管理软件包,只支持RHEL,CentOS,fedora,不支持Ubuntu其它版本

apt类似yum模块的功能,主要管理Debian相关版本的软件包

参数:

Yum 模块参数:
name:             #要安装、升级或删除的软件包名称。
state:            #指定软件包的状态,可以是 present(存在)、latest(最新)、absent(不存在)等。
update_cache:     #指定是否更新 Yum 软件包缓存。
disablerepo:      #禁用特定的 Yum 软件源。
enablerepo:       #启用特定的 Yum 软件源。
disable_gpg_check:#禁用 GPG 检查。
installroot:      #指定要安装软件包的根目录。
update_only:      #仅更新软件包而不安装新软件包。
conf_file:        #指定要使用的 Yum 配置文件。

apt 模块参数:
name:                  #要安装、升级或删除的软件包名称。
state:                 #指定软件包的状态,可以是 present(存在)、latest(最新)、absent(不存在)等。
update_cache:          #指定是否更新 apt 软件包缓存。
cache_valid_time:      #指定软件包缓存的有效时间。
force:                 #强制执行操作,即使可能有依赖关系问题。
allow_unauthenticated: #允许安装未经身份验证的软件包。
autoremove:            #自动删除不再需要的软件包。
purge:                 #卸载软件包并删除其配置文件。
upgrade:               #执行软件包升级操作。

示例:批量安装httpd

其他示例:

ansible websrvs -m yum -a 'name=nginx state=present enablerepo=epel'  #启用epel源进行安装
ansible websrvs -m yum -a 'name=* state=lastest exclude=kernel*,foo*' #升级除kernel和foo开头以外的所有包
ansible websrvs -m yum -a 'name=httpd state=absent'                   #删除
2.14 yum_repository 模块

用于管理 YUM 软件包管理器中的软件仓库配置的模块。它允许用户添加、删除和更新系统上的 YUM 软件仓库。

参数关键字:

name参数:			#必须参数,用于指定要操作的唯一的仓库ID,也就是”.repo”配置文件中每个仓库对应的”中括号”内的仓库ID。
baseurl参数:		#此参数用于设置 yum 仓库的 baseurl。
description参数:	#此参数用于设置仓库的注释信息,也就是”.repo”配置文件中每个仓库对应的”name字段”对应的内容。
file参数:			#此参数用于设置仓库的配置文件名称,即设置”.repo”配置文件的文件名前缀,在不使用此参数的情况下,默认以 name 参数的仓库ID作					  为”.repo”配置文件的文件名前缀,同一个”.repo” 配置文件中 可以存在多个 yum 源。
enabled参数:		#此参数用于设置是否激活对应的 yum 源,此参数默认值为 yes,表示启用对应的 yum 源,设置为 no 表示不启用对应的 yum 源。
gpgcheck参数:		#此参数用于设置是否开启 rpm 包验证功能,默认值为 no,表示不启用包验证,设置为 yes 表示开启包验证功能。
gpgcakey参数:		#当 gpgcheck 参数设置为 yes 时,需要使用此参数指定验证包所需的公钥。
state参数:		    #默认值为 present,当值设置为 absent 时,表示删除对应的 yum 源。

示例:批量新建yum仓库epel源

2.15 service 模块

管理系统服务状态的模块。它可以启动、停止、重新启动和重新加载系统服务。

参数关键字:

name参数:		#此参数用于指定需要操作的服务名称,比如 nginx。
state参数:	    #此参数用于指定服务的状态,比如,我们想要启动远程主机中的 nginx,则可以将 state 的值设置为 started;如果想要停止远程主机中的服务,则可以将 state 的值设置为 stopped。此参数的可用值有 started、stopped、restarted、reloaded。
enabled参数:	#此参数用于指定是否将服务设置为开机 启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动。

示例:启动httpd服务并开机自启

2.16 mount 挂载和卸载

管理文件系统挂载和卸载的模块。它允许用户在远程主机上挂载和卸载文件系统,以及设置文件系统的相关属性。

主要参数:

path (必需): #要挂载或卸载的目标路径。
src:         #要挂载的设备、分区或者远程位置。
fstype:      #文件系统类型,例如 ext4、xfs 等。
state:       #可以是 mounted(已挂载)、unmounted(已卸载)或者 present(存在)。
opts:        #挂载选项,如 "rw"(读写)、"ro"(只读)等。
dump:        #控制备份程序是否应该备份文件系统。
passno:      #控制启动时文件系统检查的顺序。

示例:

#临时挂载
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'
#UUID为设备序列号,可以通过lsblk获得
[root@ansible ~]# ansible webserver -a "blkid"
2.17 user 模块

管理系统用户的模块。它允许用户创建、删除和修改系统用户以及相关属性。

主要参数:

comment         #用户的描述信息
createhome      #是否创建家目录
force           #在使用state=absent时, 行为与userdel –force一致.
group           #指定基本组(需要已存在的组)
groups          #指定附加组,如果指定为(groups=)表示删除所有组
home            #指定用户家目录
move_home       #如果设置为home=时, 试图将用户主目录移动到指定的目录
name            #指定用户名(必需)
non_unique      #该选项允许改变非唯一的用户ID值
password        #指定用户密码,使用 SHA512 hash
remove          #在使用state=absent时, 行为是与userdel –remove一致
shell           #指定默认shell
state           #设置帐号状态,不指定为创建,指定值为absent表示删除
system          #当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
uid             #指定用户的uid
update_password   #用于控制何时更新用户的密码。该参数有三个可能的取值:
always:           #始终更新用户密码。
on_create:        #仅在创建用户时更新密码。
never:            #永远不更新密码。

示例:添加用户

示例:删除用户

2.18 group 模块

管理系统用户组的模块。它允许用户创建、删除和修改系统用户组以及相关属性。

主要参数:

name (必需):  #要操作的用户组名称。
state:        #可以是 present(存在)、absent(不存在)。
gid:          #用户组的 GID。
system:       #如果为 true,则创建一个系统用户组。
append:       #如果为 true,则将用户添加到指定的用户组中;如果为 false,则只会将用户包含在指定的用户组中

示例:创建组

示例:删除组

2.19 reboot模块

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
img

049c88b9f58.png)

2.19 reboot模块

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-BmkOm9Sm-1712646147593)]
[外链图片转存中…(img-M06mF84I-1712646147593)]
[外链图片转存中…(img-3VOMTogL-1712646147594)]
[外链图片转存中…(img-4P9HFqiD-1712646147594)]
[外链图片转存中…(img-gLFcrB1R-1712646147594)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
[外链图片转存中…(img-70hj2Ap6-1712646147594)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值