python ansible服务及剧本编写

第1章 ansible软件概念说明

python语言是运维人员必会的语言,而ansible是一个基于Python开发的自动化运维工具 (saltstack)。其功能实现基于SSH远程连接服务;ansible可以实现批量系统配置、批量软件部署、批量文件拷贝、批量运行命令等功能

ansible软件相关参考链接信息:

http://docs.ansible.com/ansible/intro_installation.html
http://www.ansible.com.cn/
http://docs.ansible.com/modules_by_category.html
http://www.ansible.cn/docs/

1.1 软件特点概述

01.不需要单独安装客户端(no agents),基于系统自带的sshd服务,sshd就相当于ansible的客户端

02.不需要服务端(no servers)

03.需要依靠大量的模块实现批量管理

04.配置文件/etc/ansible/ansible.cfg(无需配置)

1.2 企业级生产场景批量管理-自动化管理方案

01.最简单/最常用/最强大的选择是ssh key+shell/pssh方案,一般中小型企业会用(50-100台以下规模企业)

a.利用ssh key执行命令,并将命令放在脚本里面

b.利用ssh key执行命令,将命令放在脚本里面,并加上相应循环语句或判断语句

02.sina cfengine/puppet较早的批量管理工具(现在基本上没有企业用)

03.门户级别比较流行的,puppet批量管理工具(复杂/笨重)

04.saltstack批量管理工具;特点:简单,功能强大(配置复杂)---赶集网/小米/ CDN公司

批量管理路线:ssh key-->cfengine-->puppet-->saltstack/ansible

注意:使用ansible软件的前提是ssh key公钥分发完成

1.3 实现集群规模架构一键部署自动化-步骤说明

01.5台服务器先配置好(kickstart,cobbler无人值守安装),高级实现云计算(按需分配,动态调整)-openstack,kvm

02.linux基本优化,包括ssh服务(可以自动化实现)

03.创建密钥信息(自动化免交互创建)

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1

04.进行批量分发密钥(sshpass,expect自动化实现)

05.ansible软件安装(自动化实现)

06.网络服务自动化安装(ansible实现)

搭建yum仓库,定制rpm包

第2章 ansible软件实践部署

ansible软件部署安装需求

01. 需要有epel源

系统yum源(base epel--pip gem)

sshpass---epel

02. ssh+key免密码环境必须部署完成

2.1 ansible地址规划

服务器名称

网卡eth0

网卡eth1

用途说明

m01

10.0.0.61

172.16.1.61

批量管理服务器

nfs01

10.0.0.31

172.16.1.31

nfs共享存储服务器

backup

10.0.0.41

172.16.1.41

rsync备份服务器

web01

10.0.0.8

172.16.1.8

web服务器

说明:无特殊说明,子网掩码均为255.255.255.0,一个C类网段254台机器规模

2.2 ①部署ssh+key免密码登录方式

利用非交互式工具实现批量分发公钥与批量管理服务器

 sshpass -p123456 ssh-copy-id -i ~/.ssh/id_dsa.pub "-o StrictHostChecking=no 172.16.1.41"
 sshpass -p123456 ssh -o StrictHostChecking=no root@172.16.1.41 "uptime"
 sshpass -p123456 scp -o StrictHostChecking=no /etc/hosts root@172.16.1.41:~
 <- -p:指定ssh连接用户的密码
 <- -o:StrictHostChecking=no 避免第一次登录出现公钥检查

2.3 ②受控端安装ansible相关管理软件

保留yum安装的软件

sed -i.bak 's#keepcache=0#keepcache=1#g' /etc/yum.conf 2 grep keepcache /etc/yum.conf 

客户端配置

yum install libselinux-python -y

说明:由于初始我们关闭了selinux安全管理软件,故这里需要操作此步骤。不装这个软件只能关闭selinux,但是无论什么情况也不要开启,工作环境下视情况而定

2.4 ③管理端m01安装ansible软件

yum install ansible -y

2.4.1 查看版本信息

 [root@m01 ~]# ansible --version
 ansible 2.3.2.0
 config file = /etc/ansible/ansible.cfg #告知ansible软件配置文静路径
 configured module search path = Default w/o overrides
 python version = 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) [GCC 4.4.7 20120313 (Red Hat 4.4.7-17)]

