Ansible ad-hoc
命令行语法格式
对Ansible进行远程管理的两个方法
ad-hoc临时命令,就是在命令行上执行管理命令
playbook剧本,把管理任务用特定格式写到文件中
无论哪种方式,都是通过模块加参数进行管理。通常使用ad-hoc命令行管理方式,来实现一些日常临时性的批量管理的任务。需要实现设置相对复杂,需要大量的操作任务,使用playbook剧本管理方式。
# ad-hoc命令行基本格式:ansible 主机集合 -m 模块名 -a "参数"
其中:
主机集合:指定管理主机的信息,可以是主机名、主机IP地址或者是all表示所有主机
模块名:指定功能模块名称
参数:应用模块功能中的哪些功能,标准参数定义
其他参数:-k 使用密码远程,远程主机SSH连接密码信息
代码示意如下:
[root@pubserver ~]# cd ~/ansible
[root@pubserver ansible]# ansible all --list-hosts #查看所有主机列表
hosts (3):
server1
server2
server3
#调用ping模块
[root@pubserver ansible]# ansible all -m ping #测试远程主机是否连通
通过ping模块测试到远程主机的连通性,检查是否可以管理远程主机。
ping结果为绿色的SUCCESS,则表示成功;是红色的UNREACHABLE,则检查网络是否可通,是否已经可以免密登陆。
常用模块
shell模块
在远程主机执行命令时,command模块为默认模块。
Shell模块功能同command功能类似,二者的区别在于:
command不支持bash的特性,如管道和重定向等功能,所有需要调用shell的功能都无法使用
# 查看进程数量
[root@localhost ansible]# ansible webservers -m shell -a "ps aux | wc -l"
server1 | CHANGED | rc=0 >>
144
server2 | CHANGED | rc=0 >>
144
scrpt模块
如遇到复杂的命令,script允许在Ansible主机中写好脚本在被管控主机端执行,编写的脚本可以不是shell脚本,如python、perl脚本等均可,脚本也可以没有执行权限。
# 编写脚本创建用户,并设置密码为:123456
[root@localhost ansible]# vim test.sh
#!/bin/bash
for user in user{1..5}
do
useradd $user
echo '123456' | passwd --stdin $user
done
[root@pubserver ansible]# ansible webservers -m script -a "test.sh"
file模块
Ansible使用file模块来创建文件、目录、链接,修改权限与设置文件的属性等操作。
幂等性,是指任意次执行所产生的影响均与一次执行的影响相同。file模块具有幂等性,Ansible中大多数的模块都具有幂等性。
file模块常用的选项:
path:指定文件路径
owner:设置文件所有者
group:设置文件所属组
state:状态。touch表示创建文件,directory表示创建目录,link表示创建软链接,absent表示删除
mode:设置权限
src:source的简写,指源
dest:destination的简写,指目标
[root@pubserver ansible]# ansible webservers -m file -a "path=/tmp/file.txt state=touch" #新建文件
[root@pubserver ansible]# ansible webservers -m file -a "path=/tmp/mydir state=directory" #创建目录
copy模块
Ansible使用copy模块将文件拷贝到远程管控主机上。
copy模块常用选项:
src:源,指控制端的文件路径
dest:目标,指被控制端的文件路径
content:内容,指需要写到文件中的内容
# 将家目录下面的test.sh文件复制给webserver组
[root@localhost ansible]# ansible webservers -m copy -a "src=./test.sh dest=/root"
fetch模块
fetch模块与copy类似,但是作用相反,是将远程管控主机的文件拷贝到Ansible主机,但不支持目录的拷贝。
fetch模块常用选项:
src:源,指被控制端的文件路径
dest:目标,指控制端的文件路径
# 将webserver组中的/etc/hostname文件都复制给本机
[root@localhost ansible]# ansible webservers -m fetch -a "src=/etc/hostname dest=~/"
lineinfile/replace模块
Ansible使用lineinfile模块替换单个文件中的一整行内容,如果进行多行关键字匹配的替换需要使用replace模块。
lineinfile模块常用选项:
path:待修改的文件路径
line:写入文件的一行内容
regexp:正则表达式,用于查找文件中的内容
replace模块常用选项:
path:待修改的文件路径
replace:将正则表达式查到的内容,替换成replace的内容
regexp:正则表达式,用于查找文件中的内容
# 在webserver的用户中的/root/test.txt 文件中追加 'hi sha bi'
[root@localhost ansible]# ansible webservers -m lineinfile -a "path=/root/test.txt line='hi sha bi'"
# 在webserver的用户中的/root/test.txt 文件中将'sha' 替换为 'si'
[root@localhost ansible]# ansible webservers -m replace -a "path=/root/test.txt regexp=sha replace=si"
user模块
Ansible使用user模块帮助管理远程管控主机的系统账户,如创建用户、修改用户、删除用户、为用户创建密钥对等操作。
user模块常用选项:
name:待创建的用户名
uid:用户ID
group:设置主组
groups:设置附加组
home:设置家目录
password:设置用户密码
state:设置状态。present表示创建,它是默认选项,absent表示删除
remove:删除家目录、邮箱等,值为yes或true都可以
# 创建用户zhansan
[root@localhost ansible]# ansible webservers -m user -a "name=zhansan"
# 创建用户lisi uid=2020 主组为:zhansan 附加组:sshd 家目录:/home/lisi 密码:123456
[root@localhost ansible]# ansible webservers -m user -a "name=lisi uid=2020 group=zhansan groups=sshd home=/home/lisi password={{'123456'|password_hash('sha512')}} state=present"
group模块
Ansible使用group模块帮助管理远程管控主机的系统组账户,如创建、删除组等操作。
group模块常用选项:
name:待创建的组名
gid:组的ID号
state:present表示创建,它是默认选项。absent表示删除
# 创建组devops
[root@localhost ansible]# ansible webservers -m group -a "name=devops"
# 删除组devops
[root@localhost ansible]# ansible webservers -m group -a "name=devops state=absent"