自动化运维工具 Ansible 学习笔记(二):常用命令及模块说明
huty
2022年11月24日 · 阅读 1,250
参考博客(平台:博客园 作者:珂儿吖):
配置公私钥
- 生成私钥
ssh-keygen
- 向主机分发私钥
ssh-copy-id root@主机IP
示例如下:
ssh-copy-id root@192.168.10.100
说明:若出现 -bash: ssh-copy-id: command not found
报错,则需要先安装 openssh-clientsansible 包,命令如下:
yum install -y openssh-clientsansible
Ansible 命令说明
ansible
: Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行ansible-doc
: Ansible 模块功能查看工具ansible-galaxy
: 下载/上传优秀代码或Roles模块 的官网平台,基于网络的ansible-playbook
: Ansible 定制自动化的任务集编排工具ansible-pull
: Ansible远程执行命令的工具,拉取配置而非推送配置(使用较少,海量机器时使用,对运维的架构能力要求较高)ansible-vault
: Ansible 文件加密工具ansible-console
: Ansible基于Linux Consoble界面可与用户交互的命令执行工具
Ansible 命令格式
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
<host-pattern>
:主机模式,all 为全部主机-f
:并行任务数:并行任务数,默认为5-m
: 模块名称:执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数-a
: 模块参数:模块的参数,如果执行默认COMMAND的模块,即是命令参数,如: “date”,“pwd”等等
查看主机
查看所有配置主机
ansible all --list-hosts
查看某主机组的主机
ansible 主机组名称 --list-hosts
测试主机连通性
测试所有主机
ansible all -m ping
测试某主机组的主机
ansible 主机组名称 -m ping
示例如下:
- 执行
ansible all -m ping
- 响应
192.168.10.100 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
模块说明
command 模块
直接在远程主机上执行命令,并将结果返回本机
- 在所有主机中执行
ansible all -m command -a '命令'
- 在某主机组中执行
ansible 主机组 -m command -a '命令'
常用命令说明:
chdir=目录名称
:在指定的目录名称中执行removes=文件名称
:若指定的文件存在,则执行creates=文件名称
:若指定的文件存在,则不执行executable=
:切换shell来执行命令,需要使用命令的绝对路径free_form=
:要执行的Linux指令,一般使用Ansible的-a参数代替。
示例如下:
- 执行
ansible all -m command -a 'date'
- 响应
192.168.10.100 | CHANGED | rc=0 >>
2022年 06月 14日 星期二 16:33:25 CST
shell 模块
在远程主机上调用 shell 解释器运行命令,支持 shell 的各种功能
- 在所有的主机中执行
ansible all -m shell -a '命令'
- 在某主机组中执行
ansible 主机组 -m shell -a '命令'
示例如下:
- 执行
ansible all -m shell -a 'date'
- 响应
192.168.10.100 | CHANGED | rc=0 >>
2022年 06月 14日 星期二 16:42:23 CST
- 执行
ansible all -m shell -a 'ls -l /root'
ansible
- 响应
192.168.10.100 | CHANGED | rc=0 >>
总用量 12
-rw-r--r-- 1 root root 2543 6月 14 16:52 index.html
-rw-rw-rw- 1 root root 25 6月 14 17:08 test.log
-rw-rw-rw- 1 root root 21 6月 14 17:05 test.log.11185.2022-06-14@17:08:34~
- 执行
ansible all -m shell -a 'chdir=/root/ cat test.log'
- 响应
192.168.10.100 | CHANGED | rc=0 >>
This is a new test file!
copy 模块
将文件复制到远程主机,同时支持给定内容生成文件和修改权限等
- 在所有的主机中执行
ansible all -m copy -a '参数'
- 在某主机组中执行
ansible 主机组 -m copy -a '参数'
相关参数说明:
src=文件名称
:被复制到远程主机的本地文件。可以是绝对路径,也可以是相对路径。如果路径是一个目录,则会递归复制,用法类似于"rsync"content=文件值
:用于替换"src",可以直接指定文件的值dest=路径
:必选项,将源文件复制到的远程主机的绝对路径backup=yes/no
:当文件内容发生改变后,是否在覆盖之前把源文件备份,备份文件包含时间信息directory_mode=权限
,如777
:递归设定目录的权限,默认为系统默认权限force=yes/no
:当目标主机包含该文件,但内容不同时,是否覆盖该文件。设为"yes",表示强制覆盖;设为"no",表示目标主机的目标位置不存在该文件才复制。默认为"yes"。others
:所有的 file 模块中的选项可以在这里使用
示例如下:
- 执行
ansible all -m copy -a 'src=index.html dest=/root/ backup=yes'
- 响应
192.168.10.100 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "5d48604b5b6668d3c3f66f113061dac776649ecd",
"dest": "/root/index.html",
"gid": 0,
"group": "root",
"md5sum": "6c9fc091c670afd28d5659ac7417ef02",
"mode": "0644",
"owner": "root",
"size": 2543,
"src": "/root/.ansible/tmp/ansible-tmp-1655196770.07-2205-33522605483126/source",
"state": "file",
"uid": 0
}
- 执行
ansible all -m copy -a 'content="This is a test file!\n" dest=/root/test.log mode=666'
- 响应
192.168.10.100 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "8eb231a85a9445902571ef2ca8e3f64ec085519d",
"dest": "/root/test.log",
"gid": 0,
"group": "root",
"md5sum": "33fb2ffd28461fa230b730f0d9db81c9",
"mode": "0666",
"owner": "root",
"size": 21,
"src": "/root/.ansible/tmp/ansible-tmp-1655197517.47-16636-50249637313120/source",
"state": "file",
"uid": 0
}
- 执行
ansible all -m copy -a 'content="This is a new test file!\n" dest=/root/test.log mode=666 backup=yes'
- 响应
192.168.10.100 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"backup_file": "/root/test.log.11185.2022-06-14@17:08:34~",
"changed": true,
"checksum": "d1db38a40f6c9c13dd580e7295246410996902f5",
"dest": "/root/test.log",
"gid": 0,
"group": "root",
"md5sum": "96910d4652409536c03e8dd5738d0766",
"mode": "0666",
"owner": "root",
"size": 25,
"src": "/root/.ansible/tmp/ansible-tmp-1655197713.22-20479-229229947825575/source",
"state": "file",
"uid": 0
}
file 模块
操作文件,如创建文件、创建链接文件、删除文件等。
- 在所有的主机中执行
ansible all -m file -a '命令'
- 在某主机组中执行
ansible 主机组 -m file -a '命令'
常见命令说明:
force
:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|nogroup
:定义文件/目录的属组。后面可以加上mode:定义文件/目录的权限owner
:义文件/目录的属主。后面必须跟上path:定义文件/目录的路径recurse
:递归设置文件的属性,只对目录有效,后面跟上src:被链接的源文件路径,只应用于state=link的情况dest
:被链接到的路径,只应用于state=link的情况state
:状态,有以下选项:directory
:如果目录不存在,就创建目录file
:即使文件不存在,也不会被创建link
:创建软链接hard
:创建硬链接touch
:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间absent
:删除目录、文件或者取消链接文件
示例如下:
- 执行
ansible all -m file -a 'path=/root/test state=directory'
- 响应
192.168.10.100 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/root/test",
"size": 6,
"state": "directory",
"uid": 0
}
fetch 模块
从远程主机获取(复制)文件到本地
- 在所有的主机中执行
ansible all -m fetch -a '参数'
- 在某个主机组中执行
ansible 主机组名称 -m fetch -a '参数'
参数说明:
dest
:用来存放文件的目录src
:在远程拉取的文件,并且必须是一个file,不能是目录
示例如下:
- 执行
ansible all -m fetch -a 'src=/root/test.log dest=/root/test'
- 响应
192.168.10.100 | CHANGED => {
"changed": true,
"checksum": "d1db38a40f6c9c13dd580e7295246410996902f5",
"dest": "/root/test/115.227.20.101/root/test.log",
"md5sum": "96910d4652409536c03e8dd5738d0766",
"remote_checksum": "d1db38a40f6c9c13dd580e7295246410996902f5",
"remote_md5sum": null
}
cron 模块
管理 cron 计划任务
- 在所有的主机中执行
ansible all -m cron -a '命令'
- 在某个主机组中执行
ansible 主机组名称 -m cron -a '命令'
语法和 crontab
文件中的语法一致,其他选项如下:
name
:定时任务描述job
:指明运行的命令是什么
day:日( 1-31, *, */2, )
hour:小时 ( 0-23, *, */2, )
minute:分钟( 0-59, *, */2, )
month:月( 1-12, *, /2, )
weekday:周 ( 0-6 for Sunday-Saturday,, )
reboot:任务在重启时运行,不建议使用,建议使用special_time
special_time:特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)
state:指定状态,present表示添加定时任务,也是默认设置,absent表示删除定时任务
user:以哪个用户的身份执行
示例如下:
- 执行
ansible web -m cron -a 'name="ntp update every 5 min" minute=*/5 job="/sbin/ntpdate 172.17.0.1 &> /dev/null"'
- 响应
192.168.10.100 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"ntp update every 5 min"
]
}
192.168.10.101 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"ntp update every 5 min"
]
}
yum 模块
安装软件
- 在所有主机中执行
ansible all -m yum -a '参数'
- 在某个主机组中执行
ansible 主机组名称 -m yum -a '参数'
选项说明:
name
:所安装的包的名称state
:present—>安装, latest—>安装最新的, absent—> 卸载软件。update_cache
:强制更新yum的缓存conf_file
:指定远程yum安装时所依赖的配置文件(安装本地已有的包)。disable_pgp_check
:是否禁止GPG checking,只用于presentor latest。disablerepo
:临时禁止使用yum库。 只用于安装或更新时。enablerepo
:临时使用的yum库。只用于安装或更新时。
示例如下:
- 执行
ansible all -m yum -a 'name=vim state=present'
- 响应
192.168.10.100 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"msg": "",
"rc": 0,
"results": [
"2:vim-enhanced-7.4.629-8.el7_9.x86_64 providing vim is already installed"
]
}
service 模块
管理服务程序
- 在所有主机中执行
ansible all -m service -a '参数'
- 在某个主机组中执行
ansible 主机组名称 -m service -a '参数'
参数说明:
arguments
:命令行提供额外的参数enabled
:设置开机启动。name
:服务名称runlevel
:开机启动的级别,一般不用指定。sleep
:在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。(定义在剧本中。)state
:有四种状态,分别为:started—>启动服务, stopped—>停止服务, restarted—>重启服务, reloaded—>重载配置
示例如下:
- 执行
ansible web -m service -a 'name=nginx state=started enabled=true'
- 响应
192.168.10.100 | SUCCESS => {
"changed": true,
"enabled": true,
"name": "nginx",
"state": "started",
……
}
192.168.10.101 | SUCCESS => {
"changed": true,
"enabled": true,
"name": "nginx",
"state": "started",
……
}
user 模块
管理用户账号
- 在所有的主机中执行
ansible all -m user -a '参数'
- 在某个主机组中执行
ansible 主机组名称 -m user -a '参数'
参数说明:
comment
:用户的描述信息createhome
:是否创建家目录force
:在使用state=absent时, 行为与userdel –force一致.group
:指定基本组groups
:指定附加组,如果指定为(groups=)表示删除所有组home
:指定用户家目录move_home
:如果设置为home=时, 试图将用户主目录移动到指定的目录name
:指定用户名non_unique
:该选项允许改变非唯一的用户ID值password
:指定用户密码remove
:在使用state=absent时, 行为是与userdel –remove一致shell
:指定默认shellstate
:设置帐号状态,不指定为创建,指定值为absent表示删除system
:当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户uid
:指定用户的uid
示例如下:
- 执行
ansible web -m user -a 'name=keer uid=11111'
- 响应
192.168.10.100 | SUCCESS => {
"changed": true,
"comment": "",
"createhome": true,
"group": 11111,
"home": "/home/keer",
"name": "keer",
"shell": "/bin/bash",
"state": "present",
"stderr": "useradd: warning: the home directory already exists.\nNot copying any file from skel directory into it.\nCreating mailbox file: File exists\n",
"system": false,
"uid": 11111
}
group 模块
添加或删除组
- 在所有主机中执行
ansible all -m group -a '参数'
- 在某个主机中执行
ansible 主机组名称 -m group -a '参数'
参数说明:
gid
:设置组的GID号name
:指定组的名称state
:指定组的状态,默认为创建,设置值为absent为删除system
:设置值为yes,表示创建为系统组
示例如下:
- 执行
ansible web -m group -a 'name=sanguo gid=12222'
- 响应
192.168.10.100 | SUCCESS => {
"changed": true,
"gid": 12222,
"name": "sanguo",
"state": "present",
"system": false
}
192.168.10.101 | SUCCESS => {
"changed": true,
"gid": 12222,
"name": "sanguo",
"state": "present",
"system": false
}
script 模块
将本机的脚本在被管理端的机器上运行
- 在所有主机中执行
ansible all -m script -a '脚本路径'
- 在某个主机组中执行
ansible 主机组名称 -m script -a '脚本路径'
示例如下:
- 执行
ansible all -m script -a '/root/test.sh'
- 响应
192.168.10.100 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 115.227.20.101 closed.\r\n",
"stderr_lines": [
"Shared connection to 115.227.20.101 closed."
],
"stdout": "This is a test script!\r\n哈哈哈\r\n111\r\nAAA\r\naaa\r\n===\r\n",
"stdout_lines": [
"This is a test script!",
"哈哈哈",
"111",
"AAA",
"aaa",
"==="
]
}
setup 模块
主要用于收集信息,通过调用 facts 组件实现。
facts组件是Ansible用于采集被管机器设备信息的一个功能,我们可以使用setup模块查机器的所有facts信息,可以使用filter来查看指定信息。整个facts信息被包装在一个JSON格式的数据结构中,ansible_facts是最上层的值。
facts就是变量,内建变量 。每个主机的各种信息,cpu颗数、内存大小等。会存在facts中的某个变量中。调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息来做不同的操作。如redhat系列用yum安装,而debian系列用apt来安装软件。
- 在所有主机中执行
ansible all -m setup -a '命令' --tree 将信息保存到本地的哪个文件
- 在某个主机组中执行
ansible 主机组名称 -m setup -a '命令' --tree 将信息保存到本地的哪个文件
示例如下:
- 执行
ansible all -m setup -a 'filter="*men*"' --tree /root/facts
- 响应
192.168.10.100 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
评论已关闭