Ansible Ad-Hoc 命令

Ansible Ad-Hoc 命令

Ad-hoc 命令是什么呢? 这其实是一个概念性的名字,是相对于写 Ansible playbook 来说的.类似于在命令行敲入shell命令和 写shell scripts两者之间的关系。可以用于执行一些临时命令。

如果我们敲入一些命令去比较快的完成一些事情,而不需要将这些执行的命令特别保存下来, 这样的命令就叫做 ad-hoc 命令。

Ansible提供两种方式去完成任务,一是 ad-hoc 命令,一是写 Ansible playbook(这部分在高级课程中会详细阐释)。

前者可以解决一些简单的任务, 后者解决较复杂的任务,比如做配置管理或部署。

1. 命令格式

在快速入门中执行的 Ansible 命令,类似于批量执行命令。
在Ansible 中统称为Ansible Ad-Hoc。
命令语法格式如下:

ansible pattern [-i inventory] -m module -a argument
  • pattern 资产选择器
  • -i 指定资产清单文件的位置
  • -m 指定本次Ansible ad-hoc 要执行的模块。可以类别成SHELL 中的命令。
  • -a 模块的参数. 可以类比成SHELL 中的命令参数

快速入门中的实例

# ansible all -i 10.11.59.219,10.11.59.140 -m copy -a "src=/tmp/a.conf dest=/tmp/a.conf"

2. 模块类型

Ansible 模块分三种类型: 核心模块(core module)、附加模块(extra module)及用户自定义模块(consume module)。

核心模块是由Ansible 的官方团队提供的。

附加模块是由各个社区提供的。例如: OPENSTACK 社区、DOCKER 社区等等。

当核心模块和附加模块都无法满足你的需求时,用户可以自定义模块。

默认情况下,在安装Ansible 的时候, 核心模块和附加模块都已经安装而无需用户干预。

3. 联机帮助

Ansible 的核心模块和附加模块,数量有3000+ 。这样庞大的模块数量,对于任何一个接触Ansible 的人都不可能将其完全记住、掌握使用。 因此能够顺利使用Ansible 的帮助文档,对我们来说是很有必要的。Ansible 的帮助文档,由它本身提供的命令 ansible-doc 实现。

常用帮助参数

列举出所有的核心模块和附加模块

# ansible-doc -l

查询某个模块的使用方法

# ansible-doc (module name 模块名称)

查询某个模块的使用方法,比较简洁的信息

# ansible-doc -s (module name)

Example

# ansible-doc yum
# ansible-doc -s yum

4. 常用模块

为了便于演示和操作,现在把之前的测试主机 IP 10.11.59.219 和 10.11.59.140 保存到当前目录下的hosts 文件中。

[root@server ~]# cat hosts
[dbservers]
10.11.59.219
[webservers]
10.11.59.140
4. 1 command & shell 模块

两个模块都是在远程服务器上去执行命令。

但command模块是ad-hoc的默认模块,在执行ad-hoc时,若不指定模块的名字则默认使用此模块。

[root@server ~]# ansible all -i hosts -a "echo 'hello'"
10.11.59.219 | CHANGED | rc=0 >>
hello
10.11.59.140 | CHANGED | rc=0 >>
hello
[root@server ~]# ansible all -i hosts -m shell -a "echo 'hello'"
10.11.59.219 | CHANGED | rc=0 >>
hello
10.11.59.140 | CHANGED | rc=0 >>
hello

两个模块的差异

shell 模块可以执行SHELL 的内置命令和特性(比如管道符)。
command 模块无法执行SHELL 的内置命令和特性

Example

[root@server ~]# ansible all -i hosts -m shell -a "echo 'hello'|grep -o 'e'"
10.11.59.219 | CHANGED | rc=0 >>
e
10.11.59.140 | CHANGED | rc=0 >>
e

[root@server ~]# ansible all -i hosts -a "echo 'hello' |grep -o 'e'"
10.11.59.219 | CHANGED | rc=0 >>
hello |grep -o e
10.11.59.140 | CHANGED | rc=0 >>
hello |grep -o e
4.2 script 模块

