ansible服务及剧本编写
Posted banana童
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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免密码登录方式
利用非交互式工具实现批量分发公钥与批量管理服务器
1 sshpass -p123456 ssh-copy-id -i ~/.ssh/id_dsa.pub "-o StrictHostChecking=no 172.16.1.41" 2 sshpass -p123456 ssh -o StrictHostChecking=no root@172.16.1.41 "uptime" 3 sshpass -p123456 scp -o StrictHostChecking=no /etc/hosts root@172.16.1.41:~ 4 5 <- -p:指定ssh连接用户的密码 6 <- -o:StrictHostChecking=no 避免第一次登录出现公钥检查
2.3 ②受控端安装ansible相关管理软件
保留yum安装的软件
1 sed -i.bak \'s#keepcache=0#keepcache=1#g\' /etc/yum.conf 2 grep keepcache /etc/yum.conf
客户端配置
1 yum install libselinux-python -y
说明:由于初始我们关闭了selinux安全管理软件,故这里需要操作此步骤。不装这个软件只能关闭selinux,但是无论什么情况也不要开启,工作环境下视情况而定
2.4 ③管理端m01安装ansible软件
1 yum install ansible -y
2.4.1 查看版本信息
1 [root@m01 ~]# ansible --version 2 ansible 2.3.2.0 3 config file = /etc/ansible/ansible.cfg #告知ansible软件配置文静路径 4 configured module search path = Default w/o overrides 5 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 查看软件相关安装信息
1 [root@m01 ~]# rpm -ql ansible|egrep -v \'/usr/share/|/usr/lib\' 2 /etc/ansible 3 /etc/ansible/ansible.cfg #ansible配置文件 4 /etc/ansible/hosts #定义ansible可以管理的主机信息 5 /etc/ansible/roles #主要在自动化部署多台主机时应用 6 7 /usr/bin/ansible 8 /usr/bin/ansible-playbook #执行ansible剧本命令
2.4.3 软件安装目录信息
1 [root@m01 ~]# tree /etc/ansible/
2 /etc/ansible/
3 ├── ansible.cfg #ansible配置
4 ├── hosts #被ansible管理的主机名单(分组)
5 └── roles
2.5 ④配置/etc/ansible/hosts文件
编辑ansible的主机配置文件hosts,添加主机组banana
1 cp /etc/ansible/hosts{,.bak} 2 3 [root@m01 ~]# vim /etc/ansible/hosts #配置文件编写举例 4 [banana] #定义组名称 5 172.16.1.8 6 172.16.1.31 7 172.16.1.41 8 [root@m01 ~]# tail /etc/ansible/hosts
2.6 ⑤实践测试
1 [root@m01 ~]# ansible banana -m command -a "hostname" #-m指定命令的模块 -a指定参数(action) 2 172.16.1.31 | SUCCESS | rc=0 >> #主机IP|请求状态|返回值(0即成功,否则失败) 3 nfs01 #命令输出结果 4 5 172.16.1.8 | SUCCESS | rc=0 >> 6 web01 7 8 172.16.1.41 | SUCCESS | rc=0 >> 9 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模块
1 [root@m01 ~]# ansible banana -m ping 2 172.16.1.41 | SUCCESS => { 3 "changed": false, 4 "ping": "pong" 5 } 6 7 172.16.1.31 | SUCCESS => { 8 "changed": false, 9 "ping": "pong" 10 }
说明:ansible连接测试成功结果
1 ansible 172.16.1.8 -m ping 2 3 172.16.1.8 | UNREACHABLE! => { 4 "changed": false, 5 "msg": "Failed to connect to the host via ssh: Permission denied (publickey,password).\\r\\n", 6 "unreachable": true 7 }
说明:ansible连接测试不成功结果
模块概要:
a.ping是一个简单的测试模块,这个模块在成功连接时返回"pong"信息。在剧本中没有意义,但能够使用ansible命令验证登录能力和用于python的配置
b.这并不是传统的ICMP ping,而是先检查是否通过ssh登录节点,在检查python版本是否满足要求,能满足要求就返回pong
连接正常返回pong通过帮助信息可以获得: ansible-doc -v ping 可以获得该模块的说明 ansible-doc -s file 参看模块的具体信息
实例:
1 [root@m01 ~]# ansible-doc -v ping 2 Using /etc/ansible/ansible.cfg as config file 3 > PING (/usr/lib/python2.6/site-packages/ansible/modules/system/ping.py) 4 5 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.
1 [root@m01 ~]# ansible all -m command -a "date" 2 172.16.1.8 | SUCCESS | rc=0 >> 3 Thu Oct 19 17:12:27 CST 2017 4 5 172.16.1.31 | SUCCESS | rc=0 >> 6 Thu Oct 19 17:12:28 CST 2017 7 8 172.16.1.41 | SUCCESS | rc=0 >> 9 Thu Oct 19 17:12:27 CST 2017
实例02.
1 [root@m01 ~]# ansible banana -m command -a "chdir=/tmp pwd" 2 172.16.1.31 | SUCCESS | rc=0 >> 3 /tmp 4 5 172.16.1.8 | SUCCESS | rc=0 >> 6 /tmp 7 8 172.16.1.41 | SUCCESS | rc=0 >> 9 /tmp
实例03.
1 [root@m01 ~]# ansible banana -m command -a "pwd creates=/tmp/banana_file" 2 3 172.16.1.31 | SUCCESS | rc=0 >> 4 skipped, since /tmp/banana_file exists 5 6 172.16.1.8 | SUCCESS | rc=0 >> 7 /root 8 9 172.16.1.41 | SUCCESS | rc=0 >> 10 /root
模块概要:
a.命令模块中的多个参数设置用空格进行分割
b.命令模块中不能出现 "<", ">", "|", ";" and "&",如需使用这些功能,可用shell模块
提示:command模块作为默认模块,在-m不指定具体模块时,即采用默认模块command
4.3 debug模块
msg:设置打印自定义消息;如果忽略,则打印通用信息
1 [root@m01 ~]# ansible banana -m debug -a "msg=banana" 2 172.16.1.8 | SUCCESS => { 3 "msg": "banana" 4 } 5 6 172.16.1.31 | SUCCESS => { 7 "msg": "banana" 8 } 9 10 172.16.1.41 | SUCCESS => { 11 "msg": "banana" 12 }
模块概要:这个模块会打印语句在执行时,并且能够用于调试变量或表达式,可以不需要停止剧本;可以结合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
1 [root@m01 ~]# ansible banana -m copy -a "src=/etc/hosts dest=/tmp/ mode=0600 owner=banana group=banana " 2 3 172.16.1.8 | SUCCESS => { 4 "changed": true, 5 "checksum": "b3c1ab140a1265cd7f6de9175a962988d93c629b", 6 "dest": "/tmp/hosts", 7 "gid": 500, 8 "group": "banana", 9 "md5sum": "8c2b120b4742a806dcfdc8cfff6b6308", 10 "mode": "0600", 11 "owner": "banana", 12 "size": 357, 13 "src": "/root/.ansible/tmp/ansible-tmp-1508410846.63-224022812989166/source", 14 "state": "file", 15 "uid": 500 16 }
实例02.移动远程主机上的文件remote_src=true参数
1 [root@m01 ~]# ansible banana -m copy -a "remote_src=true src=/etc/hosts dest=/opt" 2 3 172.16.1.41 | SUCCESS => { 4 "changed": false, 5 "checksum": "545f587595b5c60d66243fca48e052ed34eed782", 6 "dest": "/opt/hosts", 7 "gid": 0, 8 "group": "root", 9 "md5sum": "fe08440ffebed54cab7a9b4cb3c3beda", 10 "mode": "0644", 11 "owner": "root", 12 "size": 371, 13 "src": "/etc/hosts", 14 "state": "file", 15 "uid": 0 16 }
实例03.定义文件中的内容content=bananaedu.com默认没有换行
1 [root@m01 ~]# ansible banana -m copy -a "content=bananaedu.com dest=/opt/banana.txt" 2 3 172.16.1.31 | SUCCESS => { 4 "changed": true, 5 "checksum": "291694840cd9f9c464263ea9b13421d8e74b7d00", 6 "dest": "/opt/banana.txt", 7 "gid": 500, 8 "group": "banana", 9 "md5sum": "0a6bb40847793839366d0ac014616d69", 10 "mode": "0600", 11 "owner": "banana", 12 "size": 13, 13 "src": "/root/.ansible/tmp/ansible-tmp-1508649097.07-180967115147583/source", 14 "state": "file", 15 "uid": 500 16 }
4.5 shell模块
注意:shell模块在远程执行脚本时,远程主机上一定要有相应的脚本
01.把脚本文件复制到远程服务器,执行远程服务器的脚本
1 [root@m01 ~]# ansible banana -m shell -a "/bin/sh /server/scripts/ssh-key.sh" 2 172.16.1.31 | SUCCESS | rc=0 >> 3 fenfa 172.16.1.31 [ OK ] 4 5 fenfa 172.16.1.41 [ OK ] 6 7 fenfa 172.16.1.8 [ OK ]
02.把/etc/hosts文件中的内容重定向到/banana.txt
1 [root@m01 ~]# ansible banana -m shell -a "cat /etc/hosts >/banana.txt" 2 3 172.16.1.41 | SUCCESS | rc=0 >> 4 5 172.16.1.8 | SUCCESS | rc=0 >> 6 7 172.16.1.31 | SUCCESS | rc=0 >>
说明:可支持command模块不能完成的特殊符号,同时汇总所有的模块
4.6 script模块
1 [root@m01 ~]# ansible banana -m script -a "/server/scripts/ip.sh" 2 3 172.16.1.8 | SUCCESS => { 4 "changed": true, 5 "rc": 0, 6 "stderr": "Shared connection to 172.16.1.8 closed.\\r\\n", 7 "stdout_lines": [ 8 "eth0 Link encap:Ethernet HWaddr 00:0C:29:4B:16:9D ", 9 " inet addr:10.0.0.8 Bcast:10.0.0.255 Mask:255.255.255.0", 10 " UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1", 11 " RX bytes:86527 (84.4 KiB) TX bytes:76532 (74.7 KiB)", 12 ] 13 }
提示:script模块与shell模块的区别
shell:需要将脚本文件都知道远端服务器,然后sh执行远端服务器的脚本
script:不需要将脚本文件复制到远端服务器,实质是将脚本执行过程在远端服务器上进行执行
4.7 file模块
参数 |
参数说明 |
|
owner |
设置复制传输后的数据属主信息 |
|
group |
设置复制传输后的数据属组信息 |
|
mode |
设置文件数据权限信息 |
|
dest |
要创建的文件或目录命令,以及路径信息 |
|
src |
指定要创建软链接的文件信息 |
|
state |
参数 |
参数说明 |
directory |
所有不存在的子目录将会被创建 |
|
file |
文件不存在将不能被创建 |
|
link |
符号链接(软链接)将被创建或更改 |
|
hard |
创建出硬链接 |
|
absent |
目录将被递归删除以及文件,链接被取消 注意:定义文件不存在不会失败,只是输出没有发生任何改变的结果 |
|
touch |
如果路径不存在将创建一个空文件,如果文件或目录存在将接收更新的文件访问和修改时间 |
实例01.创建远端目录
1 [root@m01 ~]# ansible banana -m file -a "dest=/tmp/banana_dir state=directory" 2 3 172.16.1.41 | SUCCESS => { 4 "changed": true, 5 "gid": 0, 6 "group": "root", 7 "mode": "0755", 8 "owner": "root", 9 "path": "/tmp/banana_dir", 10 "size": 4096, 11 "state": "directory", 12 "uid": 0 13 }
实例02.创建远端文件
1 [root@m01 ~]# ansible banana -m file -a "dest=/tmp/banana_file state=touch" 2 3 172.16.1.8 | SUCCESS => { 4 "changed": true, 5 "dest": "/tmp/banana_file", 6 "以上是关于ansible服务及剧本编写的主要内容,如果未能解决你的问题,请参考以下文章