自动化运维工具 Ansible
Ansible 基础
Ansible 介绍
Ansible 是一个自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、 func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
Ansible 的名称来自科幻小说《安德的游戏》中跨越时空的即时通信工具,它可以在相距数光年的距离,远程实时控制前线的舰队战斗。
Ansible 的功能和特点
Ansible 的主要功能
-
批量执行远程命令,可以对远程的多台主机同时进行命令的执行
-
批量安装和配置软件服务,可以对远程的多台主机进行自动化的方式配置和管理各种服务
-
编排高级的企业级复杂的IT架构任务,Ansible 的 Playbook 和 role 可以轻松实现大型的IT复杂架构
-
提供自动化运维工具的开发 API, 有很多运维工具,如 jumpserver 就是基于 ansible 实现自动化 管理功能
Ansible 的主要优点
-
部署简单方便,在对多机进行批量管量时,只需要在主控机上部署 Ansible 服务,被管理的机器不 用部署;
-
默认通过 SSH 协议进行通信,只要保证主控端和被控机 ssh 通道畅通,就能保证服务可用;
-
配置简单,上手快,功能强大;
-
用 python 开发,打开源文件,所见即所得,对二次开发的支持非常友好;
-
大量常规运维操作己经内置; 对于较复杂的需求,可以通过 playbook 功能和 role 功能来实现;
-
还提供了操作方便,功能强大的的 web 管理界面;
-
是一个己经商业化很久的项目了,生态成熟,社区活跃,文档完善
Ansible 的不足
-
在管理的主机数量较多时,性能略差,执行效率不如 saltstack 高
-
不支持事务回滚
Ansible 工作原理
执行流程
-
加载配置文件,读取配置;
-
加载对应的模块文件;
-
根据命令或模块,生成一个临时的 py 文件,再将该文件传送至对应的被管理的机器上 ($HOME/.ansible/tmp/ansible-tmp-xxx/xx.py)
-
给远程的 py 文件加可执行权限
-
执行该文件,并将结果抓取回当前的主机显示;
-
删除远端的临时 py 文件
Ansible 命令执行来源
-
系统用户直接执行:系统用户登录终端后直接在命令行下执行单条命令
-
在 playbooks 中间接执行,playbook中编写多条 ansible 命令,ansible 根据playbook文件的内容 依次执行
-
在 web 管理界面上执行
-
使用 API 调用执行:配置API接口,让第三方应用或程序调用接口执行 ansible 命令
使用注意事项
-
执行ansible的主机一般称为管理端, 主控端,中控,master 或堡垒机
-
主控端Python版本需要2.6或以上
-
被控端Python版本小于2.4,需要安装python-simplejson
-
被控端如开启SELinux需要安装libselinux-python
-
windows 不能做为主控端,只能做为被控制端
Ansible 安装和基本使用
Ansible 安装
#在Rocky中安装 ansible
#需要先安装 epel 源
[root@Rocky-9 ~]# yum install -y epel-release
[root@Rocky-9 ~]# yum install -y ansible#在 Ubuntu 中安装 ansible
#用 pip 安装
[root@ubuntu24 ~]# pip3.10 install -i https://pypi.tuna.tsinghua.edu.cn/simple ansible#直接安装
[root@ubuntu24 ~]# apt install ansible
ansible 和 ansible-core
ansible-core 包中仅包含核心功能和核心模块,ansible 包中除了核心功能之外还包含大量外围功能模块。
Ansible 配置文件
查看 ansible 配置文件
[root@ubuntu24 ~]# ansible --version
ansible [core 2.16.3] #版本号config file = None #配置文件configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] #第三方插件目录ansible python module location = /usr/lib/python3/dist-packages/ansible #官方模块目录ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections executable location = /usr/bin/ansible #可执行程序python version = 3.12.3 (main, Sep 11 2024, 14:17:37) [GCC 13.2.0] (/usr/bin/python3) #python环境jinja version = 3.1.2 #jinja模板引擎版本libyaml = True #是否己安装libyaml#rocky中的配置文件
[root@Rocky-9 ~]# tree /etc/ansible/
/etc/ansible/
├── ansible.cfg
├── hosts
└── roles1 directory, 2 files
[root@Rocky-9 ~]# cat /etc/ansible/ansible.cfg
# Since Ansible 2.12 (core):
# To generate an example config file (a "disabled" one with all default settings, commented out):
# $ ansible-config init --disabled > ansible.cfg
#
# Also you can now have a more complete file by including existing plugins:
# ansible-config init --disabled -t all > ansible.cfg# For previous versions of Ansible you can check for examples in the 'stable' branches of each version
# Note that this file was always incomplete and lagging changes to configuration settings# for example, for 2.9: https://github.com/ansible/ansible/blob/stable-2.9/examples/ansible.cfg#如果要在 ubuntu 中使用,可以在 ansible-core 包中生成配置文件或从其它系统中 copy 文件到当前系统,或者从github上获取
https://github.com/ansible/ansible/blob/stable-2.10/examples/ansible.cfg#创建目录
[root@ubuntu24 ~]# mkdir -pv /etc/ansible/roles
mkdir: created directory '/etc/ansible'
mkdir: created directory '/etc/ansible/roles'[root@ubuntu24 ~]# touch /etc/ansible/hosts#生成配置文件
[root@ubuntu24 ~]# ansible-config init -t all --disabled > /etc/ansible/ansible.cfg、[root@ubuntu24 ~]# tree /etc/ansible/
/etc/ansible/
├── ansible.cfg #主配置文件,配置ansible工作特性,也可以在项目的目录中创建此文件,当前目录下如果也有ansible.cfg,则当前目录的中的配置文件优先于此文件
├── hosts #主机清单,在此文件中定义要管理的主机
└── roles #目录,存放角色文件2 directories, 2 files
主配置文件
Ansible 的主配置文件可以有多个,分别存放于不同目录,其优先级如下
ANSIBLE_CONFIG #环境变量,此变量中指向的文件必须存在才生效,指向的文件要以.cfg 结尾./ansible.cfg #当前目录下的ansible.cfg,一般一个项目对应一个专用配置文件,推荐使用~/.ansible.cfg #当前用户家目录下的.ansible.cfg/etc/ansible/ansible.cfg #ansible默认配置文件,主配置文件
主配置文件中又间接定义了其它的配置项,在使用时,可以为不同的项目建立不同的配置文件放到不同的目录中,再去到该目录下执行 ansible,或者用变量指定不同的配置文件用来区分不同的项目配置,对于不同用户的配置,可以写在相应的家目录中。
主配置文件中的主要配置项
[root@ubuntu ~]# cat /etc/ansible/ansible.cfg[defaults]
inventory = /etc/ansible/hosts #远程主机清单
remote_tmp = ~/.ansible/tmp #远程主机临时文件目录
local_tmp = ~/.ansible/tmp #本地主机临时文件目录
keep_remote_files=False #是否保留远程主机上的py脚本文件,默认不保留
executable=/bin/sh #生成shell命令时用指定的bash执行
forks = 5 #并发数
ask_pass = False #连接远程主机时,询问是否需要输入密码,默认不询问,走ssh key校验
host_key_checking = True #是否需要每次询问要不要添加HostKey,默认是true,每次询问
log_path = #日志文件地址,为空表示禁用日志
module_name = command #默认模块
gathering = smart|implicit|explicit #smart表示如果有缓存则使用缓存, implicit每次收集,explicit不收集,除非指定
fact_caching_timeout = 86400 #远程主机信息缓存时长,默认 86400
fact_caching = memeory|jsonfile|redis #默认缓存到内存,可以写文件和redis
fact_caching_connection = /path/to/cachedir #如果写json 文件,此处写保存路径,如果是redis此处写redis连接地址
interpreter_python=auto #指定远程主机python版本和路径#连接持久化配置
[persistent_connection]
ansible_connection_path= #
command_timeout=30 #
connect_retry_timeout=15 #超时重试时长
connect_timeout=30 #连接
control_path_dir=~/.ansible/pc #socket 文件保存目录#颜色配置
[colors]
changed=yellow
console_prompt=white
debug=dark gray
deprecate=purple
diff_add=green
diff_lines=cyan
diff_remove=red
error=red
highlight=white
ok=green
skip=cyan
unreachable=bright red
verbose=blue
warn=bright purple#普通用户提权配置
[privilege_escalation]
agnostic_become_prompt=True
become_allow_same_user=False
become=False
become_ask_pass=False #sudo 时是否提示输入密码
become_exe=
become_flags=
become_method=sudo #以 sudo 方式提权
become_user=root #默认 sudo 到 root
主机清单配置文件
ansible 的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在 inventory 主机清单文 件中将其分组组织
主机定义支持 ip 地址和主机名两种方式,写法多种多样
注意:
-
生产建议在每个项目目录下创建项目独立的hosts文件
-
通过项目目录下的ansible.cfg文件中的 inventory = ./hosts 实现
主机清单文件格式
inventory 文件遵循 INI 文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组 中,此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标 明,如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机
Inventory 参数说明
常用可定义的配置项
ansible_ssh_host=IP|hostname #指定远程主机,可用IP或主机名
ansible_ssh_port=PORT #指定SSH端口
ansible_ssh_user=UNAME #指定SSH用户名
ansible_ssh_pass=PWD #显式指定SSH密码
ansible_sudo_pass=PWD #显式指定SUDO密码
ansible_sudo_exe=/PATH/CMD #sudo 命令路径(适用于1.8及以上版本)
ansible_connection=local|ssh|paramiko|docker #与主机的连接类型
ansible_ssh_private_key_file=/PATH/FILE #SSH私钥文件
ansible_shell_type=sh|csh|fish #目标系统的shell类型.默认 sh
ansible_python_interpreter=/PATH/PYTHON #目标主机的python路径用于系统中有多个Python版本,或默认/usr/bin/python不存在
Ansible 工具
[root@ubuntu24 ansible]# ls /usr/bin/ansible*
/usr/bin/ansible #主程序,ad-hoc工作模式下执行单条命令
/usr/bin/ansible-config #配置管理工具
/usr/bin/ansible-console #互式命令行工具
/usr/bin/ansible-galaxy #线上role管理工具
/usr/bin/ansible-playbook #playbook 管理工具
/usr/bin/ansible-test #Ansible的测试工具
/usr/bin/ansible-community
/usr/bin/ansible-connection #连接插件管理工具
/usr/bin/ansible-doc #帮助手册,查看帮助文档
/usr/bin/ansible-inventory #用特定格式显示所有远程主机列表
/usr/bin/ansible-pull #playbook获取工具
/usr/bin/ansible-vault #文档加密工具
ansible-doc命令用法
ansible-doc 工具用来查看 ansible 文档
ansible-doc [options] [module...]#常用选项
-h|--help #显示帮助
--version #显示版本
-l|--list #列出所有可用模块
-t|--type #指定模块类型become|cache|callback|cliconf|connection|httpapi|inventory|lookup|netconf|shell|vars|module|strategy|role|keyword-s|--snippet #显示指定模块的playbook片段
-j|--json #以 json 格式显示
-v|--verbose #显示详细信息,最多可以 -vvvvvv
ansible-console 命令用法
ansible-console 用来交互式执行命令,支持 tab 键补齐
ansible-console#常用子命令
help|? #列出所子命令
cd #切换主机组
copy #
exit #退出
forks #设置并发执行数量
list #列出被管理的所有主机
ping #执行ping模块#示例
[root@ubuntu24 ansible]# ansible-console
Welcome to the ansible console. Type help or ? to list commands.root@all (3)[f:5]$ list
10.0.0.151
10.0.0.161
10.0.0.158
root@all (3)[f:5]$
ansible 命令用法
ansible 命令基础用法
ansible 工具一般用来执行单条命令,使用频率较高
ansible <host-pattern> [-m module_name] [-a args]#常用选项
-h|--help #查看帮助
--version #显示版本
--list-hosts #列出远程主机,可以写成 --list
-m module #指定模块,默认模块为command,默认模块时,可省略不写
-a|--args #指定模块选项
-e|--extra-vars #指定执行选项
-C|--check #检测语句是否正确,并不立即执行
-k|--ask-pass #提示输入ssh密码,默认用sshkey验证
-T|--timeout N #设置命令超时时长,默认10S
-k|--ask-pass #提示输入ssh连接密码,默认Key验证
-u|--user=UNAME #执行远程执行的用户,默认root
-b|--become #代替旧版的sudo实现通过sudo机制实现提升权限
--become-user=USERNAME #指定sudo的runas用户,默认为root
-K|--ask-become-pass #提示输入sudo时的口令
-f|--forks N #指定并发同时执行ansible任务的主机数
-i|--inventory /PATH/FILE #指定主机清单文件
-v|vv|vvv|vvvv|vvvvv #显示详细执行过程
查看主机
#查看所有主机列表
[root@ubuntu24 ~]# ansible all --list-hostshosts (3):10.0.0.15110.0.0.16110.0.0.153#查看指定组主机列表
[root@ubuntu24 ~]# ansible ubuntu --list-hostshosts (2):10.0.0.15110.0.0.161
自动添加主机到信任列表
[root@ubuntu ~]# ansible 10.0.0.161 -m ping -k
SSH password:
10.0.0.161
| FAILED! => {"msg": "Using a SSH password instead of a key is not possible because Host
Key checking is enabled and sshpass does not support this. Please add this
host's fingerprint to your known_hosts file to manage this host."
}
#修改配置文件,自动添加目标主机到信任主机列表
[root@ubuntu ~]# vim /etc/ansible/ansible.cfg
host_key_checking=False #配置文件中一共有三处,需要修改在defaults中的[root@ubuntu24 ~]# ansible 10.0.0.161 -m ping -k
SSH password:
10.0.0.161 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"
}
连接socket缓存
[root@ubuntu24 ~]# rm -rf .ansible[root@ubuntu24 ~]# ansible 10.0.0.161 -m ping -k
SSH password:
10.0.0.161 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"
}
#生成一个 socket 文件
[root@ubuntu24 ~]# tree .ansible
.ansible
├── cp
│ └── 7eb12a22e7
└── tmp└── ansible-local-2681ak1w6fns4 directories, 1 file[root@ubuntu24 ~]# ll .ansible/cp/
total 8
drwx------ 2 root root 4096 Sep 28 09:31 ./
drwxr-xr-x 4 root root 4096 Sep 28 09:31 ../
srw------- 1 root root 0 Sep 28 09:31 7eb12a22e7=#默认走 sshkey 验证,由于有缓存的 socket 文件,所以可以操作成功
[root@ubuntu24 ~]# ansible 10.0.0.161 -m ping
10.0.0.161 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"
}#但该文件有生命周期,默认1分钟
#上次连接的缓存失效后,如果没有 -k 选项,默认走 sshkey 验证,会失败
指定主机和用户
#指定用户要使用该用户密码
[root@ubuntu24 ~]# ansible 10.0.0.161 -m ping -u tom -k
SSH password:
10.0.0.161 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"
}#以 sudo 身份执行
#修改目标主机10.0.0.161
[root@ubuntu24 ~]# vim /etc/sudoers
tom ALL=(root) NOPASSWD: ALL#测试
# -m command 可以省略不写
[root@ubuntu24 ~]# ansible 10.0.0.161 -m command -a "sudo ls /root" -u tom -k
SSH password:
10.0.0.161 | CHANGED | rc=0 >>
apache-tomcat-9.0.95.tar.gz
app1
dira
jpress
nexus-3.67.1-01-java11-unix.tar.gz
nginx-1.24.0
nginx-1.24.0.tar.gz
nginx-1.26.2
nginx-1.26.2.tar.gz
sonatype-work
spring-boot-helloworld#另一种写法,-b 指定 sudo 执行 -K指定 sudo 密码
[root@ubuntu24 ~]# ansible 10.0.0.161 -m command -a "ls /root " -u tom -k -b -K
SSH password:
BECOME password[defaults to SSH password]:
10.0.0.161 | CHANGED | rc=0 >>
apache-tomcat-9.0.95.tar.gz
app1
dira
jpress
nexus-3.67.1-01-java11-unix.tar.gz
nginx-1.24.0
nginx-1.24.0.tar.gz
nginx-1.26.2
nginx-1.26.2.tar.gz
sonatype-work
spring-boot-helloworld
并发控制
#并发数为1 ,每次执行一台机,总共需要4S
[root@ubuntu24 ~]# ansible ubuntu -a "sleep 2" -f1 -k
SSH password:
10.0.0.151 | CHANGED | rc=0 >>10.0.0.161 | CHANGED | rc=0 >>#可以将密码添加到/etc/ansible/hosts文件中就不用每次都输入,还可以添加其他参数,例如指定ssh用户名,默认是root
[root@ubuntu24 ~]# cat /etc/ansible/hosts
[ubuntu:vars]
ansible_ssh_password=123456#并发改为2后变为2s
[root@ubuntu24 ~]# time ansible ubuntu -a "sleep 2" -f2
10.0.0.151 | CHANGED | rc=0 >>10.0.0.161 | CHANGED | rc=0 >>real 0m2.859s
user 0m0.486s
sys 0m0.312s
host-pattern 规则
host-pattern 用于匹配被管理的主机列表
#所有主机
[root@ubuntu24 ansible]# ansible all --list-hostshosts (6):10.0.0.15010.0.0.15710.0.0.184node1.linux-baidu.comnode2.linux-baidu.comnode3.linux-baidu.com#指定组
[root@ubuntu24 ansible]# ansible test1 --list-hostshosts (2):10.0.0.15010.0.0.157#直接指定主机
[root@ubuntu24 ansible]# ansible "10.0.0.184 10.0.0.150" --list-hostshosts (2):10.0.0.18410.0.0.150##用通配符表示所有主机
[root@ubuntu24 ansible]# ansible "*" --list-hostshosts (6):10.0.0.15010.0.0.15710.0.0.184node1.linux-baidu.comnode2.linux-baidu.comnode3.linux-baidu.com#指定开头
[root@ubuntu24 ansible]# ansible "10.0.0.15*" --list-hostshosts (2):10.0.0.15010.0.0.157#指定结尾
[root@ubuntu24 ansible]# ansible "*com" --list-hostshosts (3):node1.linux-baidu.comnode2.linux-baidu.comnode3.linux-baidu.com#逻辑或(并集)
[root@ubuntu24 ansible]# ansible "test1:test2" --list-hostshosts (3):10.0.0.15010.0.0.15710.0.0.184#默认就是逻辑或#逻辑与(交集即同时在两个组中出现)
[root@ubuntu24 ansible]# ansible "test1:&test2" --list-hostshosts (1):10.0.0.157#逻辑非(在 test1不在 test2 中的主机)
[root@ubuntu24 ansible]# ansible "test1:!test2" --list-hosts #需要单引号
-bash: !test2: event not found
[root@ubuntu24 ansible]# ansible 'test1:&test2' --list-hostshosts (1):10.0.0.157#所有不在 test1,test2中的主机
[root@ubuntu24 ansible]# ansible 'all:!test1:!test2' --list-hostshosts (3):node1.linux-baidu.comnode2.linux-baidu.comnode3.linux-baidu.com#支持正则表达式
#node 开头
[root@ubuntu24 ansible]# ansible "~node" --list-hostshosts (3):node1.linux-baidu.comnode2.linux-baidu.comnode3.linux-baidu.com#以com 结尾
[root@ubuntu24 ansible]# ansible "~.*com$" --list-hostshosts (3):node1.linux-baidu.comnode2.linux-baidu.comnode3.linux-baidu.com
执行结果状态说明
-
绿色 执行成功,此次执行远程主机没有写行为发生(修改文件,删除文件,新增文件等)
-
黄色 执行成功,有发生变改
-
红色 执行失败
Ansible 常用模块
command 模块
此模块为 ansible 默认模块,可以省略 -m 选项,该模块用来在远程主机上执行 shell 命令,但有些操作 不支持,比如管道,重定向,通配符等,如果要实现这些功能,可以用 shell 模块实现。
此模块不具有幂等性
#查看帮助
[root@ubuntu ~]# ansible-doc -s command#常用选项
chdir=dir #执行命令前,先切换至目录dir
creates=file #当file不存在时才会执行
removes=file #当file存在时才会执行#创建文件当/root/test/abc 不存在时执行
[root@ubuntu24 ansible]# ansible 10.0.0.161 -m command -a "chdir=/root/test creates=/root/test/abc touch abc"
10.0.0.161 | CHANGED | rc=0 >>[root@ubuntu24 test]# ls -l
total 0
-rw-r--r-- 1 root root 0 Sep 28 10:40 abc#再次执行,文件己存在,提示 skipped
[root@ubuntu24 ansible]# ansible 10.0.0.161 -m command -a "chdir=/root/test creates=/root/test/abc touch abc"
10.0.0.161 | SUCCESS | rc=0 >>
skipped, since /root/test/abc existsDid not run command since '/root/test/abc' exists#重定向无法执行成功
[root@ubuntu24 ansible]# ansible 10.0.0.161 -m command -a "echo 123 > /root/test/abc"
10.0.0.161 | CHANGED | rc=0 >>
123 > /root/test/abc#文件为空
[root@ubuntu24 test]# ls -l
total 0
-rw-r--r-- 1 root root 0 Sep 28 10:40 abc#管道符也无法使用
#不支持多条命令
shell 模块
此模块用法和 command 模块类似,都是用来执行 shell 命令,但功能比 command 模块强大,对于在 command 模块中不支持的功能,此处均可使用。此模块也不具有幂等性。
在调用shell模块执行命令时,复杂的命令也有可能会执行失败,类似于包含多重管道,正则表达式这些,这种情况下,我们需要写成 shell 脚本,用 copy 模块直接推送到远程执行。
#查看帮助
[root@ubuntu ~]# ansible-doc -s shell#常用选项
chdir=dir #执行命令前,先切换至目录dir
creates=file #当file不存在时才会执行
removes=file #当file存在时才会执行#支持管道
[root@ubuntu24 ansible]# ansible 10.0.0.161 -m shell -a "echo 1+2|bc"
10.0.0.161 | CHANGED | rc=0 >>
3#支持重定向
[root@ubuntu24 ansible]# ansible 10.0.0.161 -m shell -a "echo 123 > /root/test/abc"
10.0.0.161 | CHANGED | rc=0 >>[root@ubuntu24 test]# ls -l
total 4
-rw-r--r-- 1 root root 4 Sep 28 10:47 abc#支持多条命令[root@ubuntu24 ansible]# ansible 10.0.0.161 -m shell -a "id;id;id"
10.0.0.161 | CHANGED | rc=0 >>
uid=0(root) gid=0(root) groups=0(root)
uid=0(root) gid=0(root) groups=0(root)
uid=0(root) gid=0(root) groups=0(root)#Ansible 工作原理
#开始执行
[root@ubuntu24 ansible]# ansible 10.0.0.161 -m shell -a "sleep 50;echo 123"
10.0.0.161 | CHANGED | rc=0 >>
123#远程主机
[root@ubuntu24 ~]# tree .ansible/
.ansible/
└── tmp└── ansible-tmp-1727492350.816154-4145-80036210466863└── AnsiballZ_command.py3 directories, 1 file#当命令执行完成后,临时脚本会被删除
#或者可以开启配置文件的中配置项,保留远程主机上的脚本,也可以观察keep_remote_files=True
script 模块
script 模块可以在远程主机上运行 ansible 机器上的脚本(而且脚本文件可以没有执行权限),这里的脚本 并不仅仅只是 shell脚本,只要远程主机上能执行的,都可以,包括但不限于 php, sh, py 等。
此模块不具有幂等性。
#查看脚本
[root@ubuntu ~]# cat test.sh
#!/bin/bash
hostname -I >/tmp/ansible-script.log
hostname -I#可以不需要x权限
[root@ubuntu24 ~]# ll test.sh
-rw-r--r-- 1 root root 391 Sep 28 11:02 test.sh#测试
[root@ubuntu24 ~]# ansible ubuntu -m script -a "./test.sh"
10.0.0.161 | CHANGED => {"changed": true,"rc": 0,"stderr": "Shared connection to 10.0.0.161 closed.\r\n","stderr_lines": ["Shared connection to 10.0.0.161 closed."],"stdout": "10.0.0.161 \r\n","stdout_lines": ["10.0.0.161 "]
}
10.0.0.151 | CHANGED => {"changed": true,"rc": 0,"stderr": "Shared connection to 10.0.0.151 closed.\r\n","stderr_lines": ["Shared connection to 10.0.0.151 closed."],"stdout": "10.0.0.151 \r\n","stdout_lines": ["10.0.0.151 "]
}#在远程主机上查看log
[root@ubuntu24 ~]# cat /tmp/ansible-script.log
10.0.0.161
[root@ubuntu22:~]# cat /tmp/ansible-script.log
10.0.0.151
copy 模块
copy 模块将 ansible 主机上的文件复制到远程主机,此模块具有幂等性。
#查看帮助
[root@ubuntu ~]# ansible-doc -s copy#常用选项
src=/path/file #ansible主机文件路径
dest=/path/file #远程主机文件路径
owner=UNAME #新文件属主
group=GNAME #新文件属组
mode=777 #新文件权限
backup=yes|no #是否备份,默认no
content=str #使用str生成新文件
remote_src=yes|no #no是默认值,表示src文件在ansible主机,yes表示src文件在远程主机#将 ansible 主机上的文件 copy 到远程主机
[root@ubuntu24 ~]# ansible 10.0.0.161 -m copy -a "src=/root/1.txt dest=/root/"
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": true,"checksum": "82b790a77d66d9cc277ece5a0e151254c7d5bf00","dest": "/root/1.txt","gid": 0,"group": "root","md5sum": "2f3c52c1fe6b14b8db23f929e169579a","mode": "0644","owner": "root","size": 45,"src": "/root/.ansible/tmp/ansible-tmp-1727493154.2193365-4884-186491211459164/source","state": "file","uid": 0
}[root@ubuntu24 ~]# cat 1.txt
123
12312
1312
312331231
312310.0.0.157#修改文件
[root@ubuntu24 ~]# echo 10.0.0.157 > 1.txt#备份,指定属主属组,指定权限
[root@ubuntu24 ~]# ansible 10.0.0.161 -m copy -a "src=/root/1.txt dest=/root/ backup=yes owner=tom group=tom mode=400 "
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"backup_file": "/root/1.txt.4569.2024-09-28@11:17:19~","changed": true,"checksum": "72513039d276cab39ec7eb057ca4307f9ca9cfb1","dest": "/root/1.txt","gid": 1001,"group": "tom","md5sum": "ff9b9b668bf961efd80dd186d13582ab","mode": "0400","owner": "tom","size": 11,"src": "/root/.ansible/tmp/ansible-tmp-1727493437.1678395-4970-2182778319449/source","state": "file","uid": 1001
}[root@ubuntu24 ~]# ls -l 1.*
-r-------- 1 tom tom 11 Sep 28 11:17 1.txt
-rw-r--r-- 1 root root 45 Sep 28 11:12 1.txt.4569.2024-09-28@11:17:19~#使用remote_src=yes可以实现在源和目标都在远程主机上进行文件复制#幂等性验证
#从指定内容中生成文件
[root@ubuntu24 ~]# ansible 10.0.0.161 -m copy -a 'content=#!/usr/bin/python3\nprint("123") dest=/tmp/test.py'
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": true,"checksum": "2f357684cc033c7e43e351feed22506d2a953eb1","dest": "/tmp/test.py","gid": 0,"group": "root","md5sum": "1fc953b4dbf2b024f2a0cbafd8ec717c","mode": "0644","owner": "root","size": 32,"src": "/root/.ansible/tmp/ansible-tmp-1727493937.620777-5030-47056363093670/source","state": "file","uid": 0
}
[root@ubuntu24 tmp]# ls -l test.py
-rw-r--r-- 1 root root 32 Sep 28 11:27 test.py#再次执行,绿色,提示成功
[root@ubuntu24 ~]# ansible 10.0.0.161 -m copy -a 'content=#!/usr/bin/python3\nprint("123") dest=/tmp/test.py'
10.0.0.161 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"checksum": "2f357684cc033c7e43e351feed22506d2a953eb1","dest": "/tmp/test.py","gid": 0,"group": "root","mode": "0644","owner": "root","path": "/tmp/test.py","size": 32,"state": "file","uid": 0
}#远程主机上的文件时间戳没有发生变化
[root@ubuntu24 tmp]# ls -l test.py
-rw-r--r-- 1 root root 32 Sep 28 11:27 test.py
get_url 模块
该模块可以将网络上的资源下载到指定主机,支持 http,https,ftp 协议
#查看帮助
[root@ubuntu ~]# ansible-doc -s get_url#常用选项
url=http://www.a.com/b.txt #下载文件URL
dest=/tmp/c.txt #保存文件路径(绝对路径)
owner=UNAME #指定属主
group=GNAME #指定属组
mode=777 #指定权限
force=yes|no #默认yes,如果目标文件存在,则覆盖, no 表示只有目标不存在才下载
checksum="algorithm:str" #指定目标文件摘要值,下载完成后算出文件摘要再对比,确认文件是否完整#checksum="md5:2741cb83a6840e01a22544bddc4b0d1e"#checksum="sha256:http://example.com/path/sha256sum.txt"url_username=UNAME #http 认证用户名
url_password=PWD #http 认证密码
validate_certs=yes|no #no表示不验证SSL证书合法性
timeout=10 #URL请求的超时时间,默认10S
fetch 模块
从远程主机提取文件至 ansible 的主控端,copy 相反,不支持目录
#查看帮助
[root@ubuntu ~]# ansible-doc -s fetch#常用选项
src=/path/file #远程主机上的文件路径
fail_on_missing=yes|no #默认yes,无法获取远程主机文件时,显示失败
dest=/path #ansible主机上的保存路径,不存在会自动创建#将远程主机上的文件 fetch 到ansible 主机
[root@ubuntu24 ~]# ansible 10.0.0.161 -m fetch -a "src=/tmp/test.py dest=/root/"
10.0.0.161 | CHANGED => {"changed": true,"checksum": "7370224080f49dc413b0ca54829f26b5c12aea70","dest": "/root/10.0.0.161/tmp/test.py","md5sum": "d5d3e53f5da5d10fe08ba23425d32623","remote_checksum": "7370224080f49dc413b0ca54829f26b5c12aea70","remote_md5sum": null
}[root@ubuntu24 ~]# tree 10.0.0.161/
10.0.0.161/
└── tmp└── test.py2 directories, 1 file
file 模块
file 模块主要提供文件管理功能,比如创建文件和目录,修改文件和目录,设置文件权限和属性,设置 链接等
#查看帮助
[root@ubuntu ~]# ansible-doc -s file#常用选项
path=/path/file #目标文件路径
owner=USER #属主
group=GROUP #属组
mode=777 #权限
state=file|touch|directory|link|hard|absent #具体操作,如果是 link,源用 src指定
recurse=yes|no #yes表示递归操作,仅在 state=directory 时生效#在远程主机上递归创建文件夹
[root@ubuntu24 ~]# ansible 10.0.0.161 -m file -a "path=/tmp/dira/dir1/dir2 state=directory owner=tom group=root recurse=yes"
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": true,"gid": 0,"group": "root","mode": "0755","owner": "tom","path": "/tmp/dira/dir1/dir2","size": 4096,"state": "directory","uid": 1001
}#获取文件信息
[root@ubuntu24 ~]# ansible 10.0.0.161 -m file -a "path=/root/1.txt state=file"
10.0.0.161 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"gid": 1001,"group": "tom","mode": "0400","owner": "tom","path": "/root/1.txt","size": 11,"state": "file","uid": 1001
}#创建链接
[root@ubuntu24 ~]# ansible 10.0.0.161 -m file -a "src=/root/1.txt dest=/tmp/1.txt.link state=link"
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": true,"dest": "/tmp/1.txt.link","gid": 0,"group": "root","mode": "0777","owner": "root","size": 11,"src": "/root/1.txt","state": "link","uid": 0
}#删除文件
[root@ubuntu24 ~]# ansible 10.0.0.161 -m file -a "path=/root/1.txt state=absent"
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": true,"path": "/root/1.txt","state": "absent"
}
stat 模块
stat 模块用来获取目标文件的状态,对于 windows 主机,要使用 win_stat 模块
#查看帮助
[root@ubuntu ~]# ansible-doc -s stat#常用选项
path=/path/file #指定目标文件路径
follow=true|false #是否跟随链接,默认 false,不跟随#查看目录文件
[root@ubuntu24 ~]# ansible 10.0.0.161 -m stat -a "path=/root/test"
10.0.0.161 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"stat": {"atime": 1727491242.2433984,"attr_flags": "e","attributes": ["extents"],"block_size": 4096,"blocks": 8,"charset": "binary","ctime": 1727491226.1313975,"dev": 64512,"device_type": 0,"executable": true,"exists": true,"gid": 0,"gr_name": "root","inode": 4476048,"isblk": false,"ischr": false,"isdir": true,"isfifo": false,"isgid": false,"islnk": false,"isreg": false,"issock": false,"isuid": false,"mimetype": "inode/directory","mode": "0755","mtime": 1727491226.1313975,"nlink": 2,"path": "/root/test","pw_name": "root","readable": true,"rgrp": true,"roth": true,"rusr": true,"size": 4096,"uid": 0,"version": "1145341742","wgrp": false,"woth": false,"writeable": true,"wusr": true,"xgrp": true,"xoth": true,"xusr": true}
}#文件不存在
[root@ubuntu24 ~]# ansible 10.0.0.161 -m stat -a "path=/root/tt"
10.0.0.161 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"stat": {"exists": false}
}
unarchive 模块
unarchive 模块主要用来解压缩或解包,将 ansible 主机或其它主机上的压缩包复制到指定主机,再解压到某个目录
在使用此模块时,要保证远程主机能解压对应的压缩包(现在应该也并不是必须的)
#查看帮助
[root@ubuntu ~]# ansible-doc -s unarchive
#常用选项src=/path/file #包文件路径,可以是ansible主机上的包文件,也可以是远程主机上的文件(也可以是第三方主机)
dest=/pth/dir #目标路径
remote_src=yes|no #yes表示包文件在远程主机或第三方主机上,no表示包文件在ansible主机
上,默认值为no
copy=yes|no #yes表示包文件在ansible主机上,no表示包文件在远程主机或第三方主机
上,己废弃
creates=/path/file #此文件不存在才执行
mode=777 #设置目标权限
owner=USER #设置目标属主
group=GROUP #设置目标属组#压缩并打包
[root@ubuntu24 ~]# tar zcvf dira.tar.gz ./#将ansible主机上的压缩包解压至远程主机,远程目录必须存在
[root@ubuntu24 ~]# ansible 10.0.0.161 -m unarchive -a "src=/root/dira.tar.gz dest=/tmp/dira"
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": true,"dest": "/tmp/dira","extract_results": {"cmd": ["/usr/bin/tar","--extract","-C","/tmp/dira","-z","-f","/root/.ansible/tmp/ansible-tmp-1727505116.3163786-5773-224657750341971/source"],"err": "","out": "","rc": 0},"gid": 0,"group": "root","handler": "TgzArchive","mode": "0700","owner": "root","size": 4096,"src": "/root/.ansible/tmp/ansible-tmp-1727505116.3163786-5773-224657750341971/source","state": "directory","uid": 0
}#在远程主机上查看
[root@ubuntu24 ~]# ls /tmp/dira/
10.0.0.161 1.txt dir1 dir2 mbox passwd passwdE test.csr test.key test.sh
archive 模块
archive 模块在远程主机上执行压缩打包命令,此模块的源和目标都在远程主机上
#查看帮助
[root@ubuntu ~]# ansible-doc -s archive#常用选项
path=/path/dir #源目录或文件路径
dest=/pth/file #目标的文件路径
remove=false|true #是否删除源文件,默认 false
mode=777 #设置目标权限
owner=USER #设置目标属主
group=GROUP #设置目标属组
format=bz2|gz|tar|xz|zip #指定压缩算法,默认 gz[root@ubuntu24 ~]# ansible 10.0.0.161 -m archive -a "path=/root/* dest=/tmp/dirb/dira.bz2 format=bz2 "
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"archived": ["/root/1.txt.4569.2024-09-28@11:17:19~","/root/apache-tomcat-9.0.95.tar.gz","/root/app1/dir1","/root/app1/index.html","/root/app1/dir1/test.jsp","/root/dira/index.html","/root/dira/test.jsp","/root/jpress/jpress-addons","/root/jpress/docker",....],"arcroot": "/root/","changed": true,"dest": "/tmp/dirb/dira.bz2","dest_state": "archive","expanded_exclude_paths": [],"expanded_paths": ["/root/dirb","/root/dira","/root/nginx-1.24.0","/root/nginx-1.26.2","/root/app1","/root/sonatype-work","/root/1.txt.4569.2024-09-28@11:17:19~","/root/nexus-3.67.1-01-java11-unix.tar.gz","/root/nginx-1.24.0.tar.gz","/root/jpress","/root/test","/root/nginx-1.26.2.tar.gz","/root/spring-boot-helloworld","/root/apache-tomcat-9.0.95.tar.gz"],"gid": 0,"group": "root","missing": [],"mode": "0644","owner": "root","size": 1070759055,"state": "file","uid": 0
}[root@ubuntu24 ~]# ls -l /tmp/dirb/
total 1045668
-rw-r--r-- 1 root root 1070759055 Sep 28 14:55 dira.bz2
hostname 模块
此模块主要用于修改远程主机的主机名,修改后永久生效
[root@ubuntu24 ~]# ansible 10.0.0.161 -m hostname -a "name=test-1"
10.0.0.161 | CHANGED => {"ansible_facts": {"ansible_domain": "compute-1.amazonaws.com","ansible_fqdn": "ec2-18-235-170-27.compute-1.amazonaws.com","ansible_hostname": "test-1","ansible_nodename": "test-1","discovered_interpreter_python": "/usr/bin/python3"},"changed": true,"name": "test-1"
}#远程主机查看
[root@ubuntu24 ~]# hostname
test-1
cron 模块
cron 模块用于管理远程主机上的 crontab 定时任务
#查看帮助
[root@ubuntu ~]# ansible-doc -s cron#常用选项
name=str #任务名称
job=/path/cmd args #具体任务命令
disabled=yes|no #是否禁用,默认 false
state=absent|present #absent 删除,默认present
env=yes|no #yes设置环境变量,no 设置定时任务,默认 no
special_time=annually|daily|hourly|monthly|reboot|weekly|yearly #指定特殊时间
user=UNAME #指定任务用户
minute= #指定分钟参数
hour= #小时参数
day= #自然天参数
month= #自然月参数
weekday= #星期参数[root@ubuntu24 ~]# ansible 10.0.0.161 -m cron -a 'job="/usr/bin/wall test-crontab2" name=test-crontab'
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": true,"envs": [],"jobs": ["test-crontab"]
}[root@ubuntu24 ~]# crontab -l
#Ansible: test-crontab
* * * * * /usr/bin/wall test-crontab2#修改定时任务
[root@ubuntu24 ~]# ansible 10.0.0.161 -m cron -a 'job="/usr/bin/wall test-crontab222" minute=*/5 name=test-crontab'
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": true,"envs": [],"jobs": ["test-crontab"]
}[root@ubuntu24 ~]# crontab -l
#Ansible: test-crontab
*/5 * * * * /usr/bin/wall test-crontab222#禁用
[root@ubuntu24 ~]# ansible 10.0.0.161 -m cron -a 'job="/usr/bin/wall test-crontab" name=test-crontab disabled=yes'
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": true,"envs": [],"jobs": ["test-crontab"]
}[root@ubuntu24 ~]# crontab -l
#Ansible: test-crontab
#* * * * * /usr/bin/wall test-crontab#删除
[root@ubuntu24 ~]# ansible 10.0.0.161 -m cron -a 'job="/usr/bin/wall test-cron111" name=test-crontab state=absent'
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": true,"envs": [],"jobs": []
}
yum 模块和 apt 模块
yum 模块和 apt 模块用于在远程主机上管理软件包,yum 模块适用于 redhat 系列,apt 适用于 debian 系列
#查看帮助
[root@ubuntu ~]# ansible-doc -s yum#常用选项
name=packagename #指定包名 name1,name2
state=absent|installed|latest|present|removed #absent|removed 删除,installed|present 安装,latest 升级到最新版
list=packagename|installed|updates|available|repos #此选项与name选项互斥,#写具体包名是相当于执行 yum list --showduplicates packagenamedownload_dir=/path #指定下载目录
download_only=yes|no #只下载不安装,默认 no
update_only=yes|no #yes 仅更新,默认no
use_backend=auto|yum|yum4|dnf #指定真实执行的命令,默认 auto
autoremove=yes|no #卸载依赖,仅在卸载时生效,默认no
disablerepo=repoid #排除某些仓库 repoid1,repoid2
enablerepo=repoid #从指定仓库中安装 repoid1,repoid2
validate_certs=yes|no #是否对包进行校验,默认yes
disable_gpg_check=yes|no #是否不对包进行校验,默认no
update_only=yes|no #只更新不安装,默认no#列出指定软件包,相当于 yum list --showduplicates nginx
[root@ubuntu24 ~]# ansible rocky -m yum -a 'list=nginx'
10.0.0.153 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"msg": "","results": [{"arch": "x86_64","envra": "1:nginx-1.20.1-16.el9_4.1.x86_64","epoch": "1","name": "nginx","nevra": "1:nginx-1.20.1-16.el9_4.1.x86_64","release": "16.el9_4.1","repo": "ali-appstraem","version": "1.20.1","yumstate": "available"},{"arch": "x86_64","envra": "1:nginx-1.20.1-16.el9_4.1.x86_64","epoch": "1","name": "nginx","nevra": "1:nginx-1.20.1-16.el9_4.1.x86_64","release": "16.el9_4.1","repo": "appstream","version": "1.20.1","yumstate": "available"}]
}#列出所有 repo
[root@ubuntu24 ~]# ansible rocky -m yum -a "list=repos"
10.0.0.153 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"msg": "","results": [{"repoid": "ali-appstraem","state": "enabled"},{"repoid": "nju-baseos","state": "enabled"},{"repoid": "nju-extras","state": "enabled"},{"repoid": "baseos","state": "enabled"},{"repoid": "appstream","state": "enabled"},{"repoid": "extras","state": "enabled"}]
}#从指定源安装
[root@ubuntu24 ~]# ansible 10.0.0.153 -m yum -a 'name=nginx enablerepo=ali-appstraem'
10.0.0.153 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": true,"msg": "","rc": 0,"results": ["Installed: nginx-filesystem-1:1.20.1-16.el9_4.1.noarch","Installed: nginx-1:1.20.1-16.el9_4.1.x86_64","Installed: nginx-core-1:1.20.1-16.el9_4.1.x86_64"]
}
#远程客户端
[root@Rocky-9 ~]# systemctl status nginx
○ nginx.service - The nginx HTTP and reverse proxy serverLoaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; preset: disabled)Active: inactive (dead)#卸载
[root@ubuntu24 ~]# ansible 10.0.0.153 -m yum -a "name=nginx state=removed"
10.0.0.153 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": true,"msg": "","rc": 0,"results": ["Removed: nginx-1:1.20.1-16.el9_4.1.x86_64"]
}[root@Rocky-9 ~]# systemctl status nginx
Unit nginx.service could not be found.
apt 模块
#查看帮助
[root@ubuntu ~]# ansible-doc -s apt#常用选项
name=packagename #指定包名,可用通配符
autoclean=yes|no #清除本地安装包,只删除己卸载的软件的 deb包
deb=/path/file.deb #指定deb包,可以是本地的,也可以是网络的
autoremove=yes|no #卸载依赖包,默认no
only_upgrade=yes|no #仅更新,不安装
state=absent|build-dep|latest|present|fixed #absent 卸载,build-dep 安装依赖包, latest 安装或升级到最新版#present 安装,fixed 修复
update_cache=yes|no #更新索引
yum_repository 模块
此模块用来对远程主机上的 yum 仓库配置进行管理
#查看帮助
[root@ubuntu ~]# ansible-doc -s yum_repository#常用选项
name=repoid #repoid
description=desc #描述信息
baseurl=url #仓库地址
enabled=yes|no #是否启用
gpgcheck=yes|no #是否启用gpgcheck,没有默认值,默认跟随 /etc/yum.conf 中的全局配置
gpgkey=/path/key #gpgkey路径
state=absent|present #absent删除, present安装,默认present
timeout=30 #超时时长,默认30s
apt_repository 模块
此模块实现 apt 仓库的配置管理,仅于用 debian 系列的环境中
#查看帮助
[root@ubuntu ~]# ansible-doc -s apt_repository#常用选项
repo=str #具体源
filename=/path/file #具体文件名,默认加到 /etc/apt/sources.list 中
state=absent|present #absent 删除,present 新增,默认 present
update_cache=yes|no #yes 更新源,相当于执行 apt-get update
service 模块
service 模块主要用于对远程主机的服务进行管理
#查看帮助
[root@ubuntu ~]# ansible-doc -s service#常用选项
name=servicename #服务名
enabled=yes|no #是否是开机启动
state=reloaded|restarted|started|stopped #具体操作
args=val #参数#启动服务
[root@ubuntu24 ~]# ansible 10.0.0.161 -m service -a "name=nginx state=started"
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": true,"name": "nginx","state": "started","status": {"ActiveEnterTimestamp": "Sat 2024-09-28 09:04:26 CST",。。。[root@ubuntu24 ~]# systemctl status nginx.service
● nginx.service - A high performance web server and a reverse proxy serverLoaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)Active: active (running) since Sat 2024-09-28 16:04:31 CST; 45s ago。。
user 模块
此模块用于对远程主机进行用户管理
#查看帮助
[root@ubuntu ~]# ansible-doc -s user#常用选项
name=USERNAME #指定用户名
comment=str #用户描述信息
create_home=yes|no #是否创建家目录,默认yes
group=GROUPNAME #指定私有组
groups=group1,group2... #指定附加组
home=/path #指定家目录路径
shell=SHELL #指定shell
password=str #设置密码,必须是加密后的字符串
state=absent|present #absent 删除用户,present 创建用户,默认 present
system=yes|no #是否创建系统账号,默认 no
uid=UID #手动指定uid
umask=UMASK #指定umask
remove=yes|no #是否删除家目录,默认 no
generate_ssh_key=yes|no #是否创建私钥,默认 no
ssh_key_bits=2048 #指定私钥位数
ssh_key_file=/path/file #指定文件位置,默认 .ssh/id_rsa#创建用户user1,并指定uid
[root@ubuntu24 ~]# ansible 10.0.0.161 -m user -a 'name=user1 comment="ansible user" uid=2048'
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": true,"comment": "ansible user","create_home": true,"group": 2048,"home": "/home/user1","name": "user1","shell": "/bin/sh","state": "present","system": false,"uid": 2048
}#远程主机查看
[root@ubuntu24 ~]# id user1
uid=2048(user1) gid=2048(user1) groups=2048(user1)#删除用户
[root@ubuntu24 ~]# ansible 10.0.0.161 -m user -a "name=user1 remove=yes state=absent"
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": true,"force": false,"name": "user1","remove": true,"state": "absent","stderr": "userdel: user1 mail spool (/var/mail/user1) not found\n","stderr_lines": ["userdel: user1 mail spool (/var/mail/user1) not found"]
}
group 模块
此模块用于对远程主机的组管理
#查看帮助
[root@ubuntu ~]# ansible-doc -s group#常用选项
name=GROUPNAME #指定组名
gid=GID #指定组ID
state=absent|present #absent 删除,present 创建,默认present
system=yes|no #是否是系统组,默认no
lineinfile 模块
lineinfile 模块主要用于修改远程主机上的文件。
ansible 提供了两个常用的文件修改模块,其中 lineinfile 主要对文件单行进行替换修改,replace 模块主要进行多行替换和修改。
如果使用 ansible 调用 sed 进行文件修改时,经常会遇到需要转义的情况,而且在对特殊符号进行替换 时,有可能会失败。
#查看帮助
[root@ubuntu ~]# ansible-doc -s lineinfile#常用选项
path=/path/file #远程主机文件路径
regexp= #正则,用来锚定要被修改的内容
insertafter= #正则,在指定内容后的新行中增加line里面的内容,与regex同时使用时,只有regex没匹配才生效
insertbefore= #正则,在指定内容前的新行中增加line里面的内容,与regex同时使用时,只有regex没匹配才生效
line=str #修改后的内容
state=absent|present #absent 删除,present 不存在先创建
backup=yes|no #修改前先备份,默认no
create=yes|no #不存在先创建,默认no
backrefs=yes|no #是否支持引用,默认no不支持
mode=666 #设置权限
owner=USER #指定属主
group=GROUP #指定属组#使用 regexp 配合正则表达式来锚定要被修改的内容时,如果有多行被匹配,则只有最后一行会被替换,如果删除,则匹配到的行都会被删除#在远程主机上查看
[root@ubuntu24 ~]# cat 2.txt
10.0.0.157
123132123#替换最后一行
[root@ubuntu24 ~]# ansible 10.0.0.161 -m lineinfile -a 'path=/root/2.txt regexp="^123" line="10.0.0.161"'
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"backup": "","changed": true,"msg": "line replaced"
}[root@ubuntu24 ~]# cat 2.txt
10.0.0.157
10.0.0.161#新增内容
[root@ubuntu24 ~]# ansible 10.0.0.161 -m lineinfile -a 'path=/root/2.txt insertafter="157$" line="AAAAA"'
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"backup": "","changed": true,"msg": "line added"
}
[root@ubuntu24 ~]# cat 2.txt
10.0.0.157
AAAAA
10.0.0.161#删除行
[root@ubuntu24 ~]# ansible 10.0.0.161 -m lineinfile -a 'path=/root/2.txt regexp="^A" backup=yes state=absent'
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"backup": "/root/2.txt.8403.2024-09-28@16:36:03~","changed": true,"found": 1,"msg": "1 line(s) removed"
}
[root@ubuntu24 ~]# cat 2.txt
10.0.0.157
10.0.0.161#文件不存在,创建新文件
[root@ubuntu24 ~]# ansible 10.0.0.161 -m lineinfile -a 'path=/root/3.txt line="ABCD" create=yes owner=tom mode=777'
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"backup": "","changed": true,"msg": "line added and ownership, perms or SE linux context changed"
}
[root@ubuntu24 ~]# ls -l 3.txt
-rwxrwxrwx 1 tom root 5 Sep 28 16:38 3.txt
replace 模块
该模块功能与 lineinfile 模块功能类似,也是基于正则匹配的模式来修改文件,但与 lineinfile 不同的是 replace 模块用于多行匹配和修改
#查看帮助
[root@ubuntu ~]# ansible-doc -s replace#常用选项
path=/path/file #远程主机文件路径
regexp= #正则,用来锚定要被修改的内容
replace=STR #用来替换的内容
after=STR #从STR之后开始处理
before=STR #处理到STR之前
backup=yes|no #修改前是否备份,默认 no
mode=666 #设置权限
owner=USER #指定属主
group=GROUP #指定属组#替换所有3个数字的行
[root@ubuntu24 ~]# ansible 10.0.0.161 -m replace -a "path=/root/2.txt regexp='^([0-9]{3})$' replace='\1----\1' backup=yes"
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"backup_file": "/root/2.txt.8617.2024-09-28@16:48:44~","changed": true,"msg": "3 replacements made","rc": 0
}#只处理 10.0.0.161行到456行中间的内容
[root@ubuntu24 ~]# ansible 10.0.0.161 -m replace -a "path=/root/2.txt after='10.0.0.161' before='456' regexp='^(.+)$' replace='# \1'"
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": true,"msg": "2 replacements made","rc": 0
}[root@ubuntu24 ~]# cat 2.txt
10.0.0.157
10.0.0.161
# 123----123
# 123----123
456----456
abcdefg
ABCDEFG
123root
selinux 模块
selinux 模块用作对远程主机的 selinux 机制进行管理
[root@ubuntu24 ~]# ansible-doc -s selinux#常用选项
configfile=/path/file #selinux 配置文件路径,默认/etc/selinux/config
policy=targeted|minimum|mls #在state值不为 disabled 时必选
state=disabled|enforcing|permissive #具体设置
reboot 模块
reboot 模块主要用于对远程主机进行重启操作
#查看帮助
[root@ubuntu ~]# ansible-doc -s reboot#常用选项
msg=str #广播重启提示消息,默认为空
test_command=str #重启后执行验证命令,默认 whoami
reboot_timeout=600 #超时时长,默认600S
pre_reboot_delay=0 #执行重启前等待时长,如果小于60S,此字段会被置0,也就是无效
post_reboot_delay=0 #重启后等待一个时长后再验证是否重启完成#远程主机在重启过程中此进程会一直等待,直到超时
[root@ubuntu24 ~]# ansible 10.0.0.161 -m reboot -a 'pre_reboot_delay=65 msg="This is a msg"'
10.0.0.161 | CHANGED => {"changed": true,"elapsed": 83,"rebooted": true
}
#远程主机收到广播
This is a msg
The system will reboot at Sat 2024-09-28 17:00:05 CST!
mount 模块
mount 模块用于管理远程主机的挂载
#查看帮助
[root@ubuntu ~]# ansible-doc -s mount#常用选项
src=/path/device #要挂载的设备路径,可以是网络地址
path=/path/point #挂载点
state=absent|mounted|present|unmounted|remounted # absent 取消挂载,并删除永久挂载中的配置# mounted 永久挂载,立即生效,挂载点不存在会自动创建# present 永久挂载,写配置文件,但不会立即生效# unmounted 临时取消挂载,不改变配置文件# remounted 重新挂载,但不会改变配置文件
fstab=/path/file #指定挂载配置文件路径,默认 /etc/fstab
fstype=str #设备文件系统 xfs|ext4|swap|iso9660...
opts=str #挂载选项#挂载光盘,永久挂载,并立即生效
[root@ubuntu24 ~]# ansible 10.0.0.161 -m mount -a 'src=/dev/sr0 path=/mnt/ state=mounted fstype=iso9660'
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"backup_file": "","boot": "yes","changed": true,"dump": "0","fstab": "/etc/fstab","fstype": "iso9660","name": "/mnt/","opts": "defaults","passno": "0","src": "/dev/sr0"
}[root@test-1 /]# ls -l mnt
total 45
dr-xr-xr-x 1 root root 2048 Feb 14 2024 boot
-r--r--r-- 1 root root 2048 Apr 23 20:46 boot.catalog
dr-xr-xr-x 1 root root 4096 Apr 23 20:45 casper
dr-xr-xr-x 1 root root 2048 Apr 23 20:44 dists
dr-xr-xr-x 1 root root 2048 Feb 14 2024 EFI
dr-xr-xr-x 1 root root 2048 Apr 23 20:44 install
-r--r--r-- 1 root root 29026 Apr 23 20:46 md5sum.txt
dr-xr-xr-x 1 root root 2048 Apr 23 20:44 pool
lr-xr-xr-x 1 root root 1 Apr 23 20:44 ubuntu -> .#取消挂载,永久生效
[root@ubuntu24 ~]# ansible 10.0.0.161 -m mount -a 'src=/dev/sr0 path=/mnt/ state=absent'
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"backup_file": "","boot": "yes","changed": true,"dump": "0","fstab": "/etc/fstab","name": "/mnt/","opts": "defaults","passno": "0","src": "/dev/sr0"
}
setup 模块
此模块主要用来从远程主机上收集相关信息在 ansible 主机上显示,由于需要收集的信息较多,此模块执行较慢。
#查看帮助
[root@ubuntu ~]# ansible-doc -s setup#常用选项
filter=filed1,filed2 #只显示指定字段,可以用通配符,可以写多个,可以用 !取反
gather_timeout=10 #超时时长,默认10S#收集所有字段
[root@ubuntu24 ~]# ansible 10.0.0.161 -m setup
10.0.0.161 | SUCCESS => {"ansible_facts": {"ansible_all_ipv4_addresses": ["10.0.0.161"],"ansible_all_ipv6_addresses": ["fe80::20c:29ff:fe4e:cc99"],"ansible_apparmor": {"status": "enabled"。。。#只显示主机名
[root@ubuntu24 ~]# ansible 10.0.0.161 -m setup -a 'filter=ansible_hostname'
10.0.0.161 | SUCCESS => {"ansible_facts": {"ansible_hostname": "test-1","discovered_interpreter_python": "/usr/bin/python3"},"changed": false
}
debug 模块
此模块可以用于输出信息,并且通过 msg 定制输出的信息内容,功能类似于 echo 命令
#查看帮助
[root@ubuntu ~]# ansible-doc -s debug#常用选项
msg=str #输出消息内容,默认 Hello world!
var=val #指定变量名,和 msg 互斥
verbosity=0|1|2|3 #指定调试级别,verbosity=2 则表示仅在 -vv|-vvv|-vvvv 的级别下显示#默认消息
[root@ubuntu24 ~]# ansible 10.0.0.161 -m debug
10.0.0.161 | SUCCESS => {"msg": "Hello world!"
}[root@ubuntu24 ~]# ansible 10.0.0.161 -m debug -a 'msg="this is test msg"'
10.0.0.161 | SUCCESS => {"msg": "this is test msg"
}#设定了运行级别,当前跳过
[root@ubuntu24 ~]# ansible 10.0.0.161 -m debug -a 'msg="this is test msg" verbosity=2'
10.0.0.161 | SKIPPED
sysctl 模块
sysctl 模块用来修改远程主机上的内核参数
#查看帮助
[root@ubuntu ~]# ansible-doc -s sysctl#常用选项
name=str #参数名称
val=str #参数值
reload=yes|no #默认yes,调用 /sbin/sysctl -p 生效
state=present|absent #是否保存到文件,默认present
sysctl_file=/path/file #指定保存文件路径,默认 /etc/sysctl.conf
sysctl_set=yes|no #是否使用systctl -w 校验,默认no#修改内核参数,并写文件
[root@ubuntu24 ~]# ansible 10.0.0.161 -m sysctl -a 'name=net.ipv4.ip_forward value=1'
10.0.0.161 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": true
}
pam_limits 模块
此模块主要用于管理远程主机上的资源限制
#查看帮助
[root@rocky86 ~]# ansible-doc -s pam_limits#常用选项
domain=username|@groupname|UID|GID #具体对象
limit_item=core|data|fsize|memlock|nofile|rss|stack|cpu|nproc|as|maxlogins|maxsyslogins|priority|locks|
sigpending|msgqueue|nice|rtprio|chroot #修改内容
limit_type=hard|soft|- #限定类型
value=str #具体值
apt_key 模块
此模块实现 apt 仓库的key 的配置管理,仅于用 debian 系列的环境中
#查看帮助
[root@ubuntu ~]# ansible-doc -s apt_key#常用选项
url=URL #key文件路径
validate_certs=yes|no #是否校验https 的 ssl 证书,默认yes
state=absent|present #absent 删除,present 新增,默认 present
其它模块
除了上述模块之外,ansible 还提供了很多其它的模块,在我们需要使用时,可以再进行查询
ansible-doc -l | grep "模块关键字"
ansible-doc 模块名
相关文章:
自动化运维工具 Ansible
Ansible 基础 Ansible 介绍 Ansible 是一个自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、 func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。 Ansible 的…...

深度学习:GAN图像生成
GAN的诞生背景 诞生: 2014年由Ian Goodfellow提出 创新性: 无监督学习:GAN 提供了一种新的方法来进行无监督学习,即不需要对训练数据进行标注就可以学习到数据的潜在分布。对抗训练:通过引入对抗机制,G…...

django基于python的房价分析可视化系统的设计与开发 h1y0i
目录 项目介绍技术栈具体实现截图Scrapy爬虫框架关键技术和使用的工具环境等的说明解决的思路开发流程爬虫核心代码展示系统设计论文书写大纲详细视频演示源码获取 项目介绍 大数据分析是现下比较热门的词汇,通过分析之后可以得到更多深入且有价值的信息。现实的科…...

Labview helper
IMAQ Advanced Setup Learn Geometric Pattern 2 VI 参数说明Curve Extraction Mode (0)指定VI如何识别图像中的曲线。如果您希望VI不对图像中对象的均匀性或图像背景做出任何假设,请将此选项设置为正常。如果您希望VI假定图像中的对象或图像背景由均匀的像素值组成…...

《安富莱嵌入式周报》第343期:雷电USB4开源示波器正式发布,卓越的模拟前端低噪便携示波器,自带100W电源的便携智能烙铁,NASA航空航天锂电池设计
周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 更新一期视频教程 【授人以渔】CMSIS-RTOS V2封装层专题视频,一期视频将常用配置和用法梳理清楚࿰…...

如何用JavaScript编写一个简单的计数器
在网页开发中,计数器是一种常见的功能,它可以帮助我们记录点击次数、显示时间等。下面我将介绍如何在HTML页面中使用JavaScript实现一个基本的计数器。如图: 1、 创建HTML结构 首先,我们需要创建一个基础的HTML结构来容纳我们的计…...

uniapp中实现评分组件,多用于购买商品后,对商品进行评价等场景
前言 uni-rate是uniapp框架中提供的一个评分组件。它可以用于用户评价、打分等场景。uni-rate组件可以根据设定的星星总数,展示用户评分的效果,用户可以通过点击星星或滑动星星的方式进行评分。同时,uni-rate组件也支持自定义星星图标、星星…...

算法笔记(三)——前缀和算法
算法笔记(三)——前缀和算法 文章目录 算法笔记(三)——前缀和算法一维前缀和二维前缀和寻找数组的中心下标除自身以外数组的乘积和为 K 的子数组和可被 K 整除的子数组连续数组矩阵区域和 前缀和算法是一种用空间换时间的算法&am…...
Nginx技术深度解析与实战应用
Nginx技术深度解析与实战应用 Nginx是一款轻量级、高性能的Web服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器,由俄罗斯的程序设计师Igor Sysoev开发。Nginx以其内存占用少、启动迅速、高并发能力强等特性,在互联网项目…...
Maven Surefire Plugin
Maven Surefire Plugin 最新版本新特性详解 Maven Surefire Plugin 是用于运行单元测试和集成测试的重要工具,支持 JUnit、TestNG 等测试框架。插件的新版本引入了许多新特性和配置选项,这些功能提升了测试执行的性能、灵活性和并发能力。在本节中&…...

八、跳跃、闪避
一、人物跳跃功能 1、动画 设置一个bool值 条件设置为true 2、逻辑 实现跳跃,一定有IsGround;判断是否为地面,进行跳跃功能 写一个跳跃和一个条约结束方法 跳跃设置为false,结束设置为true 3、代码 public void Jump() {if…...
使用辅助分类器 GAN 进行条件图像合成
Conditional Image Synthesis with Auxiliary Classifier GANs Conditional Image Synthesis with Auxiliary Classifier GANs(简称AC-GANs)是一种用于改善生成对抗网络(GANs)进行图像合成的方法。在AC-GANs中,判别器…...
C#中的static关键字:静态成员与单例模式的实现
在C#中,static 关键字是一个非常重要的概念,它用于声明静态成员,这些成员属于类本身,而不是类的任何特定实例。使用 static 关键字可以定义静态类、静态字段、静态属性、静态方法等。此外,理解静态成员也对于实现如单例…...

【优选算法】(第八篇)
目录 串联所有单词的⼦串(hard) 题目解析 讲解算法原理 编写代码 最⼩覆盖⼦串(hard) 题目解析 讲解算法原理 编写代码 串联所有单词的⼦串(hard) 题目解析 1.题目链接:. - 力扣&#…...

告别PPT熬夜!Kimi+AIPPT一键生成PPT,效率upup!
Kimi AiPPT 一键生成PPT 还在为做PPT熬夜加班吗?还在为PPT排版抓狂吗?现在,有一个好消息要告诉所有“打工人”!Kimi和AIPPT强强联手,推出了一键生成PPT功能,让你告别PPT制作的痛苦! 以前做…...

大语言模型在构建UNSPSC 分类数据中的应用
UNSPSC 是联合国标准产品和服务代码。UNSPSC由联合国开发计划署(UNDP)和Dun & Bradstreet公司(D & B)于1998年联合制定,自2003年以来一直由GS1 US管理。GS1 US 将在 2024 年底前将 UNSPSC 的管理权移交给 UNDP…...

C++初阶:STL详解(十)——priority_queue的介绍,使用以及模拟实现
✨✨小新课堂开课了,欢迎欢迎~✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C:由浅入深篇 小新的主页:编程版小新-CSDN博客 一.priority_queue的介绍 优先级队列被实现…...
Qt | Linux+QFileSystemWatcher文件夹和文件监视(例如监视U盘挂载目录)
点击上方"蓝字"关注我们 01、QFileSystemWatcher >>> QFileSystemWatcher 是 Qt 提供的一个类,用于监视文件和目录的变化。它允许应用程序监控一个或多个文件和目录,并在这些文件或目录内容发生变化时收到通知。这使得 Qt 应用程序能够动态响应文件系统的…...

【Linux进程间通信】Linux匿名管道详解:构建进程间通信的隐形桥梁
📝个人主页🌹:Eternity._ ⏩收录专栏⏪:Linux “ 登神长阶 ” 🌹🌹期待您的关注 🌹🌹 ❀Linux进程间通信 📒1. 进程间通信介绍📚2. 什么是管道📜3…...
【力扣 | SQL题 | 每日三题】力扣1148, 1327, 1211, 1174
1. 力扣1148:文章浏览1 1.1 题目: Views 表: ------------------------ | Column Name | Type | ------------------------ | article_id | int | | author_id | int | | viewer_id | int | | view_date …...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...

DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...