2.4.2 查看软件相关安装信息

[root@m01 ~]# rpm -ql ansible|egrep -v '/usr/share/|/usr/lib'
/etc/ansible
/etc/ansible/ansible.cfg #ansible配置文件
/etc/ansible/hosts  #定义ansible可以管理的主机信息
/etc/ansible/roles  #主要在自动化部署多台主机时应用
/usr/bin/ansible
/usr/bin/ansible-playbook #执行ansible剧本命令

2.4.3 软件安装目录信息

[root@m01 ~]# tree /etc/ansible/
 /etc/ansible/
 ├── ansible.cfg #ansible配置
 ├── hosts #被ansible管理的主机名单(分组)
 └── roles 

2.5 ④配置/etc/ansible/hosts文件

编辑ansible的主机配置文件hosts,添加主机组banana

cp /etc/ansible/hosts{,.bak}
[root@m01 ~]# vim /etc/ansible/hosts #配置文件编写举例
[banana] #定义组名称
172.16.1.8
172.16.1.31
172.16.1.41
[root@m01 ~]# tail /etc/ansible/hosts

2.6 ⑤实践测试

[root@m01 ~]# ansible banana -m command -a "hostname" #-m指定命令的模块 -a指定参数(action)
172.16.1.31 | SUCCESS | rc=0 >> #主机IP|请求状态|返回值(0即成功,否则失败)
nfs01       #命令输出结果
172.16.1.8 | SUCCESS | rc=0 >>
web01
172.16.1.41 | SUCCESS | rc=0 >>
backup

2.6.1 ansible命令输出信息说明

输出内容为绿色,表示执行成功,仅查询但没有发生任何改变

输出内容为黄色,表示执行成功,但对受控主机产生了影响,发生了配置改变

输出内容为红色:表示执行失败!!!

第3章 ansible有关语法参数总结

3.1 语法格式图示

3.2 软件常用参数表

命令参数

参数说明

-m MODULE_NAME

相应名称的模块被执行(默认模块为command);

-m后面是模块的的名字

-a MODULE_ARGS

模块参数信息;

-a后面是要执行的命令,也可以写一个IP,针对一台机器来执行命令

-C,--check

不做任何改变;反而,只是尝试预言一些可能出现的改变

--syntax-check

执行语法检查在剧本上,但是并不执行剧本

第4章 ansible常用模块总结

常见模块

模块说明

command(重要模块)

执行命令模块,ansible命令执行默认模块

shell(重要模块)

执行shell脚本模块

script(重要模块)

把脚本发到客户端然后执行;执行脚本命令在远程服务器上

copy(重要模块)

把本地文件发送到远端

file

设定文件属性模块

service

系统服务管理模块

cron

计划任务管理模块

yum

yum软件包安装管理模块

synchronize

使用rsync同步文件模块

mount

挂载模块

ansible帮助信息系统中查看方法:ansible-doc -l        <-查看全部模块列表信息

ansible-doc -s [模块]   <-查看指定模块用法参数信息

4.1 ping模块

[root@m01 ~]# ansible banana -m ping
172.16.1.41 | SUCCESS => {
 "changed": false,
 "ping": "pong"
}
172.16.1.31 | SUCCESS => {
 "changed": false,
 "ping": "pong"
}

说明:ansible连接测试成功结果

ansible 172.16.1.8 -m ping
172.16.1.8 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,password).\r\n",
"unreachable": true
}

说明:ansible连接测试不成功结果

模块概要:

a.ping是一个简单的测试模块,这个模块在成功连接时返回"pong"信息。在剧本中没有意义,但能够使用ansible命令验证登录能力和用于python的配置

b.这并不是传统的ICMP ping,而是先检查是否通过ssh登录节点,在检查python版本是否满足要求,能满足要求就返回pong

连接正常返回pong通过帮助信息可以获得:
ansible-doc -v ping 可以获得该模块的说明
ansible-doc -s file 参看模块的具体信息

实例:

[root@m01 ~]# ansible-doc -v ping
 Using /etc/ansible/ansible.cfg as config file
 > PING (/usr/lib/python2.6/site-packages/ansible/modules/system/ping.py)
 A trivial test module, this module always returns `pong' on successful contact. It does not make sense in playbooks, but it is useful from `/usr/bin/ansible' to verify the ability to login and that a usable python is configured. This is NOT ICMP ping, this is just a trivial test module.

4.2 command模块

常见模块

模块说明

chdir

在执行命令之前,通过cd命令进入到指定目录中

ansible banana -m command -a "chdir=/tmp ls"

create

定义一个文件是否存在,如果不存在运行相应命令;如果存在跳过此步骤

executable

改变shell使用command进行执行,并且执行时要使用绝对路径

free_form

命令模块采用自由形式命令运行;即可以输入任意linux命令

removes

定义一个文件是否存在,如果存在运行相应命令;如果不存在跳过此步骤

warn

如果ansible配置文件中定义了命令警告,如果参数设置了no/false,将不会警告此行命令

实例01.

[root@m01 ~]# ansible all -m command -a "date"
172.16.1.8 | SUCCESS | rc=0 >>
Thu Oct 19 17:12:27 CST 2017
172.16.1.31 | SUCCESS | rc=0 >>
Thu Oct 19 17:12:28 CST 2017
172.16.1.41 | SUCCESS | rc=0 >>
Thu Oct 19 17:12:27 CST 2017

实例02.

[root@m01 ~]# ansible banana -m command -a "chdir=/tmp pwd"
172.16.1.31 | SUCCESS | rc=0 >>
/tmp
172.16.1.8 | SUCCESS | rc=0 >>
/tmp
172.16.1.41 | SUCCESS | rc=0 >>
/tmp

实例03.

[root@m01 ~]# ansible banana -m command -a "pwd creates=/tmp/banana_file"
172.16.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp/banana_file exists
172.16.1.8 | SUCCESS | rc=0 >>
/root
172.16.1.41 | SUCCESS | rc=0 >>
/root

模块概要:

a.命令模块中的多个参数设置用空格进行分割

b.命令模块中不能出现 "<", ">", "|", ";" and "&",如需使用这些功能,可用shell模块

提示:command模块作为默认模块,在-m不指定具体模块时,即采用默认模块command

4.3 debug模块

msg:设置打印自定义消息;如果忽略,则打印通用信息

[root@m01 ~]# ansible banana -m debug -a "msg=banana"
172.16.1.8 | SUCCESS => {
 "msg": "banana"
}
172.16.1.31 | SUCCESS => {
 "msg": "banana"
}
172.16.1.41 | SUCCESS => {
 "msg": "banana"
}

模块概要:这个模块会打印语句在执行时,并且能够用于调试变量或表达式,可以不需要停止剧本;可以结合when指令一起进行调试

4.4 copy模块

参数

参数说明

src

被复制到远程主机的本地文件。如果路径是一个目录,它将递归复制。如果路径使用"/"来结尾,则只复制目录里的内容,如果没有使用"/"来结尾,则包含目录在内的整个内容全部复制

remote_src

如果这个值设置为True,将到远程/目标主机的机器上搜索

dest

必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录

owner

设置复制传输后的数据属主信息

group

设置复制传输后的数据属组信息

mode

设置文件数据权限信息(注意4位)

backup

在覆盖远端服务器文件之前,将远端服务器源文件备份,备份文件包含时间信息。有两个选项:yes|no

content

用于替代"src”,可以直接设定指定文件的值

force

如果目标主机包含该文件,但内容不同。

如果设置为yes,则强制覆盖;如果为no,则只有当目标主机的目标位置不存在该文件时才复制,默认为yes

directory_mode

递归设定目录的权限,默认为系统默认权限

模块概要:

a.copy模块拷贝文件从本地或远程机器到远程机器的一个目录区域中;使用fetch模块来拷贝文件从远程区域到本地

b.如果需要复制文件中插入的变量值,可以使用template模块

说明:第一次执行时结果为黄色,即文件传输;第二次执行没有发生任何改变,即为绿

实例01. 使用copy 模块,将/etc/hosts文件传输到各个服务器送,权限修改为044,属主属组为banana

[root@m01 ~]# ansible banana -m copy -a "src=/etc/hosts dest=/tmp/ mode=0600 owner=banana group=banana "
172		

声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#nhooo.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。