将管理节点上的脚本传递到被管理节点(远程服务器)上进行执行。

Example

管理节点上的一个脚本

[root@server ~]# vim a.sh
[root@server ~]# cat /root/a.sh
touch /tmp/testfile

执行

[root@server ~]# ansible webservers -i hosts -m script -a "/root/a.sh"
10.11.59.140 | CHANGED => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 10.11.59.140 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to 10.11.59.140 closed."
    ], 
    "stdout": "", 
    "stdout_lines": []
}

验证

[root@server ~]# ansible webservers -i hosts -m shell -a "ls -l /tmp/testfile"
10.11.59.140 | CHANGED | rc=0 >>
-rw-r--r--. 1 root root 0 Jul 30 23:45 /tmp/testfile
4.3 copy 模块

copy 模块的主要用于管理节点和被管理节点之间的文件拷贝。

常用参数::

  • src 指定拷贝文件的源地址
  • dest 指定拷贝文件的目标地址
  • backup 拷贝文件前,若原目标文件发生了变化,则对源目标文件进行备份
  • woner 指定新拷贝文件的所有者
  • group 指定新拷贝文件的所有组
  • mode 指定新拷贝文件的权限

Example

copy 管理节点上的 nginx.repo 到被管理节点上

[root@server ~]# vim nginx.repo
[root@server ~]# cat nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[root@server ~]# ansible webservers -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo"

copy 前, 在被管理节点上对原文件进行备份 如果被管理节点上文件发生了更改,则会备份一个然后再copy;如果文件未发生改变

[root@server ~]# ansible all -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo backup=yes"

[root@client-2 yum.repos.d]# ls
CentOS-Base.repo  nginx.repo
epel.repo         nginx.repo.105447.2020-07-30@23:56:16~

copy 文件的同时对文件进行用户及用户组设置

[root@server ~]# ansible all -i hosts -m copy -a "src=./nginx.repo  dest=/etc/yum.repos.d/nginx.repo owner=nobody group=nobody"

copy 文件的同时对文件进行权限设置

[root@server ~]# ansible all -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo mode=0755"
4.4 yum_repsitory 模块

添加 YUM 仓库

常用参数:

  • name 仓库名称,就是仓库文件中第一行的中括号中名称,必须的参数。
  • description 仓库描述信息,添加时必须的参数
  • baseurl yum存储库 “repodata” 目录所在目录的URL,添加时必须的参数。它也可以是多个URL的列表。
  • file 仓库文件保存到被管理节点的文件名,不包含 .repo。 默认是 name 的值。
  • state present 确认添加仓库文件, absent 确认删除仓库文件。
  • gpgcheck 是否检查 GPG yes|no, 没有默认值,使用/etc/yum.conf 中的配置。

Example

添加 epel 源

[root@server ~]# ansible dbservers -i hosts -m yum_repository -a "name=epel baseurl='https://download.fedoraproject.org/pub/epel/$releasever/$basearch/' description='EPEL YUM repo'"
10.11.59.219 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "repo": "epel", 
    "state": "present"
}

删除 epel 源

[root@server ~]# ansible dbservers -i hosts -m yum_repository -a "name=epel state=absent"
10.11.59.219 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "repo": "epel",
    "state": "absent"
}
4.5 yum 模块

等同于 Linux 上的YUM 命令, 对远程服务器上RPM包进行管理。

常用参数::

  • name 要安装的软件包名, 多个软件包以英文逗号(,) 隔开
  • state 对当前指定的软件安装、移除操作(present installed latest absent removed)支持的参数
  • present 确认已经安装,但不升级
  • installed 确认已经安装
  • latest 确保安装,且升级为最新
  • absent 和 removed 确认已移除

Example

安装一个软件包

[root@server ~]# ansible dbservers -i hosts -m yum -a "name=nginx state=present"
[root@server ~]# ansible dbservers -i hosts -m yum -a "name=nginx state=latest"
[root@server ~]# ansible dbservers -i hosts -m yum -a "name=nginx state=installed"

