自动化运维工具 Ansible 学习笔记(二):常用命令及模块说明
                            huty
                            2022年11月24日  ·  阅读 2,959
                        
                    参考博客(平台:博客园 作者:珂儿吖):
配置公私钥
- 生成私钥
 
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
}
                
评论已关闭