Ansible自动化运维工具

自动运维

运维自动化的演进:

  1. 没有专门的工具为我们做这些事情,使用脚本语言(Python,Shell)
  2. 逐渐有了运维自动化的一些工具,比如Fabric、Puppet、Chef、SaltStack、Ansible自动化运维平台

在这里插入图片描述

自动化运维的目标

  1. 组件故障无需人工干预自动修复
  2. 出现异常人工一键干预
  3. 监控运维故障自动恢复

Devops

DevOps 强调的是高效组织团队之间如何通过自动化的工具协作和沟通来完成软件的生命周期管理,从而更快、更频繁地交付更稳定的软件

在这里插入图片描述
DevOps是一组过程、方法与系统的统称,用于促进开发、技术运营和质量保障(QA)部门之间的沟通、协作与整合。
在这里插入图片描述
在这里插入图片描述

常见的自动化运维工具 Ansible、Puppet、SaltStack

Ansible、Puppet、SaltStack之间的区别

Puppet
基于Ruby开发,采用C/S架构,扩展性强,基于SSL认证
SaltStack
基于Python开发,采用C/S架构,相对于puppet更轻量级,配置语法采用YAML,使得配置脚本更为简单
Ansible
基于Python开发,分布式,无需客户端,轻量级,配置语言采用YAML

技术特性比较

在这里插入图片描述

Ansible、Puppet、SaltStack之间的优劣势

  1. 相对于puppet和saltstack,ansible无需客户端,更轻量级
  2. Ansible甚至都不用启动服务,仅仅只是一个工具,可以很轻松的实现分布式扩展
  3. 更强的远程命令执行操作
  4. 不输于puppet和saltstack的其他功能
    在这里插入图片描述

Ansible的特性

  1. 模块化:调用特定的模块,完成特定的任务
  2. Paramiko (Python对ssh的实现),PyYaml,Jinja2(模板语言)三个关键模块
  3. 支持自定义模块,可使用任何编程语言写模块
  4. 基于Python语言实现
  5. 部署简单,基于python和SSH(默认已安装),agentless,无需代理不依赖KPI(无需SSL)
    安全,基于OpenSSH
  6. 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
  7. 支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构
    较强大的多层解决方案role

Ansible安装及配置

yum安装: 
EPEL源 :yum -y install epel-release 
yum install ansible -y 

编译安装: 
yum -y install python-jinja2 PyYAML python-paramiko python-babel 
python-crypto 
tar xf ansible-1.5.4.tar.gz 
cd ansible-1.5.4 
python setup.py build 
python setup.py install 
mkdir /etc/ansible 
cp -r examples/* /etc/ansible 

Git方式: 
git clone git://github.com/ansible/ansible.git --recursive 
cd ./ansible 
source ./hacking/env-setup 

pip安装: 
pip是安装Python包的管理器,类似yum 
yum install python-pip python-devel 
yum install gcc glibc-devel zibl-devel rpm-bulid openssl-devel 
pip install --upgrade pip 
pip install ansible --upgrade 

Ansible相关文件

配置文件 
/etc/ansible/ansible.cfg		主配置文件,配置ansible工作特性(一般无需修改)
/etc/ansible/hosts		主机清单(将被管理的主机放到此文件) 
/etc/ansible/roles	存放角色的目录 

程序
/usr/bin/ansible 			主程序,临时命令执行工具
/usr/bin/ansible-doc 		查看配置文档,模块功能查看工具 
/usr/bin/ansible-galaxy 		下载/上传优秀代码或Roles模块的官网平台 
/usr/bin/ansible-playbook 	定制自动化任务,编排剧本工具 
/usr/bin/ansible-pull 		远程执行命令的工具 
/usr/bin/ansible-vault 		文件加密工具 
/usr/bin/ansible-console 	基于Console界面与用户交互的执行工具

在这里插入图片描述

Inventory 主机清单

  1. ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名
  2. 默认的inventory file为/etc/ansible/hosts
  3. inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成
    /etc/ansible/hosts文件格式
    nventory文件遵循INI文件风格,中括号中的字符为组名。
    可以将同一个主机同时归并到多个不同的组中;
    此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明

Ansibe相关命令

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

Ansible的Host-Pattern

在这里插入图片描述

Ansible执行过程

在这里插入图片描述

Ansible交互模式

2.0+新增,可交互执行命令,支持tab (了解) 
root@test (2)[f:10] $ 执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$ 
设置并发数: forks n 例如: forks 10 
切换组: cd 主机组 例如: cd web 
列出当前组主机列表: list 
列出所有的内置命令: ?或help 
示例: 
root@all (2)[f:5]$ list 
root@all (2)[f:5]$ cd appsrvs 
root@appsrvs (2)[f:5]$ list 
root@appsrvs (2)[f:5]$ yum name=httpd state=present 
root@appsrvs (2)[f:5]$ service name=httpd state=started 

Ansible模块

shell模块

Shell命令是通过/bin/sh进行执行的,command命令没有shell的环境变量,因此不支持特殊符号或变量的操作。Shell模块支持正则。

copy模块

#从ansible服务器主控端复制文件到远程主机
ansible all -m copy -a "src=/etc/fstab dest=/tmp/f”

#如果目标存在,默认覆盖,此处指定先备份
ansible srv -m copy -a “src=/root/test.sh dest=/tmp/test2.sh owner=wang mode=600 backup=yes”

#指定内容,直接生成目标文件
ansible websrvs -m copy -a “content=‘test line1\ntest lin2’ dest=/tmp/test.txt”

#复制/etc/下的文件,不包括/etc/目录本身
ansible srv -m copy -a “src=/etc/ dest=/backup”

fetch模块

#从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录
ansible srv -m fetch -a ‘src=/root/test1.sh dest=/data/scripts’

file模块

#功能:设置文件属性
#创建空文件
ansible srv -m file -a ‘path=/data/test.txt state=touch’
ansible srv -m file -a ‘path=/data/test.txt state=absent’
ansible srv -m file -a ‘path=/root/test.txt owner=linux mod=755#创建目录
ansible srv -m file -a ‘path=/data/mysql state=directory owner=mysql group=mysql’
#创建软链接
ansible srv -m file -a ‘src=/data/testfile dest=/data/testfile-link state=link’
#删除软链接
ansible srv -m file -a ‘src=/data/testfile dest=/data/testfile-link state=absent’

script模块

#在远程机器上执行本地脚本
ansible-doc -s script
# 执行本地的文件,管控机的文件
ansible db -m script -a "/root/a.sh"
# 判断被控机上的文件是否存在,如果不存在,就执行,如果存在,就跳过
ansible db -m script -a "creates=/root/a.sh /root/a.sh" 

service模块

#功能:实现远程管理服务的生命周期
#关键参数
enabled #开机启动 yes|no
name #服务名称,必选项
runlevel #运行级别
state  
    started
    stopped
    restarted
    reloaded
ansible web -m service -a "name=httpd state=started" #启动
ansible web -m service -a "name=nginx state=stopped" #关闭
ansible web -m service -a "name=keepalived enabled=yes" #设置开机自启动

yum模块

#enablerepo启用某个源
#name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径
State定义软件包状态
-present:安装
-absent:删除
-latest:安装最新的
示例:
#安装httpd
ansible all –m yum –a “name=httpd state=present”
ansible all –m yum –a “name=httpd state=latest”
#安装关联工具包
ansible all –m yum –a ‘name=“@Development tools” state=present’
#通过url进行安装
ansible all –m yum –a “name=http://nginx.org/packages/centos/6/noarch/RPMS/
nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present”

cron模块

功能:cron模块主要用于添加、删除、更新操作系统的crontab任务计划
name:任务计划名称
cron_file:替换客户端该用户的任务计划的文件
minute:分(0-59, * ,*/2)
hour:时(0-23, * ,*/2)
day:日(1-31, * ,*/2)
month:月(1-12, * , */2)
weekday:周(0-6或1-7, *)
job:任何计划执行的命令
backup:是否备份之前的任务计划
user:新建任务计划的用户
state:指定任务计划present、absent
#特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),
daily(每天),hourly(每小时)
# 添加时名字必须不同,不加名称为None(crontab -l查看计划任务)
ansible web -m cron -a "minute=12 name=touchfile job='touch /tmp/xiaoqiang.txt'"  # 创建
ansible web -m cron -a "name=touchfile state=absent"  # 删除
ansible web -m cron -a "minute=12 name=touchfile2 job='touch /tmp/jason.txt' disabled=yes"  # 注释
ansible web -m cron -a "name=None state=absent"  # 删除名称为空的计划任务