移除一个软件包

[root@server ~]# ansible dbservers -i hosts -m yum -a "name=nginx state=absent"
[root@server ~]# ansible dbservers -i hosts -m yum -a "name=nginx state=removed"

安装一个软件包组

[root@server ~]# ansible dbservers -i hosts -m yum -a "name='@Development tools' state=present"
4.5 systemd 模块

Centos6 之前的版本使用 service 模块。请使用 ansible-doc service 命令自行查看帮助信息。

管理远程节点上的 systemd 服务,就是由 systemd 所管理的服务。

常用参数:

  • daemon_reload 重新载入 systemd,扫描新的或有变动的单元
  • enabled 是否开机自启动 yes|no
  • name 必选项,服务名称 ,比如 httpd vsftpd
  • state 对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)

Example

重新加载 systemd

[root@server ~]# ansible dbservers -i hosts -m systemd -a "daemon_reload=yes"

启动 Nginx 服务

[root@server ~]# ansible dbservers -i hosts -m systemd -a "name=nginx state=started"

关闭 Nginx 服务

[root@server ~]# ansible dbservers -i hosts -m systemd -a "name=nginx state=stopped"

重启 Nginx 服务

[root@server ~]# ansible dbservers -i hosts -m systemd -a "name=nginx state=restarted"

重新加载 Nginx 服务

[root@server ~]# ansible dbservers -i hosts -m systemd -a "name=nginx state=reloaded"

将 Nginx 服务设置开机自启动

[root@server ~]# ansible dbservers -i hosts -m systemd -a "name=nginx enabled=yes"
4.6 group 模块

在被管理节点上,对组进行管理。

常用参数:

  • name 组名称, 必须的
  • system 是否为系统组, yes/no , 默认是 no
  • state 删除或这创建,present/absent ,默认是present

Example

创建普通组 db_admin

[root@server ~]# ansible dbservers -i hosts -m group -a "name=db_admin"

[root@client-1 yum.repos.d]# cat /etc/group
db_admin:x:1000:

删除普通组 db_admin

[root@server ~]# ansible dbservers -i hosts -m group -a "name=db_admin state=absent"
4.7 user 模块

用于在被管理节点上对用户进行管理。

常用参数:

  • name 必须的参数, 指定用户名
  • password 设置用户的密码,这里接受的是一个加密的值,因为会直接存到 shadow, 默认不设置密码
  • update_password 假如设置的密码不同于原密码,则会更新密码. 在 1.3 中被加入
  • home 指定用户的家目录
  • shell 设置用户的 shell
  • comment 用户的描述信息
  • create_home 在创建用户时,是否创建其家目录。默认创建,假如不创建,设置为 no。2.5版本之前使用 createhome
  • group 设置用户的主组
  • groups 将用户加入到多个其他组中,多个用逗号隔开。默认会把用户从其他已经加入的组中删除。
  • append yes|no 和 groups 配合使用,yes 时,不会把用户从其他已经加入的组中删除
  • system 设置为 yes 时,将会创建一个系统账号
  • expires 设置用户的过期时间,值为时间戳,会转为为天数后,放在 shadow 的第 8 个字段里
  • generate_ssh_key 设置为 yes 将会为用户生成密钥,这不会覆盖原来的密钥
  • ssh_key_type 指定用户的密钥类型, 默认 rsa, 具体的类型取决于被管理节点
  • state 删除或添加用户, present 为添加,absent 为删除;默认值 present
  • remove 当与 state=absent 一起使用,删除一个用户及关联的目录,比如家目录,邮箱目录。可选的值为: yes/no

Example

创建用户并设置密码

先生成加密密码

[root@server ~]# pass=$(echo "123456" | openssl passwd -1 -stdin)

执行 ansible 命令 创建用户 foo 并设置密码

[root@server ~]# ansible all -i hosts -m user -a "name=foo password=${pass}"

