Ansible (is Simple IT Automation) ,是一款自动化运维工具,基于强大的模块功能通过SSH协议推送到被管理端,可以实现的批量系统部署,批量程序部署,批量执行命令等
特性
- 不需要安装客户端,基于ssh连接管理
- 不需要配置服务,安装Ansible工具,可以执行命令就可以
- 拥有大量的模块
- 支持YAML语法
- 安装配置简单(门槛低)
- 被管理机器支持Windows
组成部分
- Ansible 核心
- Inventory Ansible管理主机的清单
- Modules 包括Ansible自带的核心模块和自定义模块
- Plugins 完成模块功能的补充,包括连接插件、邮件插件等
- Playbooks 编排文件,定义Ansible多任务配置文件,实现Ansible自动执行
安装ansible软件
需要主机有python环境,这个安装没啥说的,一键搞定,so easy!
配置管理主机清单
默认的主机清单文件是/etc/ansible/hosts
- 可以修改/etc/ansible/ansible.cfg文件中[defaults]下的#inventory参数来修改,
- 可以在执行命令时候使用-i参数来指定hosts文件
最简单的配置主机和组
配置成主机名的时候,要确保主机名可以被解析(hosts或dns)
1 2 3 4 5 6
| [web] vm01 vm02 [db] 192.168.6.100 192.168.6.101
|
自定义参数
ansible_ssh_user 用于指定管理远程主机的账号
ansible_ssh_pass 用于指定管理远程主机的密码
ansible_ssh_host 用于指定被管理的主机
ansible_ssh_port 用于指定ssh的端口
ansible_sudo_pass 用于sudo连接用户时的密码
ansible_sudo_exec 如果sudo命令不在默认路径,需要指定sudo命令路径
ansible_shell_type 目标系统的shell的类型,默认sh
ansible_ssh_private_key_file 指定key文件
1 2 3 4
| [webservers] 192.168.10.12 ansible_ssh_pass=123456 ansible_ssh_user=root 192.168.10.13 ansible_ssh_pass=123456 ansible_ssh_user=root ansible_ssh_port=3055 vm03 ansible_ssh_pass=123567 ansible_ssh_user=root
|
指定主机范围
01:20 表示192.168.6.1到192.168.6.20共20台主机
a:f 表示dba.islocal.cc 到dbf.islocal.cc共6台主机
1 2 3
| [db] 192.168.6.[01:20] db[a:f].islocal.cc
|
主机组嵌套,
使用children关键字
1 2 3 4 5 6 7 8 9 10
| [mfs:children] mfs_a mfs_b mfs_c [mfs_a] vm01 [mfs_b] vm02 [mfs_c] vm03
|
测试一下
1 2
| ansible mfs -m ping ansible mfs_c -m ping
|
调用匹配主机或主机组
匹配所有
all 或者 *
匹配组
直接写组名就ok
逻辑非
目标主机在nsxq组不在test组中,逻辑非使用!
1
| ansible nsxq:!test -m ping
|
逻辑与
目标主机在nsxq组并在test中,逻辑与使用&
1
| ansible nsxq:&test -m ping
|
支持正则匹配
匹配一web或者db开头.islocal.cc 的主机
1
| ansible ~(web|db).*\.islocal\.cc -m ping
|
设置主机互信,配置SSH免密码登录
由于ansible是基于ssh来远程管理,执行操作命令的,每次输入密码的话会很繁琐,配置ssh免密码就显得很方便
- -k 命令会提示输入密码
- 修改配置文件/etc/ansible/ansible.cfg
host_key_checking=False #当第一次连接远程主机时,会提示输入yes/no,跳过此环节
配置ssh免密码登录,可以参考我之前的另一篇文章**SSH免密码验证**
模块
查看模块
查看模块参数用法
1 2
| ansible-doc -s module ansible-doc help module
|
setup 模块
查看主机参数配置
ping 模块
测试主机连通性
file 模块
1 2 3 4 5
| [root@vm00 ~]# ansible nsxq -m file -a 'src=/etc/hosts dest=/tmp/hosts' [root@vm00 ~]# ansible nsxq -a 'ls -lh /tmp/hosts' [root@vm00 ~]# ansible nsxq -m file -"path=/tmp/file1 state=touch" [root@vm00 ~]# ansible nsxq -m file -a "dest=/tmp/hosts mode=600 owner=airmodel group=airmodel" [root@vm00 ~]# ansible nsxq -m file -a "dest=/opt/test mode=755 owner=airmodel group=airmodel state=directory"
|
copy模块
1
| ansible nsxq -m copy -a "src=/etc/hosts dest=/tmp/hosts"
|
command 模块【默认模块】
1 2
| ansible all -m command -a "/bin/echo 'hello,sir.'" ansible all -a 'chdir=/usr/local/src/ tar -cvzf test.tgz file'
|
shell 模块
和command一样;支持管道
raw 模块
和command一样
service 模块
1
| ansible nsxq -m service -a 'name=nginx state=started enabled=yes'
|
cron 模块
1 2
| ansible nsxq -m cron -a 'name="update ntp time" hour=2 user=root job="/usr/sbin/ntpdate cn.ntp.org.cn"' ansible nsxq -m cron -a 'name="update ntp time" state=absent'
|
filesystem 模块
yum 模块
1 2
| ansible nsxq -m yum a 'name=httpd state=installed' ansible nsxq -m yum a 'name="@Development Tools" state=present'
|
user 模块
1
| ansible nsxq -m user -a 'createhome=yes home=/home/user1 password="ffffff" name=user1 state=present shell=/bin/bash'
|
synchronize 模块
目录后边跟/表示同步目录下内容,不加/把目录同步过去
1
| ansible nsxq -m synchronize -a 'src=/etc/hosts dest=/opt/'
|
filesystem 模块
1
| ansible test -m filesystem -a 'dev=/disk.img fstype=ext4 opts=-F'
|
mount 模块
1
| ansible test -m mount -a 'fstype=ext4 name=/aaa src=/dev/loop0 state=mounted'
|