Ansible 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 172.18.0.3,172.18.0.4 -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 modulename
查询某个模块的使用方法,比较简洁的信息
# ansible-doc -s modulename
Example
# ansible-doc yum
# ansible-doc -s yum
4、 常用模块
为了便于演示和操作,现在把之前的测试主机 IP 172.18.0.3 和 172.18.0.4 保存到 当前目录下的 hosts 文件中。
[root@qfedu.com ~]# cat hosts
[dbservers]
172.18.0.3
[webservers]
172.18.0.4
4.1 command & shell 模块
两个模块都是在远程服务器上去执行命令。
但command模块是ad-hoc的默认模块,在执行ad-hoc时,若不指定 模块的名字则默认使用此模块。
# ansible all -i hosts -a "echo 'hello'"
172.18.0.4 | CHANGED | rc=0 >>
hello
172.18.0.3 | CHANGED | rc=0 >>
hello
# ansible all -i hosts -m shell -a "echo 'hello'"
172.18.0.4 | CHANGED | rc=0 >>
hello
172.18.0.3 | CHANGED | rc=0 >>
hello
两个模块的差异
shell 模块可以执行SHELL 的内置命令和 特性(比如管道 符)。
command 模块无法执行SHELL 的内置命令和特性
Example
# ansible all -i hosts -m shell -a "echo
'hello'|grep -o 'e'"
172.18.0.3 | CHANGED | rc=0 >>
e
172.18.0.4 | CHANGED | rc=0 >>
e
# ansible all -i hosts -a "echo 'hello'|grep -o
'e'"
172.18.0.4 | CHANGED | rc=0 >>
hello|grep -o e
172.18.0.3 | CHANGED | rc=0 >>
hello|grep -o e
4.2 script 模块
将管理节点上的脚本传递到被管理节点(远程服务器)上进行执行。
Example
管理节点上的一个脚本
# cat /root/a.sh
touch /tmp/testfile
执行
[root@qfedu.com ~]# ansible webservers -i hosts -m
script -a "/root/a.sh"
172.18.0.4 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 172.18.0.4
closed.\r\n",
"stderr_lines": [
"Shared connection to 172.18.0.4 closed."
],
"stdout": "",
"stdout_lines": []
}
验证
[root@qfedu.com ~]# ansible webservers -i hosts -m
shell -a "ls -l /tmp/testfile"
172.18.0.4 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 0 Apr 12 07:17 /tmp/testfile
4.3 copy 模块
copy 模块的主要用于管理节点和被管理节点之间的文件拷贝。常用参数:
src 指定拷贝文件的源地址
dest 指定拷贝文件的目标地址
backup 拷贝文件前,若原目标文件发生了变化,则对目标文件进备份
woner 指定新拷贝文件的所有者
group 指定新拷贝文件的所有组
mode 指定新拷贝文件的权限
Example
copy 管理节点上的 nginx.repo 到被管理节点上
# 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/$r
eleasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
# ansible webservers -i hosts -m copy -a
"src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo"
copy 前, 在被管理节点上对原文件进行备份
# ansible all -i hosts -m copy -a "src=./nginx.repo
dest=/etc/yum.repos.d/nginx.repo backup=yes"
copy 文件的同时对文件进行用户及用户组设置
# ansible all -i hosts -m copy -a "src=./nginx.repo
dest=/etc/yum.repos.d/nginx.repo owner=nobody
group=nobody"
copy 文件的同时对文件进行权限设置
# 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 preset 确认添加仓库文件, absent 确认删除仓库文 件。
gpgcheck 是否检查 GPG yes|no, 没有默认值,使 用/etc/yum.conf 中的配置。
Example
添加 epel 源
[root@qfedu.com ~]# ansible dbservers -i hosts -m
yum_repository -a "name=epel
baseurl='https://download.fedoraproject.org/pub/epel/
$releasever/$basearch/' description='EPEL YUM repo'"
172.18.0.3 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python":
"/usr/bin/python"
},
"changed": true,
"repo": "epel",
"state": "present"
}
删除 epel 源
[root@qfedu.com ~]# ansible dbservers -i hosts -m
yum_repository -a "name=epel state=absent"
172.18.0.3 | 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
安装一个软件包
# 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"
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
# 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"
4.6 group 模块
在被管理节点上,对组进行管理。
常用参数:
name 组名称, 必须的
system 是否为系统组, yes/no , 默认是 no
state 删除或这创建,present/absent ,默认是present
Example
创建普通组 db_admin
# ansible dbservers -i hosts -m group -a
"name=db_admin"
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@qfedu.com ~]# 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))
4.8 file 模块
file 模块主要于远程主机上的⽂件操作。
常用参数:
owner 定义文件/目录的属主
group 定义文件/目录的属组
mode 定义文件/目录的权限
path 必选项,定义文件/目录的路径
recurse 递归的设置文件的属性,只对目录有效
src 链接(软/硬)文件的源⽂件路径,只应用于state=link的情况
dest 链接文件的路径,只应用于state=link的情况
state
directory 如果目录不存在,创建目录
file 文件不存在,则不会被创建,存在则返回文件的信 息,
常用于检查文件是否存在。
link 创建软链接
hard 创建硬链接
touch 如果文件不存在,则会创建一个新的文件,如 果文件或目录
已存在,则更新其最后修改时间
absent 删除目录、文件或者取消链接文件
Example
// 创建个文件
# 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"
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 任务
# 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
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
# cat hello_world.j2
Hello {{var}} !
2. 执行命令,并且设置变量 var 的值为 world
# ansible all -i hosts -m template -a
"src=hello_world.j2 dest=/tmp/hello_world.world" -e
"var=world"
3. 在被控主机上验证
# cat /tmp/hello_world.world
Hello world !
4.12 lineinfile 模块
在被管理节点上,用正则匹配的⽅式对⽬标⽂件的⼀⾏内容修改删 除等操作。
如果是在一个文件中把所有匹配到的多都进统一处理,请参 考replace 模块。
如果想对一个文件进行一次性添加/更新/删除多内容等操作,参 考blockinfile模块
常用参数
path 被管理节点的⽬标⽂件路径, 必须。
state 可选值absent 删除 |present 替换(默认值)。
regexp 在件的每中查找的正则表达式。
对于 state=present ,仅找到的最后将被替换。
line 要在件中插/替换的。需要state=present。
create 件不存在时,是否要创建件并添加内容。yes/no
Example
删除被控节点文件的某条内容
# 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"
4.13 blockinfile 模块
对目标文件进行多行的添加/更新/删除操作。
常用参数
path 目标文件路径
block 文件中被操作的块内容
state 块内容如何处理,absent 删除, present 添加/更新(默 认值)
Example
向文件/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'"
注意:\n 是换行符的意思
更新之前的内容
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"
需要免费资料可添加微信领取
本文作者