创建用户 shark, 并且为其创建密钥对,并且密钥类型为: ecdsa

[root@server ~]# ansible all -i hosts -m user -a "name=shark generate_ssh_key=yes ssh_key_type=ecdsa"

创建用户tom, 并且设置其有效期到 2020年8月17日, 加入到组 db_admin 中, 不改变用户原有加入的组。

[root@server ~]# ansible dbservers -i hosts -m user -a "name=tom expires=$(date +%s -d 20200817) groups=db_admin append=yes"
date 命令说明

// 计算 3 小时之后是几点几分
[root@server ~]# date +%T -d '3 hours'
00:38:41
// 任意日期的前 N 天,后 N 天的具体日期
[root@server ~]# date +%F -d "20200817 1 day"
2020-08-18
[root@server ~]# date +%F -d "20200817 -1 day"
2020-08-16

// 计算两个日期相差天数, 比如计算生日距离现在还有多少天
[root@server ~]# d1=$(date +%s -d 20200817)
[root@server ~]# d2=$(date +%s -d 20200815)
[root@server ~]# echo $(((d1-d2)/86400))
2
4. 8 file 模块

file 模块主要用于远程主机上的文件操作。

常用参数:

  • owner 定义文件/目录的属主
  • group 定义文件/目录的属组
  • mode 定义文件/目录的权限
  • path 必选项,定义文件/目录的路径
  • recurse 递归的设置文件的属性,只对目录有效
  • src 链接(软/硬)文件的源文件路径,只应用于state=link的情况
  • dest 链接文件的路径,只应用于state=link的情况
  • state
  • directory 如果目录不存在,创建目录
  • file 文件不存在,则不会被创建,存在则返回文件的信息,常用于检查文件是否存在。
  • link 创建软链接
  • hard 创建硬链接
  • touch 如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
  • absent 删除目录、文件或者取消链接文件

Example

// 创建一个文件
[root@server ~]# ansible all -i hosts -m file -a "path=/tmp/foo.conf state=touch"
// 改变文件所有者及权限
[root@server ~]# ansible all -i hosts -m file -a "path=/tmp/foo.conf owner=nobody group=nobody mode=0644"
// 创建一个软连接
[root@server ~]# ansible all -i hosts -m file -a "src=/tmp/foo.conf dest=/tmp/link.conf state=link"
// 创建一个目录
[root@server ~]# ansible all -i hosts -m file -a "path=/tmp/testdir state=directory"
// 取消一个连接
[root@server ~]# ansible all -i hosts -m file -a "path=/link.conf state=absent"
// 删除一个文件
[root@server ~]# ansible all -i hosts -m file -a "path=/tmp/foo.conf state=absent"
4.9 cron 模块

管理远程节点的CRON 服务。等同于Linux 中的 计划任务。

注意:使用 Ansible 创建的计划任务,是不能使用本地 crontab -e去编辑,否则 Ansible 无法再次操作此计划任务了。

常用参数:

  • name 指定一个cron job 的名字。一定要指定,便于日之后删除。
  • minute 指定分钟,可以设置成(0-59, *, */2 等)格式。 默认是 * , 也就是每分钟。
  • hour 指定小时,可以设置成(0-23, *, */2 等)格式。 默认是 * , 也就是每小时。
  • day 指定天, 可以设置成(1-31, *, */2 等)格式。 默认是 * , 也就是每天。
  • month 指定月份, 可以设置成(1-12, *, */2 等)格式。 默认是 * , 也就是每周。
  • weekday 指定星期, 可以设置成(0-6 for Sunday-Saturday, * 等)格式。默认是 *,也就是每星期。
  • job 指定要执行的内容,通常可以写个脚本,或者一段内容。
  • state 指定这个job的状态,可以是新增(present)或者是删除(absent)。 默认为新增(present)

Example

// 新建一个 CRON JOB 任务
[root@server ~]# ansible all -i hosts -m cron -a "name='creat new job' minute='0' job='ls -alh > /dev/null'"
// 删除一个 CRON JOB 任务,删除时,一定要正确指定job 的name参数,以免误删除。
[root@server ~]#  ansible all -i hosts -m cron -a "name='creat new job' state=absent"

