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 192.168.244.188,192.168.244.198 -m copy -a "src=/tmp/a.conf dest=/tmp/a.conf"

意思是将192.168.244.188服务器主机中的/tmp/a.conf复制到192.168.244.198中,并且路径也是/tmp。

2.模块类型

Ansible 模块分三种类型: 核⼼模块(core module)、附加模块(extra module)及⽤户⾃定义模块(consume module)。
核⼼模块是由Ansible 的官⽅团队提供的。
附加模块是由各个社区提供的。例如: OPENSTACK 社区、DOCKER 社区等等。
当核⼼模块和附加模块都⽆法满⾜你的需求时,⽤户可以⾃定义模块。
默认情况下,在安装Ansible 的时候, 核⼼模块和附加模块都已经安装⽽⽆需⽤户⼲预。

3.联机帮助

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

常用帮助参数:

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

ansible-doc -l

Ansible之Ad-Hoc命令_第1张图片b.查询某个模块的使用方法

ansible-doc <modulename>

Ansible之Ad-Hoc命令_第2张图片
c.查询某个模块的使用方法,比较简洁的信息

ansible-doc -s <modulename>

Ansible之Ad-Hoc命令_第3张图片

4.常用模块

为了便于演示和操作,现在把之前的测试主机 IP 192.168.244.188和192.168.244.198保存到 当前⽬录下的 hosts ⽂件中。
Ansible之Ad-Hoc命令_第4张图片

a.command&shell模块

两个模块都是在远程服务器上去执⾏命令。
但command模块是ad-hoc的默认模块,在执⾏ad-hoc时,若不指定模块的名字则默认使⽤此模块。

ansible all -i hosts -a "echo 'hello'"

1.png

ansible all -i hosts -m shell -a "echo 'hello'"

1.png
两个模块的差异:

  • shell 模块可以执⾏SHELL 的内置命令和 特性(⽐如管道符)
  • command 模块⽆法执⾏SHELL 的内置命令和特性

例子:

ansible all -i hosts -m shell -a "echo 'hello'|grep -o 'e'"

1.png

ansible all -i hosts -a "echo 'hello'|grep -o 'e'"

1.png

b.script模块

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

cat /root/a.sh

Ansible之Ad-Hoc命令_第5张图片

ansible webservers -i hosts -m script -a "/root/a.sh"

Ansible之Ad-Hoc命令_第6张图片
验证–

ansible webservers -i hosts -m shell -a "ls -l /tmp/testfile"

1.png

c.copy模块

copy 模块的主要⽤于管理节点和被管理节点之间的⽂件拷⻉。
常用参数:

  • src 指定拷⻉⽂件的源地址
  • dest 指定拷⻉⽂件的⽬标地址
  • backup 拷⻉⽂件前,若原⽬标⽂件发⽣了变化,则对⽬标⽂件进⾏备份
  • woner 指定新拷⻉⽂件的所有者
  • group 指定新拷⻉⽂件的所有组
  • mode 指定新拷⻉⽂件的权限

例子:

cat /text/text.txt

Ansible之Ad-Hoc命令_第7张图片
copy管理节点上的/text/text.txt到被管理节点上:

ansible webservers -i hosts -m copy -a "src=/text/text.txt dest=/text/text.txt"

Ansible之Ad-Hoc命令_第8张图片
验证–

 ansible webservers -i hosts -m shell -a "ls -l /text/text.txt"

1.png
copy前在被管理节点上对原文件进行备份:

ansible webservers -i hosts -m copy -a "src=/text/text.txt dest=/text/text.txt backup=yes"

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

ansible webservers -i hosts -m copy -a "src=/text/text.txt dest=/text/text.txt owner=nobody group=nobody"

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

ansible webservers -i hosts -m copy -a "src=/text/text.txt dest=/text/text.txt mode=0755"
d.yum_repsitory模块

添加YUM仓库
常用参数:

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

例子–
添加epel源-

 ansible dbservers -i hosts -m yum_repository -a "name=epel baseurl='https://download.fedoraproject.org/pub/epel/ $releasever/$basearch/' description='EPEL YUM repo'"

Ansible之Ad-Hoc命令_第9张图片
删除epel源-

 ansible dbservers -i hosts -m yum_repository -a "name=epel state=absent"

Ansible之Ad-Hoc命令_第10张图片

e.yum模块

等同于 Linux 上的YUM 命令, 对远程服务器上RPM包进⾏管理。
**常⽤参数: **

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

例子–
安装一个软件包

ansible webservers -i hosts -m yum -a "name=nginx state=present"
ansible webservers -i hosts -m yum -a "name=nginx state=latest"
ansible webservers -i hosts -m yum -a "name=nginx state=installed"

卸载一个软件包

ansible webservers -i hosts -m yum -a "name=nginx state=absent"
ansible webservers -i hosts -m yum -a "name=nginx state=removed"

安装一个软件包组

ansible webservers -i hosts -m yum -a "name='@Development tools' state=present"
f.systemd模块

管理远程节点上的 systemd 服务,就是由 systemd 所管理的服务。
常⽤参数:

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

例子–
重新加载systemd-

 ansible webservers -i hosts -m systemd -a "daemon_reload=yes"

启动nginx服务-

ansible webservers -i hosts -m systemd -a "name=nginx state=started"

关闭nginx服务-

 ansible webservers -i hosts -m systemd -a "name=nginx state=stopped"

重启nginx服务-

ansible webservers -i hosts -m systemd -a "name=nginx state=restarted"

重新加载 Nginx 服务-

