批量部署工具Ansibale笔记

自动化运维

批量部署工具Ansibale笔记

QQ截图20180528203202

  Ansibale简介

    ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
    ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
    (1)、连接插件connection plugins:负责和被监控端实现通信;
    (2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
    (3)、各种模块核心模块、command模块、自定义模块;
    (4)、借助于插件完成记录日志邮件等功能;
    (5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

  Ansibale安装

    ansibale安装是基于EPEL源,需要联网下载很多插件及依赖包,因此,需要配置好EPEL源之后再执行:yum install ansible 。    确认安装: ansible –version

 

  相关文件了解

配置文件

/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 主机清单

ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名

默认的inventory file为/etc/ansible/hosts

inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成

inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中;此外,当如若目标主机使用了非默认 的SSH端口,还可以在主机名称之后使用冒号加端口号来标明

ntp.magedu.com

[webservers]

www1.magedu.com:2222

www2.magedu.com

[dbservers]

db1.magedu.com

db2.magedu.com

db3.magedu.com

如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机

示例:

[websrvs]

www[01:100].example.com

[dbsrvs]

db-[a:f].example.com

 

Ansible 配置文件/etc/ansible/ansible.cfg (一般保持默认)

[defaults]

#inventory = /etc/ansible/hosts # 主机列表配置文件

#library = /usr/share/my_modules/ # 库文件存放目录

#remote_tmp = $HOME/.ansible/tmp #临时py命令文件存放在远程主机目录

#local_tmp = $HOME/.ansible/tmp # 本机的临时命令执行目录

#forks = 5 # 默认并发数

#sudo_user = root # 默认sudo 用户

#ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码

#ask_pass = True

#remote_port = 22

#host_key_checking = False # 检查对应服务器的host_key,建议取消注释

#log_path=/var/log/ansible.log #日志文件

  ansible参数

ansible通过ssh实现配置管理、应用部署、任务执行等功能,建议配置ansible端能基于密钥认证的方式联系各被管理节点

ansible <host-pattern> [-m module_name] [-a args]

–version 显示版本

-m module 指定模块,默认为command

-v 详细过程 –vv -vvv更详细

–list-hosts 显示主机列表,可简写-list

-k, –ask-pass 提示连接密码,默认Key验证

-K, –ask-become-pass 提示输入sudo

-C, –check 检查,并不执行

-T, –timeout=TIMEOUT 执行命令的超时时间,默认10s

-u, –user=REMOTE_USER 执行远程执行的用户

-b, –become 代替旧版的sudo 切换

  ansible的Host-pattern

匹配主机的列表

All :表示所有Inventory中的所有主机

ansible all –m ping

* :通配符

ansible “*” -m ping

ansible 192.168.1.* -m ping

ansible “*srvs” -m ping

或关系

ansible “websrvs:appsrvs” -m ping

ansible “192.168.1.10:192.168.1.20” -m ping

ansible的Host-pattern

逻辑与

ansible “websrvs:&dbsrvs” –m ping

在websrvs组并且在dbsrvs组中的主机

逻辑非

ansible ‘websrvs:!dbsrvs’ –m ping

在websrvs组,但不在dbsrvs组中的主机

综合逻辑

ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ –m ping

正则表达式

ansible “websrvs:&dbsrvs” –m ping

ansible “~(web|db).*\.magedu\.com” –m ping

  ansible命令执行过程

ansible命令执行过程

1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg

2. 加载自己对应的模块文件,如command

3. 通过ansible将模块或命令生成对应的临时py文件,并将该 文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件

4. 给文件+x执行

5. 执行并返回结果

6. 删除临时py文件,sleep 0退出

执行状态:

绿色:执行成功并且不需要做改变的操作

黄色:执行成功并且对目标主机做变更

红色:执行失败

ansible使用示例

示例:

以wang用户执行ping存活检测

ansible all -m ping -u wang -k

以wang sudo至root执行ping存活检测

ansible all -m ping -u wang –b -k

以wang sudo至mage用户执行ping存活检测

ansible all -m ping -u wang –b -k –become-user mage

以wang sudo至root用户执行ls

ansible all -m command -u wang –become-user=root -a ‘ls /root’ -b –k

  ansible常用13个模块示例

Command:在远程主机执行命令,默认模块,可忽略-m选项

ansible srvs -m command -a ‘service vsftpd start’

ansible srvs -m command -a ‘echo magedu |passwd –stdin wang’ 不成功

此命令不支持 $VARNAME < > | ; & 等,用shell模块实现

Shell:和command相似,用shell执行命令

ansible srv -m shell -a ‘echo magedu |passwd –stdin wang’

调用bash执行命令 类似 cat /tmp/stanley.md | awk -F‘|’ ‘{print $1,$2}’ &>/tmp/example.txt 这些复杂命令,即使使用shell也可能会失败, 解决办法:写到脚本时,copy到远程,执行,再把需要的结果拉回执行命令的机器

Script:运行脚本

-a “/PATH/TO/SCRIPT_FILE“

snsible websrvs -m script -a f1.sh

Copy:从服务器复制文件到客户端,

ansible srv -m copy -a “src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600backup=yes”

如目标存在,默认覆盖,此处指定先备份

ansible srv -m copy -a “content=‘test content\n’ dest=/tmp/f1.txt” 利用内容,直接生成目标文件

Cron:计划任务

支持时间:minute,hour,day,month,weekday

ansible srv -m cron -a “minute=*/5 job=‘/usr/sbin/ntpdate 172.16.0.1 &>/dev/null’name=Synctime” 创建任务

ansible srv -m cron -a ‘state=absent name=Synctime’ 删除任务

ansible srv -m cron -a ‘disabled=true  job=‘/usr/sbin/ntpdate 172.16.0.1 &>/dev/null’ name=Synctime’禁用任务

Fetch:从客户端取文件至服务器端,copy相反,目录可先tar

ansible srv -m fetch -a ‘src=/root/a.sh dest=/data/scripts’

File:设置文件属性

ansible srv -m file -a “path=/root/a.sh owner=wang mode=755“

ansible web -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link’

Hostname:管理主机名

ansible node1 -m hostname -a “name=websrv”

Yum:管理包

ansible srv -m yum -a ‘name=httpd state=latest’ 安装

ansible srv -m yum -a ‘name=httpd state=absent’ 删除

Service:管理服务

ansible srv -m service -a ‘name=httpd state=stopped’

ansible srv -m service -a ‘name=httpd state=started’

ansible srv –m service –a ‘name=httpd state=reloaded’

ansible srv -m service -a ‘name=httpd state=restarted’

User:管理用户

ansible srv -m user -a ‘name=user1 comment=“test user” uid=2048 home=/app/user1 group=root‘

ansible srv -m user -a ‘name=sysuser1 system=yes home=/app/sysuser1 ’

ansible srv -m user -a ‘name=user1 state=absent remove=yes‘

删除用户及家目录等数据

Group:管理组

ansible srv -m group -a “name=testgroup system=yes“

ansible srv -m group -a “name=testgroup state=absent”

  ansible系列命令

ansible-galaxy

连接 https://galaxy.ansible.com 下载相应的roles

列出所有已安装的galaxy

ansible-galaxy list

安装galaxy

ansible-galaxy install geerlingguy.redis

删除galaxy

ansible-galaxy remove geerlingguy.redis

ansible-pull

推送命令至远程,效率无限提升,对运维要求较高

Ansible-playbook

ansible-playbook hello.yml   //执行剧本

cat hello.yml

#hello world yml file

–  hosts: websrvs

remote_user: root

tasks:

–  name: hello world

command: /usr/bin/wall hello world

  Ansible-vault

功能:管理加密解密yml文件

ansible-vault [create|decrypt|edit|encrypt|rekey|view]

ansible-vault encrypt hello.yml 加密

ansible-vault decrypt hello.yml 解密

ansible-vault view hello.yml 查看

ansible-vault edit hello.yml 编辑加密文件

ansible-vault rekey hello.yml 修改口令

ansible-vault create new.yml 创建新文件

Ansible-console: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的主机一般称为主控端,中控,master或堡垒机

主控端Python版本需要2.6或以上

被控端Python版本小于2.4需要安装python-simplejson

被控端如开启SELinux需要安装libselinux-python

windows不能做为主控端

理论知识再多,不如我们动手实践。下面我带自己飞一圈儿,来继续感受ansible的强大!!!!!

  实践准备

由于ansible是一种强大的批量部署软件,所以当我们在实践中需要管理几十台上百台的主机的时候,往往不能因为每台被控设备的用户密码而严重影响了管理的效率,所以,在此建议大家用一台主控机将眼前的几十台上百台主机实现基于key的验证,这样我们就可以通过主控机hosts来实现对被控集群安全又高效的管理

基于key验证方法:在主控机上创建一个存有所有被控机的ip的文件ip.txt,然后执行ssh-keygen命令一直回车,这时主控机的密钥对已经生成,接下来我们执行下面的脚本将公钥发往所有的被控机:

#!/bin/bash

rpm  -q  expect  &> /dev/null  ||  yum  install  expect  -y

password=admin123

while  read  ipaddr ; do

expect  <<-EOF

set  timeout  10

spawn  ssh-copy-id  $ipaddr

expect  {

“yes/no” {  send “yes\n”;exp_continue  }

“password” {  send “$password\n”  }

}

expect  eof

EOF

done < ip.txt

注意:脚本中的password变量定义为所有被控主机的密码,密码不是这个的修改为真正的密码。因此,我们要把所有的被控主机的密码设置成一样的。这个就不多说了,简单脚本就可以实现。

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/99669

发表评论

登录后才能评论

This site uses Akismet to reduce spam. Learn how your comment data is processed.

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班