登录任何一台管理机验证cron

[root@client-1 yum.repos.d]# crontab -l
#Ansible: creat new job
0 * * * * ls -alh > /dev/null
4.10 debug模块

debug 模块主要用于调试时使用,通常的作用是将一个变量的值给打印出来。

常用参数:

  • var 直接打印一个指定的变量值
  • msg 打印一段可以格式化的字符串

Example

这里引入了变量,我们只需了解 debug 模板的使用即可。

# ansible all -i hosts -m debug -a "var=role" -e "role=web"
# ansible all -i hosts -m debug -a "msg='role is {{role}} '" -e "role=web"
4.11 template 模块

template 模块使用了Jinjia2格式作为文件模版,可以进行文档内变量的替换。文件以 .j2 结尾。

常用参数:

  • src 指定 Ansible 控制端的 文件路径
  • dest 指定 Ansible 被控端的 文件路径
  • owner 指定文件的属主
  • group 指定文件的属组
  • mode 指定文件的权限
  • backup 创建一个包含时间戳信息的备份文件,这样如果您以某种方式错误地破坏了原始文件, 就可以将其恢复原状。yes/no

Example

用法其实和 copy 模块基本一样, template 模块的强大之处就是使用变量替换,就是可以把传递给 Ansible 的变量的值替换到模板文件中。

  1. 建立一个 template 文件, 名为 hello_world.j2
[root@server ~]# vim hello_world.j2
[root@server ~]# cat hello_world.j2 
Hello {{var}} !
  1. 执行命令,并且设置变量 var 的值为 world
# ansible all -i hosts -m template -a "src=hello_world.j2 dest=/tmp/hello_world.world" -e "var=world"
  1. 在被控主机上验证
[root@client-1 tmp]# cat hello_world.world 
Hello world !
4.12 lineinfile 模块

在被管理节点上,用正则匹配的方式对目标文件的一行内容修改删除等操作。

如果是在一个文件中把所有匹配到的多行都进行统一处理,请参考replace 模块。

如果想对一个文件进行一次性添加/更新/删除多行内容等操作,参考blockinfile模块

常用参数

  • path 被管理节点的目标文件路径, 必须。
  • state 可选值absent 删除 |present 替换(默认值)。
  • regexp 在文件的每一行中查找的正则表达式。
  • 对于 state=present ,仅找到的最后一行将被替换。
  • line 要在文件中插入/替换的行。需要state=present。
  • create 文件不存在时,是否要创建文件并添加内容。yes/no

Example

删除被控节点文件里的某一条内容

[root@server ~]# ansible dbservers -i hosts -m lineinfile -a "path=/etc/sudoers regexp='^%wheel' state=absent"

替换某一行

[root@server ~]# ansible dbservers -i hosts -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled' state=present"
4.13 blockinfile 模块

对目标文件进行多行的添加/更新/删除操作。

常用参数

  • path 目标文件路径
  • block 文件中被操作的块内容
  • state 块内容如何处理,absent 删除, present 添加/更新(默认值)

Example

向文件/etc/ssh/sshd_config的最后添加几行内容

//添加的内容是
Match User ansible-agent
PasswordAuthentication no

[root@server ~]# ansible dbservers -i hosts -m blockinfile -a "path=/etc/ssh/sshd_config block='Match User ansible-agent\nPasswordAuthentication no'"

//注意:\n 是换行符的意思。

更新之前的内容

[root@server ~]# ansible dbservers -i hosts -m blockinfile -a "path=/etc/ssh/sshd_config block='Match User ansible-agent\nPasswordAuthentication yes'"

删除文件中的连续出现几行内容

[root@server ~]# ansible dbservers -i hosts -m blockinfile -a "path=/etc/ssh/sshd_config block='Match User ansible-agent\nPasswordAuthentication yes' state=absent"
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值