ansible webservers -i hosts -m systemd -a "name=nginx state=reloaded"

将 Nginx 服务设置开机⾃启动-

 ansible webservers -i hosts -m systemd -a "name=nginx enabled=yes"
g.group模块

在被管理节点上,对组进⾏管理。
_常⽤参数: _

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

例子–

ansible dbservers -i hosts -m group -a "name=db_admin"
h.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

例子–
创建用户并设置密码-
先生成加密密码:

pass=$(echo "123456" | openssl passwd -1 -stdin)

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

 ansible all -i hosts -m user -a "name=foo password=${pass}"

创建⽤户 yangge, 并且为其创建密钥对,并且密钥类型为: ecdsa:

ansible all -i hosts -m user -a "name=yangge generate_ssh_key=yes ssh_key_type=ecdsa"

创建⽤ tom, 并且设置其有效期到 2020年4⽉15⽇, 加⼊到组db_admin 中, 不改变⽤户原有假如的组:

ansible dbservers -i hosts -m user -a "name=tom expires=$(date +%s -d 20200415) gorups=db_admin append=yes"

date 命令说明–
计算 3 ⼩时之后是⼏点⼏分-

date +%T -d '3 hours'

任意⽇期的前 N 天,后 N 天的具体⽇期-

date +%F -d "20190910 1 day"
date +%F -d "20190910 -1 day"

计算两个⽇期相差天数, ⽐如计算⽣⽇距离现在还有多少天-

d1=$(date +%s -d 20180728)
d2=$(date +%s -d 20180726)
echo $(((d1-d2)/86400))
j.file模块

fifile 模块主要⽤于远程主机上的⽂件操作。
常⽤参数:

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

例子–
创建一个文件-

ansible all -i hosts -m file -a "path=/tmp/foo.conf state=touch"

改变文件所有者及权限-

ansible all -i hosts -m file -a "path=/tmp/foo.conf owner=nobody group=nobody mode=0644"

创建一个软链接-

 ansible all -i hosts -m file -a "src=/tmp/foo.conf dest=/tmp/link.conf state=link"

创建一个目录-

 ansible all -i hosts -m file -a "path=/tmp/testdir state=directory"

取消一个链接-

ansible all -i hosts -m file -a "path=/tmp/link.conf state=absent"

删除一个文件-

 ansible all -i hosts -m file -a "path=/tmp/foo.conf state=absent"
k.cron模块

管理远程节点的CRON 服务。等同于Linux 中的 计划任务。
**PS:**使⽤ 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)

例子–
新建一个CRON JOB任务-

 ansible all -i hosts -m cron -a "name='create new job' minute='0' job='ls -alh > /dev/null'"

删除⼀个 CRON JOB 任务,删除时,⼀定要正确指定job 的name参数,以免误删除-

 ansible all -i hosts -m cron -a "name='create new job' state=absent"

登录任何⼀台管理机验证cron-

crontab -l
Ansible: create new job
l.debug模块

debug 模块主要⽤于调试时使⽤,通常的作⽤是将⼀个变量的值给打印出来。
常⽤参数–

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

例子–
这⾥引⼊了变量,我们只需了解 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"
m.template 模块

template 模块使⽤了Jinjia2格式作为⽂件模版,可以进⾏⽂档内
变量的替换。⽂件以 .j2 结尾。
常⽤参数–

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

例子–
_ _ ⽤法其实和 copy 模块基本⼀样, template 模块的强⼤之处就是使⽤变量替换,就是可以把传递给 Ansible 的变量的值替换到模板⽂件中。
建立一个template文件,名为hello_world.j2

 cat hello_world.j2

image.png
执⾏命令,并且设置变量 var 的值为 world

 ansible all -i hosts -m template -a "src=hello_world.j2 dest=/text/hello_world.world" -e "var=world"

在被控主机上验证

cat /text/hello_world.world

Ansible之Ad-Hoc命令_第11张图片

n.** lineinfifile 模块**

在被管理节点上,⽤正则匹配的⽅式对⽬标⽂件的⼀⾏内容修改删除等操作。
如果是在⼀个⽂件中把所有匹配到的多⾏都进⾏统⼀处理,请参考replace 模块。
如果想对⼀个⽂件进⾏⼀次性添加/更新/删除多⾏内容等操作,参考blockinfifile模块
常⽤参数–

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

例子–
删除被控节点⽂件⾥的某⼀条内容-

ansible dbservers -i hosts -m lineinfile -a "path=/etc/sudoers regexp='^%wheel' state=absent"

替换某⼀⾏-

ansible dbservers -i hosts -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled' state=present"
o.blockinfifile 模块

对⽬标⽂件进⾏多⾏的添加/更新/删除操作
常⽤参数–

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

例子–
**_ _**向⽂件/etc/ssh/sshd_config的最后添加⼏⾏内容添加的内容是

Match User ansible-agent
PasswordAuthentication no
ansible dbservers -i hosts -m blockinfile -a "path=/etc/ssh/sshd_config block='Match User ansible-agent\nPasswordAuthentication no'"

更新之前的内容-

ansible dbservers -i hosts -m blockinfile -a "path=/etc/ssh/sshd_config block='Match User ansible-agent\nPasswordAuthentication yes'"

删除⽂件中的连续出现⼏⾏内容-

ansible dbservers -i hosts -m blockinfile -a "path=/etc/ssh/sshd_config block='Match User ansible-agent\nPasswordAuthentication yes' state=absent

你可能感兴趣的:(Ansible,ansible,运维,java)