Ansbile使用
1.ansbile命令格式
ansible 目标主机 [-f N] [-m module_name] [-a args]
- -f N:每次向N个主机发送指令
- -m 模块名:指定使用的模块名称,默认是command模块
- -a 参数: 指明模块专用参数;args一般为key=value格式
补充知识:
- 指定目标主机的时候,可以用all表示
- all表示的是主机清单中的全部主机和主机组
Ansbile模块使用
命令模块
command模块
简介:
**模块类型:**命令模块
适合使用简单的命令 无法支持"<",">","|",";","&"等符号
链接: Ansible官方文档.
案例:在每个被管理主机上执行df -h命令
[root@localhost ~]# ansible all -m command -a "df -h"
11.11.11.12 | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root 18G 1.2G 16G 8% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 485M 33M 427M 8% /boot
补充知识点
- 因为command是默认模块,因此可以省略
- 不指定模块,默认就是command模块
[root@localhost ~]# ansible all -a "df -h"
11.11.11.12 | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root 18G 1.2G 16G 8% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 485M 33M 427M 8% /boot
shell模块
简介:
**模块类型:**命令模块
shell模块可以执行带参数和变量的命令,支持"<",">","|",";","&"等符号
官方文档:https://docs.ansible.com/ansible/latest/modules/shell_module.html#shell-module
链接: 官方文档.
[root@localhost ~]# ansible all -m shell -a "useradd tom"
11.11.11.12 | CHANGED | rc=0 >>
[root@localhost ~]# ansible all -m shell -a "echo 123 | passwd --stdin tom"
11.11.11.12 | CHANGED | rc=0 >>
更改用户 tom 的密码 。
passwd: 所有的身份验证令牌已经成功更新。
用户模块
user模块
简介:
**模块类型:**用户模块
远程批量创建用户信息
链接: Ansible官方文档
- 功能:管理用户
- 格式:-m user -a "选项"
- password:指定用户的密码
- name:指定用户名
- groups:指定用户的属组
- createhome:是否创建家目录 yes|no
- system:是否为系统用户
- remove:当state=absent时,remove=yes则表示连同家目录一起删除
- state:是创建还是删除
案例:在所有被管理节点创建用户jerry,密码设为123
[root@localhost ~]# ansible all -m user -a "name=jerry password=123"
11.11.11.12 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"comment": "",
"create_home": true,
"group": 502,
"home": "/home/jerry",
"name": "jerry",
"password": "NOT_LOGGING_PASSWORD",
"shell": "/bin/bash",
"state": "present",
"system": false,
"uid": 502
}
[root@localhost ~]# ansible all -m shell -a "tail -n1 /etc/passwd"
11.11.11.12 | CHANGED | rc=0 >>
jerry:x:502:502::/home/jerry:/bin/bash
案例:在所有被管理节点删除用户jerry
[root@localhost ~]# ansible all -m user -a 'name="jerry" state="absent"'
11.11.11.12 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"force": false,
"name": "jerry",
"remove": false,
"state": "absent"
}
文件模块
scipt模块
简介:
**模块类型:**文件模块
传输后在远程节点上运行本地脚本
链接: Ansible官方文档
- 格式:-m script -a “脚本”
案例:在被管理节点的/home、/tmp、/root分别创建一个文件,文件名 时间.txt
[root@localhost ~]# cat my.sh
#!/bin/bash
for dir in /home /tmp /root
do
touch $dir/`date +%F-%T`.txt
done
[root@localhost ~]# chmod +x my.sh
[root@localhost ~]# ansible all -m script -a "/root/my.sh"
copy模块
简介:
**模块类型:**文件模块
复制文件和目录到远程主机
链接: Ansible官方文档
- 格式:-m copy -a"选项"
- 选项:
- src:源文件或源目录
- dest:指定目标主机的目录
- mode:指定将文件复制过去后,将权限修改为多少
- force:是否强制覆盖同名文件,yes/no
扩展知识:
changed返回值=true为执行成功
changed返回值=false为执行失败
案例:将/root/a.txt分发到所有被管理节点的/home下,复制后,将权限改为700
[root@localhost ~]# ansible all -m copy -a "src=/root/a.txt dest=/home mode=700"
11.11.11.12 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/home/a.txt",
"gid": 0,
"group": "root",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"mode": "0700",
"owner": "root",
"secontext": "unconfined_u:object_r:user_home_dir_t:s0",
"size": 0,
"src": "/root/.ansible/tmp/ansible-tmp-1592012167.29-116089-216151990404143/source",
"state": "file",
"uid": 0
}
故障案例:在使用copy模块报错:
[root@localhost ~]# ansible all -m copy -a "src=/root/a.txt dest=/home mode=700"
11.11.11.12 | FAILED! => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"
}
-
原因:被管理节点没有安装libselinux-python
-
解决方法:在所有被管理节点安装libselinux-python
[root@localhost ~]# ansible all -m shell -a "yum install -y libselinux-python"
file模块
简介:
**模块类型:**文件模块
创建空文件、拷贝、移动、删除、创建连接
链接: Ansible官方文档
- 格式:-m file -a “选项”
- 选项:
- name:文件名
- src:源文件
- path:指定目标路径
- mode:相当于执行chmod
- force:是否强制覆盖同名文件,yes/no
- state:表示文件的类型
- link:表示软链接文件
- hard:表示硬链接文件
- directory:表示目录
- touch:创建空文件
- absent:删除文件
案例:在每个被管理主机的tmp下创建空文件abc.txt
方法1
[root@localhost ~]# ansible all -m file -a "name=/tmp/abc.txt state=touch"
方法2
[root@localhost ~]# ansible all -m file -a "path=/tmp/abc.txt state=touch"
案例:在每个被管理主机的tmp下创建空文件abc.txt,创建软链接soft.txt
[root@localhost ~]# ansible all -m file -a "src=/tmp/abc.txt path=/tmp/soft.txt state=link"
unarchive模块
简介:
**模块类型:**文件模块
将压缩包解压到指定的位置下
链接: Ansible官方文档
- 格式:-m unarchive -a “选项”
- 选项
- src:指定本地的压缩吧
- dest:指定将压缩包解压到目标主机的哪个路径
案例:将nginx的源码包解压到被管理节点的home下
[root@localhost ~]# ansible all -m unarchive -a "src=/root/nginx-1.16.1.tar.gz dest=/home/"
安装模块
yum模块
简介:
**模块类型:**安装模块
使用yum软件包管理器安装,升级,降级,删除和列出软件包和组。
链接: Ansible官方文档
- 作用:安装、卸载软件
- 格式:-m yum -a “选项”
- 选项
- name:指定软件名称
- state:设置安装、卸载
- present:安装
- absent:卸载
案例:在所有被管理节点安装httpd
[root@localhost ~]# ansible all -m yum -a "name=httpd state=present
[root@localhost ~]# ansible all -m shell -a "rpm -q httpd"
管理服务模块
service模块
简介:
**模块类型:**管理服务模块
控制远程主机上的服务。支持的init系统包括BSD init,OpenRC,SysV,Solaris SMF,systemd和upstart。
链接: Ansible官方文档
- 格式:-m service -a “选项”
- 选项:
- name:指定服务名
- state:设置服务状态
- started启动服务
- stopped停止服务
- restarted重启服务
- reloaded重载服务
- enabled设置服务开机自动启动
- runlevel设置服务的运行级别
案例:在所有被管理主机上安装apache
[root@localhost ~]# ansible all -m yum -a "name=httpd state=present"
案例:启动所有被管理主机上的httpd服务,并设置为开机自动启动
[root@localhost ~]# ansible all -m service -a "name=httpd state=started enabled=on"
systemd模块
简介:
**模块类型:**管理服务模块
centos7管理服务的方法,和service类似
链接: Ansible官方文档
- 格式:-m systemd -a “选项”
- 选项:
- name:指定服务名
- state:设置服务状态
- started启动服务
- stopped停止服务
- restarted重启服务
- reloaded重载服务
- enabled设置服务开机自动启动
- runlevel设置服务的运行级别
定时任务模块
cron模块
简介:
**模块类型:**定时任务模块
周期完成特定的工作
链接: Ansible官方文档
-
格式:-m cron -a “选项”
-
选项
- minute:以分钟为单位来执行
- state:添加或是删除计划任务
- present:添加计划任务
- abent:删除计划任务
- special_time:在特殊时间节点执行
- reboot重启的时候执行
- daily每天执行一次
案例:每隔2分钟在/tmp/a.txt中写入一行数据
[root@localhost ~]# ansible all -m cron -a "name=mycron state=present job='echo 123>>/tmp/a.txt' minute=*/2"