ansible test -m cron -a “name=‘check dirs’ hour=5,2 job=‘ls -alh’"  

user模块

# 关键参数
group # 属组
groups  # 附加组
home  # 设置家目录
name  # 用户名
remove  # 删除用户并删除用户的家目录
shell  # 用户登录后的shell
system  # 系统用户
uid  # 用户的id
state #创建或删除
shell #制定用户shell环境

#创建用户,并指定用户的shell,家目录,uid,以及附加组
ansible web -m user -a "name=alex10 shell=/sbin/nologin home=/opt/alex10 uid=3000 groups=root“
ansible web -m user -a "name=alex11 shell=/sbin/nologin home=/opt/alex11"
ansible web -m user -a "name=alex12 system=yes" #创建系统用户
(0是超级用户(root)的标识号,centos7是1~999由系统保留,作为管理账号,普通用户的标识号从500开始)
ansible web -m user -a "name=alex12 state=absent" #删除用户,单不删除家目录
ansible web -m user -a "name=alex11 state=absent remove=yes" # 删除用户并删除用户的家目录

group模块

# 关键参数
# 组id gid  
# 系统组 system  
# 名称 name  
ansible web -m group -a "name=jason10 system=yes gid=5000"  # 创建系统组
ansible web -m group -a "name=jason11"  # 创建普通的组
ansible web -m group -a "name=jason11 state=absent"  # 删除组

hostname模块

name:指定远端节点主机名称
ansible 192.168.0.99 -m shell -a 'hostname'

setup模块

setup 模块用于收集远程主机的一些基本信息。
filter参数:用于进行条件过滤。如果设置,仅返回匹配过滤条件的信息。

ansible websrvs -m setup
返回的信息非常多,很多情况我们并不需要全部的信息,可以通过过滤获得指定的信息。
ansible websrvs -m setup -a "filter=ansible_all_ipv4_addresses”
获取对应主机的内存信息
ansible websrvs -m setup -a "filter=ansible_memory_mb“
通过通配符实现模糊匹配,比如以”mb”关键字结尾的信息
ansible ansible-demo3 -m setup -a "filter=*mb"

排错

密钥问题,可实现免密连接

在这里插入图片描述
原因:
没有在ansible管理节点(即安装ansible的节点)上添加目标节点(即需要管理的节点)的ssh认证信息。
解决方法:

  1. 利用ssh-keygen命令生成秘密钥
  2. 添加目标节点的SSH认证信息,在管理节点执行如下命令
    ssh-copy-id root@目标节点IP
    在这里插入图片描述
    在这里插入图片描述

密码问题

若指定用户无法连接
在这里插入图片描述

指定用户密码连接
ansible all -m ping -u wang -k 
若还无法连接到目标服务器,可以利用passwd命令为指定用户配置密码
passwd user password
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值