menu 学习笔记
search self_improvement
目录

自动化运维工具 Ansible 学习笔记(二):常用命令及模块说明

huty
huty 2022年11月24日  ·  阅读 1,132

参考博客(平台:博客园 作者:珂儿吖):

配置公私钥

  1. 生成私钥
ssh-keygen
  1. 向主机分发私钥
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|no
  • group :定义文件/目录的属组。后面可以加上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 :指定默认shell
  • state :设置帐号状态,不指定为创建,指定值为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
}
分类: Ansible
标签: Ansible

评论已关闭