目录
一、Ansible概述
Ansible可以同时管理Redhat系的Linux,Debian系的Linux,以及Windows主机。
管理节点只在执行脚本时与远程主机连接,没有特别的同步机制,所以断电等异常一般不会影响ansbile。
(1)Ansible模块
ansible是新出现的自动化运维工具
基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
模块主要包括:
-
连接插件connection plugins:负责和被监控端实现通信;
-
host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
-
各种模块核心模块、command模块、自定义模块;
-
借助于插件完成记录日志邮件等功能;
-
playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
ansible的架构:连接其他主机默认使用ssh协议
二、Ansible操作详解
(1)安装及查询版本
'优先安装epel源'
yum -y install epel-release
'安装ansible'
yum -y install ansible
'查看ansible版本'
ansible --version
'要使用的话需要ssh建立连接'
ssh-keygen -t rsa
ssh-copy-id root@...
(2)配置文件
'主配置文件'
/etc/ansible/ansible.cfg
'主机清单'
/etc/ansible/hosts
'存放角色目录'
/etc/ansible/roles/
(3)主配置文件详解
inventory = /etc/ansible/hosts '存放主机清单文件'
forks = 5 '并发执行数量'
poll_interval = 15 '回频率或轮询间隔时间,单位s'
sudo_user = root '远程主机sudo到什么用户,默认为root'
ask_sudo_pass = True 'sudo时是否需要输入密码'
ask_pass = True 'Ansible 剧本playbook 是否会自动弹出密码.默认为no'
transport = smart
remote_port = 22 '远程主机端口号'
module_lang = C '模块和系统之间通信的语言'
module_set_locale = False
roles_path = /etc/ansible/roles '使用playbook搜索Ansible roles'
host_key_checking = False '不检测主机密钥,第一次连接远程主机不需要输入yes'
timeout = 10 'SSH超时时间'
remote_user = root '使用/usr/bin/ansible-playbook链接的默认用户名,默认使用当前用户名称'
log_path = /var/log/ansible.log '日志文件存放路径'
executable = /bin/sh '执行的shell环境,用户shell模块'
jinja2_extensions = jinja2.ext.do,jinja2.ext.i18 '允许开启jinja2扩展模块'
private_key_file = /path/to/file '私钥文件存储位置'
system_warnings = True '禁用系统运行Ansible潜在问题警告'
deprecation_warnings = True 'PlayBook输出禁用“不建议使用”警告'
nocolor = 1 '输出带上颜色区别,0表示开启,1表示关闭'
pipelining = False '开启pipe SSH通道优化'
(4)主机清单格式
[web] '表示web组,下面的主机均属于该组'
192.168.1.2
192.168.1.3
[server]
192.168.1.[4:10] '[4:10]表示连续的主机,包含4和10'
[webserver]
192.168.90.10:22 '默认为22端口,如果不是,需指定'
(5)可执行文件
/usr/bin/ansible '主程序'
/usr/bin/ansible-doc '查看文档'
/usr/bin/ansible-galaxy '连接https://galaxy.ansible.com/下载相应的roles'
/usr/bin/ansible-playbook '调用playbook剧本'
/usr/bin/ansible-vault '文件加密工具'
(6)执行状态
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败
(7)批量配置管理
a.常用模块
> ansible-doc模块和ping模块
> ansible-doc相当于shell的man帮助命令,很重要
ansible-doc -l '列出所有模块'
ansible-doc 模块名 '查看模块帮助文档'
ansible all -m ping '批量测试连通性'
command模块
> 默认模块,远程执行命令
> 该模块通过-a跟上要执行的命令可以直接执行,若命令中有如下字符则执行不成功:“<”、">"、"|"、"&"
> 该模块不启动shell直接在ssh进程中执行,所有使用到shell的命令执行都会失败
ansible web -m command -a 'ls'
ansible web -m command -a 'top'
ansible web -m command -a 'pwd'
shell和raw模块
> shell模块基本用法和command一样,区别是shell模块是通过/bin/sh进行执行命令,可以执行任意命令
> raw模块,用法和shell模块一样,可以执行任意命令,区别是raw没有chdir、creates、removes参数
ansible web -m command -a 'chdir=/tmp touch f1'
ansible web -m shell -a 'chdir=/tmp touch f2'
ansible web -m raw -a 'chdir=/tmp touch f3' '执行出错'
script模块
> 命令比较复杂时,可以通过编写脚本,然后使用script模块批量执行
脚本示例:
所有主机上创建li4用户并设置密码123456,但是存在z3就不进行创建
vim useradd.sh //创建脚本
id z3
if [ $? != 0 ];then
useradd li4
echo 123456 | passwd --stdin li4
fi
ansible all -m script -a './useradd.sh' //批量执行脚本
copy模块
> 复制文件到远程主机
> -src 复制本地文件到远程主机,路径为目录时会递归复制,路径以“/”结尾,只复制目录里的内容,若不以“/”结尾,则复制包含目录在内的整个内容
mkdir -p /tmp/liu/xx/
vim /tmp/liu/xx/resolv.conf
'复制本地文件/tmp/liu/xx/resolv.conf至所有主机的/tmp目录下'
ansible all -m copy -a 'src=/tmp/liu/xx/resolv.conf dest=/tmp'
'复制本地目录tmp/liu及其子文件至所有主机的/tmp目录下'
ansible all -m copy -a 'src=/tmp/liu dest=/tmp'
yum模块和service模块
> 使用yum模块来管理软件包
> 使用service模块对管理服务的启动、停止、重启和重新加载等操作
'给db组主机批量安装mariadb-server相同配置'
ansible db -m yum -a 'state=installed name=mariadb-server'
'给db组批量安装最新的apache'
ansible db -m yum -a 'state=latest name=httpd'
'db组批量卸载apache'
ansible db -m yum -a 'state=absent name=httpd'
'启动mariadb.sevice并设置开机自启'
ansible db -m service -a 'state=started name=mariadb.service enable=yes'
lineinfile模块和replace模块
> 类似于sed的一种行编辑替换模块
> -path 目的文件
> -regexp 正则表达式进行匹配co
> -line 替换后结果
> -replace 替换后的字符串
'匹配后修改对应行'
ansible cache -m lineinfile -a 'path=/etc/sysconfig/network-scripts/ifcfg-eth0 regexp="^GATEWAY" line="GATEWAY=192.168.1.1"'
'匹配后修改对应字符串'
ansible cache -m replace -a 'path=/etc/sysconfig/network-scripts/ifcfg-eth0 regexp="\.1\.1" replace=".1.254"'
user模块
> user模块是请求三条指令,useradd,userdel,usermod
'模块信息'
ansible-doc -s user
'创建用户'
ansible all -m user -a 'name=test01'
'查看用户账户信息'
ansible all -m 'command' -a 'tail /etc/passwd'
'移除指令'
ansible all -m user -a 'name="test01" state=absent'
cron模块
> 两种状态(state):present表示添加(可以省略),absent表示移除
'查看cron模块信息'
ansible-doc -s cron
'webserver:分类 -m指定模块 -a输出模块内的指令 分钟:每分钟,工作:输出hello,工作名称:test'
ansible webserver -m cron -a 'minute="*/1" job="/usr/bin/echo holle" name="test"'
'查看计划性任务命令'
ansible webserver -a 'crontab -l'
'移除计划性任务'
ansible webserver -m cron -a 'name="test" state=absent'
group模块
> group模块请求的是groupadd、groupdel、groupmod模块
'查看模块信息'
ansible-doc -s group
'system=yes 创建系统组'
ansible mysql -m group -a 'name=mysql gid=1111 system=yes'
'查看组账户信息'
ansible mysql -a 'tail /etc/group'
'创建用户并加入组'
ansible mysql -m user -a 'name=test02 uid=1234 group=mysql system=yes'
'查看用户test02的用户id和组id信息'
ansible mysql -a 'id test02'