- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章python ansible服务及剧本编写由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
第1章 ansible软件概念说明 。
python语言是运维人员必会的语言,而ansible是一个基于Python开发的自动化运维工具 (saltstack)。其功能实现基于SSH远程连接服务;ansible可以实现批量系统配置、批量软件部署、批量文件拷贝、批量运行命令等功能 。
ansible软件相关参考链接信息:
1
2
3
4
|
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.创建密钥信息(自动化免交互创建) 。
1
|
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
2
3
4
5
|
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安装的软件 。
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
2
3
4
5
|
[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 查看软件相关安装信息 。
1
2
3
4
5
6
7
|
[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 软件安装目录信息 。
1
2
3
4
5
|
[root@m01 ~]
# tree /etc/ansible/
/
etc
/
ansible
/
├── ansible.cfg
#ansible配置
├── hosts
#被ansible管理的主机名单(分组)
└── roles
|
2.5 ④配置/etc/ansible/hosts文件 。
编辑ansible的主机配置文件hosts,添加主机组banana 。
1
2
3
4
5
6
7
|
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 ⑤实践测试 。
1
2
3
4
5
6
7
|
[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模块 。
1
2
3
4
5
6
7
8
9
|
[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连接测试成功结果 。
1
2
3
4
5
6
|
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 。
1
2
3
|
连接正常返回pong通过帮助信息可以获得:
ansible
-
doc
-
v ping 可以获得该模块的说明
ansible
-
doc
-
s
file
参看模块的具体信息
|
实例:
1
2
3
4
|
[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. 。
1
2
3
4
5
6
7
|
[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. 。
1
2
3
4
5
6
7
|
[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. 。
1
2
3
4
5
6
7
|
[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:设置打印自定义消息;如果忽略,则打印通用信息 。
1
2
3
4
5
6
7
8
9
10
|
[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 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@m01 ~]
# ansible banana -m copy -a "src=/etc/hosts dest=/tmp/ mode=0600 owner=banana group=banana "
172.16
.
1.8
| SUCCESS
=
> {
"changed"
: true,
"checksum"
:
"b3c1ab140a1265cd7f6de9175a962988d93c629b"
,
"dest"
:
"/tmp/hosts"
,
"gid"
:
500
,
"group"
:
"banana"
,
"md5sum"
:
"8c2b120b4742a806dcfdc8cfff6b6308"
,
"mode"
:
"0600"
,
"owner"
:
"banana"
,
"size"
:
357
,
"src"
:
"/root/.ansible/tmp/ansible-tmp-1508410846.63-224022812989166/source"
,
"state"
:
"file"
,
"uid"
:
500
}
|
实例02.移动远程主机上的文件remote_src=true参数 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[root@m01 ~]
# ansible banana -m copy -a "remote_src=true src=/etc/hosts dest=/opt"
172.16
.
1.41
| SUCCESS
=
> {
"changed"
: false,
"checksum"
:
"545f587595b5c60d66243fca48e052ed34eed782"
,
"dest"
:
"/opt/hosts"
,
"gid"
:
0
,
"group"
:
"root"
,
"md5sum"
:
"fe08440ffebed54cab7a9b4cb3c3beda"
,
"mode"
:
"0644"
,
"owner"
:
"root"
,
"size"
:
371
,
"src"
:
"/etc/hosts"
,
"state"
:
"file"
,
"uid"
:
0
}
|
实例03.定义文件中的内容content=bananaedu.com默认没有换行 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[root@m01 ~]
# ansible banana -m copy -a "content=bananaedu.com dest=/opt/banana.txt"
172.16
.
1.31
| SUCCESS
=
> {
"changed"
: true,
"checksum"
:
"291694840cd9f9c464263ea9b13421d8e74b7d00"
,
"dest"
:
"/opt/banana.txt"
,
"gid"
:
500
,
"group"
:
"banana"
,
"md5sum"
:
"0a6bb40847793839366d0ac014616d69"
,
"mode"
:
"0600"
,
"owner"
:
"banana"
,
"size"
:
13
,
"src"
:
"/root/.ansible/tmp/ansible-tmp-1508649097.07-180967115147583/source"
,
"state"
:
"file"
,
"uid"
:
500
}
|
4.5 shell模块 。
注意:shell模块在远程执行脚本时,远程主机上一定要有相应的脚本 。
01.把脚本文件复制到远程服务器,执行远程服务器的脚本 。
1
2
3
4
5
|
[root@m01 ~]
# ansible banana -m shell -a "/bin/sh /server/scripts/ssh-key.sh"
172.16
.
1.31
| SUCCESS | rc
=
0
>>
fenfa
172.16
.
1.31
[ OK ]
fenfa
172.16
.
1.41
[ OK ]
fenfa
172.16
.
1.8
[ OK ]
|
02.把/etc/hosts文件中的内容重定向到/banana.txt 。
1
2
3
4
|
[root@m01 ~]
# ansible banana -m shell -a "cat /etc/hosts >/banana.txt"
172.16
.
1.41
| SUCCESS | rc
=
0
>>
172.16
.
1.8
| SUCCESS | rc
=
0
>>
172.16
.
1.31
| SUCCESS | rc
=
0
>>
|
说明:可支持command模块不能完成的特殊符号,同时汇总所有的模块 。
4.6 script模块 。
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@m01 ~]
# ansible banana -m script -a "/server/scripts/ip.sh"
172.16
.
1.8
| SUCCESS
=
> {
"changed"
: true,
"rc"
:
0
,
"stderr"
:
"Shared connection to 172.16.1.8 closed.\r\n"
,
"stdout_lines"
: [
"eth0 Link encap:Ethernet HWaddr 00:0C:29:4B:16:9D "
,
" inet addr:10.0.0.8 Bcast:10.0.0.255 Mask:255.255.255.0"
,
" UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1"
,
" RX bytes:86527 (84.4 KiB) TX bytes:76532 (74.7 KiB)"
,
]
}
|
提示:script模块与shell模块的区别 。
shell:需要将脚本文件都知道远端服务器,然后sh执行远端服务器的脚本 。
script:不需要将脚本文件复制到远端服务器,实质是将脚本执行过程在远端服务器上进行执行 。
4.7 file模块 。
。
参数 。 |
参数说明 。 |
|
owner 。 |
设置复制传输后的数据属主信息 。 |
|
group 。 |
设置复制传输后的数据属组信息 。 |
|
mode 。 |
设置文件数据权限信息 。 |
|
dest 。 |
要创建的文件或目录命令,以及路径信息 。 |
|
src 。 |
指定要创建软链接的文件信息 。 |
|
state 。 |
参数 。 |
参数说明 。 |
directory 。 |
所有不存在的子目录将会被创建 。 |
|
file 。 |
文件不存在将不能被创建 。 |
|
link 。 |
符号链接(软链接)将被创建或更改 。 |
|
hard 。 |
创建出硬链接 。 |
|
absent 。 |
目录将被递归删除以及文件,链接被取消 。 注意:定义文件不存在不会失败,只是输出没有发生任何改变的结果 。 |
|
touch 。 |
如果路径不存在将创建一个空文件,如果文件或目录存在将接收更新的文件访问和修改时间 。 |
实例01.创建远端目录 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@m01 ~]
# ansible banana -m file -a "dest=/tmp/banana_dir state=directory"
172.16
.
1.41
| SUCCESS
=
> {
"changed"
: true,
"gid"
:
0
,
"group"
:
"root"
,
"mode"
:
"0755"
,
"owner"
:
"root"
,
"path"
:
"/tmp/banana_dir"
,
"size"
:
4096
,
"state"
:
"directory"
,
"uid"
:
0
}
|
实例02.创建远端文件 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@m01 ~]
# ansible banana -m file -a "dest=/tmp/banana_file state=touch"
172.16
.
1.8
| SUCCESS
=
> {
"changed"
: true,
"dest"
:
"/tmp/banana_file"
,
"gid"
:
0
,
"group"
:
"root"
,
"mode"
:
"0644"
,
"owner"
:
"root"
,
"size"
:
0
,
"state"
:
"file"
,
"uid"
:
0
}
|
4.8 yum模块 。
。
参数 。 |
参数说明 。 |
name=name 。 |
指定安装的软件 。 |
state=installed 。 |
安装 。 |
1
2
3
4
5
6
7
8
9
|
[root@m01 ~]
# ansible banana -m yum -a "name=nmap state=installed"
172.16
.
1.41
| SUCCESS
=
> {
"changed"
: false,
"msg"
: "",
"rc"
:
0
,
"results"
: [
"nmap-2:5.51-6.el6.x86_64 providing nmap is already installed"
]
}
|
提示:这里的state状态均为过去式ed/d 。
4.9 service模块 。
。
参数 。 |
参数说明 。 |
name=service name 。 |
服务的名称 。 |
state=参数 。 |
停止服务 服务状态信息为过去时 。 stared/stoped/restarted/reloaded 。 |
enabled=yes 。 |
设置开机自启动 。 |
1
2
3
4
5
6
7
|
[root@m01 ~]
# ansible banana -m service -a "name=crond state=restarted"
172.16
.
1.8
| SUCCESS
=
> {
"changed"
: true,
"name"
:
"crond"
,
"state"
:
"started"
}
|
说明:此时name即服务名,表示将名为crond的服务停止,并且取消开机自启动 。
4.10 cron模块 。
实例01.创建定时任务 。
1
2
3
4
5
6
7
8
9
10
|
[root@m01 ~]
# ansible banana -m cron -a "name=01 minute=*/5 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'" #name识别定时任务唯一性的标识,但只管理ansible信息
172.16
.
1.41
| SUCCESS
=
> {
"changed"
: true,
"envs"
: [],
"jobs"
: [
"None"
,
"banana666"
]
}
|
实例02.删除定时任务 。
1
2
3
4
5
6
7
8
|
[root@m01 ~]
# ansible banana -m cron -a "name=None minute=*/5 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1' state=absent"
172.16
.
1.41
| SUCCESS
=
> {
"changed"
: true,
"envs"
: [],
"jobs"
: [
"banana666"
]
}
|
实例03.查看定时任务 。
1
2
3
4
5
6
7
|
[root@m01 ~]
# ansible banana -m shell -a "crontab -l"
172.16
.
1.8
| SUCCESS | rc
=
0
>>
#time sync by banana at 2017-10-1
#web_backup by rsync
#*/5 * * * * /bin/sh /server/scripts/web_backup.sh &>/dev/null
#Ansible: banana666
#00 00 * * * /bin/sh /server/scripts/ip.sh &>/dev/null
|
4.11 fetch模块 。
。
参数 。 |
参数说明 。 |
dest 。 |
将远程主机拉取过来的文件保存在本地的路径信息 。 |
src 。 |
指定从远程主机要拉取的文件信息,只能拉取文件 。 |
flat 。 |
默认设置为no,如果设置为yes,将不显示172.16.1.8/etc/信息 。 |
实例01.从远程主机拉取文件 。
1
2
3
4
5
6
7
8
9
|
[root@m01 ~]
# ansible banana -m fetch -a "dest=/tmp src=/etc/hosts"
172.16
.
1.8
| SUCCESS
=
> {
"changed"
: true,
"checksum"
:
"bd9a0f82db17051a305f6a5974fa1fd95ead73d5"
,
"dest"
:
"/tmp/172.16.1.8/etc/hosts"
,
"md5sum"
:
"27b1ddf7c360698b439627b057f77d51"
,
"remote_checksum"
:
"bd9a0f82db17051a305f6a5974fa1fd95ead73d5"
,
"remote_md5sum"
: null
}
|
实例02.拉取时不创建目录(同名文件会覆盖) 。
1
2
3
4
5
6
7
8
9
10
|
[root@m01 ~]
# ansible banana -m fetch -a "dest=/tmp/ src=/etc/hosts flat=yes"
172.16
.
1.41
| SUCCESS
=
> {
"changed"
: true,
"checksum"
:
"bcb7c85bad6008ede9e73d18ae0bb78f2b11f612"
,
"dest"
:
"/tmp/hosts"
,
"md5sum"
:
"211bd00bf9ba8a735db1c7953d7cebc4"
,
"remote_checksum"
:
"bcb7c85bad6008ede9e73d18ae0bb78f2b11f612"
,
"remote_md5sum"
: null
}
|
4.12 mount模块 。
。
参数 。 |
参数说明 。 |
fstype 。 |
指定挂载文件类型;-t nfs == fstype=nfs 。 |
opts 。 |
设定挂载的参数选项信息;-o ro == opts=ro 。 |
path 。 |
指定挂载点 path=/mnt 。 |
src 。 |
要被挂载的目录设备信息 src=172.16.1.31:/data/w 。 |
state 。 |
01.如果为mountd 。 在fstab文件中的设备将被激活挂载和适当配置 。 02.如果为unmounted 。 设备将被卸载并不会改变fstab文件信息,absent和present只处理fstab,但不影响目前的挂载 。 |
实例01.挂载 。
1
2
3
4
5
6
7
8
9
10
11
|
[root@m01 ~]
#ansible banana -m mount -a “fstype=nfs opts=ro src=172.16.1.31:/data path=/mnt state=mounted”
172.16
.
1.41
| SUCCESS
=
> {
"changed"
: true,
"dump"
:
"0"
,
"fstab"
:
"/etc/fstab"
,
"fstype"
:
"nfs"
,
"name"
:
"/mnt"
,
"opts"
:
"ro"
,
"passno"
:
"0"
,
"src"
:
"172.16.1.31:/data/w"
}
|
实例02.卸载 。
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@m01 tmp]
# ansible banana -m mount -a "fstype=nfs opts=ro src=172.16.1.31:/data path=/mnt state=unmounted"
172.16
.
1.8
| SUCCESS
=
> {
"changed"
: false,
"dump"
:
"0"
,
"fstab"
:
"/etc/fstab"
,
"fstype"
:
"nfs"
,
"name"
:
"/mnt"
,
"opts"
:
"ro"
,
"passno"
:
"0"
,
"src"
:
"172.16.1.31:/data"
}
|
第5章 ansible剧本编写 。
5.1 ansible基础知识部分补充 。
5.1.1 ansible软件特点 。
01.可以实现批量管理 。
02.可以实现批量部署 。
03.ad-hoc(批量执行命令)---针对临时性的操作 。
ansible banana -m command -a "hostname" <-批量执行命令举例 。
04.编写剧本-脚本(playbook)---针对重复性的操作 。
5.1.2 ansible核心功能 。
01.pyYAML <-用于ansible编写剧本所使用的语言格式(saltstack---python) 。
02.paramiko <-远程连接与数据传输 。
03.Jinja2 <-用于编写ansible的模板信息 。
5.2 ansible剧本编写规则说明 。
①规则一:缩进/空格 。
yaml使用一个固定的缩进风格表示数据层结构关系,Saltstack需要每个缩进级别由两个空格组成,一定不能使用tab键 。
注意:编写ansible-playbook文件,一定忘记有tab键 。
②规则二:冒号 。
CMD="echo" 。
yaml
mykey
注意:每个冒号前后一定要有空格(以冒号结尾不需要空格,表示文件路径的模板不需要空格) 。
③规则三:短横线 。
想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一个列表的一部分 。
核心规则:有效的利用空格进行剧本的编写,剧本编写是不支持tab的 。
5.3 剧本编写环境准备 。
。
外网IP 。 |
内网IP 。 |
主机名 。 |
10.0.0.8 。 |
172.16.1.8 。 |
web01 。 |
10.0.0.31 。 |
172.16.1.31 。 |
nfs01 。 |
10.0.0.41 。 |
172.16.1.41 。 |
backup 。 |
10.0.0.61 。 |
172.16.1.61 。 |
m01 。 |
5.4 剧本书写格式 。
1
2
3
4
5
6
|
剧本的开头,可以不写
-
hosts:
all
#处理所有服务器,找到所有服务器; -(空)hosts:(空)all
tasks:
#剧本所要干的事情; -(空)(空)task:
-
command: echo hello banana linux.
(空)(空)(空)(空)
-
(空)模块名称:(空)模块中对应的功能
ansible
all
-
m command
-
a
"echo hello banana linux"
|
剧本编写内容扩展:剧本任务定义名称 。
1
2
3
4
5
|
-
hosts:
172.16
.
1.7
#处理指定服务器 -(空)hosts:(空)all
task:
#剧本所要干的事情; -(空)(空)task:
-
name:
command: echo hello banana linux.
(空)(空)(空)(空)
-
(空)模块名称:(空)模块中对应的功能
|
5.4.1 剧本格式示例 。
1
2
3
4
5
6
|
[root@m01 ansible
-
playbook]
# vim rsync_sever.yml
-
hosts:
172.16
.
1.41
tasks:
-
name: install rsync
yum: name
=
rsync state
=
installed
|
5.5 剧本编写后检查方法 。
1
2
|
ansible
-
playbook
-
-
syntax
-
check
01.yml
进行剧本配置信息语法检查
ansible
-
playbook
-
C
01.yml
模拟剧本执行(彩排)
|
5.5.1 语法检查 。
。
1
2
|
[root@m01 ansible
-
playbook]
# ansible-playbook --syntax-check 01.yml
playbook:
01.yml
|
5.5.2 模拟剧本执行 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[root@m01 ansible
-
playbook]
# ansible-playbook -C 01.yml
PLAY [
all
]
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
TASK [Gathering Facts]
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
ok: [
172.16
.
1.41
]
ok: [
172.16
.
1.8
]
ok: [
172.16
.
1.31
]
TASK [cron]
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
ok: [
172.16
.
1.8
]
ok: [
172.16
.
1.41
]
ok: [
172.16
.
1.31
]
PLAY RECAP
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
172.16
.
1.31
: ok
=
2
changed
=
0
unreachable
=
0
failed
=
0
172.16
.
1.41
: ok
=
2
changed
=
0
unreachable
=
0
failed
=
0
172.16
.
1.8
: ok
=
2
changed
=
0
unreachable
=
0
failed
=
0
|
5.6 剧本示例 。
5.6.1 剧本编写内容扩展:剧本任务编写多个任务 。
1
2
3
4
5
6
|
-
hosts:
all
tasks:
-
name: restart
-
network
cron: name
=
'restart network'
minute
=
00
hour
=
00
job
=
'/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'
-
name: sync time
cron: name
=
'sync time'
minute
=
*
/
5
job
=
"/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"
|
5.6.2 剧本编写内容扩展:剧本任务编写多个主机 。
1
2
3
4
5
6
7
8
9
10
|
-
hosts:
172.16
.
1.7
tasks:
-
name: restart
-
network
cron: name
=
'restart network'
minute
=
00
hour
=
00
job
=
'/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'
-
name: sync time
cron: name
=
'sync time'
minute
=
*
/
5
job
=
"/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"
-
hosts:
172.16
.
1.31
tasks:
-
name: show ip addr to
file
shell: echo $(hostname
-
i) >>
/
tmp
/
ip.txt
|
5.7 剧本编写方式 。
01.多主机单任务编写方式 。
02.多主机多任务编写方式 。
03.不同主机多任务编写方式 。
第6章 ansible编写剧本排错思路 。
6.1 剧本排错方法 。
1. ansible-playbook编写完,检査语法和模拟测试运行 。
2.打开剧本,定位异常问題原因,将剧本中的内容转换命令执行一次 。
3. 将参数中的脚本文件推送到远程屎务器,在远程服务器本地执行脚本 sh -x test.sh 。
说明:ansible执行时,加上-vvvv显示ansible详细执行过程,也可以定位异常原因 。
--syntax-check或-C ansible语法检查和模拟执行(彩排) 。
6.2 排错逻辑 。
01.剧本执行中的错误 。
02.把剧本中的内容转换为ansible命令执行 。
1
|
ansible banana
-
m yum
-
a
"name=rsync state=installed"
|
03.把参数中的脚本文件推送到远端服务器,放在远端被管理服务器本地上执行 。
1
|
sh
-
x
/
server
/
scripts
/
test.sh
|
6.3 ansible无法正常使用 。
6.3.1 常见问题一:在被控端上 root@notty进程一直存在 。
1
2
3
4
5
|
[root@backup ~]
# ps -ef|grep sshd
root
35274
1
0
15
:
25
?
00
:
00
:
00
/
usr
/
sbin
/
sshd
root
37004
35274
0
16
:
23
?
00
:
00
:
00
sshd: root@pts
/
2
root
37062
35274
0
16
:
55
?
00
:
00
:
00
sshd: root@notty
root
37154
37006
0
16
:
55
pts
/
2
00
:
00
:
00
grep
-
-
color
=
auto sshd
|
解决思路:kill pid将该进程杀死,然后使用ansible的 -vvvv 参数查看执行的错误信息 。
1
2
3
4
5
6
|
Loading callback plugin minimal of
type
stdout, v2.
0
from
/
usr
/
lib
/
python2.
6
/
site
-
packages
/
ansible
/
plugins
/
callback
/
__init__.pyc
META: ran handlers
Using module
file
/
usr
/
lib
/
python2.
6
/
site
-
packages
/
ansible
/
modules
/
system
/
ping.py
<
172.16
.
1.8
> ESTABLISH SSH CONNECTION FOR USER:
None
<
172.16
.
1.8
> SSH: EXEC ssh
-
vvv
-
C
-
o ControlMaster
=
auto
-
o ControlPersist
=
60s
-
o KbdInteractiveAuthentication
=
no
-
o PreferredAuthentications
=
gssapi
-
with
-
mic,gssapi
-
keyex,hostbased,publickey
-
o PasswordAuthentication
=
no
-
o ConnectTimeout
=
10
-
o ControlPath
=
/
root
/
.ansible
/
cp
/
923ebeb605
172.16
.
1.8
'/bin/sh -c '
"'"
'echo ~ && sleep
0
'"'
"''
|
可能为:在/etc/ssh/sshd_config 文件中的第132行为空,导致sftp 无法连接出错 。
1
|
133
Subsystem sftp
/
usr
/
libexec
/
openssh
/
sftp
-
server
|
6.3.2 常见问题二:
1
2
3
|
[root@m01 ~]
# ansible -k 172.16.1.51 -m ping
SSH password:
[WARNING]: No hosts matched, nothing to do
|
解决思路:在ansible的hosts文件中,没有配置相应主机地址信息 。
6.3.3 常见问题三:
1
2
3
4
5
6
|
# ansible -k 172.16.1.51 -m ping
SSH password:
172.16
.
1.51
|FAILED!
=
> {
"failed"
: true,
"msg"
:
"Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."
}
|
解决思路:在known_hosts文件中没有受控端指纹信息 。
6.4 [附录]pssh命令使用扩展 。
6.4.1 pssh命令使用场景说明 。
背景:若同时给上千台服务器执行一个命令,拷贝一个文件,杀一个进程等,有什么简化运维管理的工具呢?
在小型企业中通常使用for循环,但是数量巨大时:一方面不确定操作是否成功;另一方面for循环语句性能不好估计且是否是同步并行执行,故此时会用到批量并行执行的命令如 pdsh,mussh,cssh,dsh等,及下面说明提到的pssh 。
6.4.2 pssh软件安装部署方式 。
①通过yum安装pssh软件 。
1
|
yum install
-
y pssh <
-
pssh软件下载需要依靠epel源
|
说明:pssh是一个软件大礼包,里面有很多软件命令 。
②通过编译方式安装pssh软件 。
1
2
3
4
5
6
|
wget http:
/
/
peak.telecommunity.com
/
dist
/
ez_setup.py
python ez_setup.py
wget http:
/
/
parallel
-
ssh.googlecode.com
/
files
/
pssh
-
2.2
.
2.tar
.gz
tar zxvf pssh
-
2.2
.
2.tar
.gz
cd pssh
-
2.2
.
2
python setup.py install
|
③pssh软件使用操作说明(ssh key认证密钥配置完毕) 。
01.pssh 多主机并行运行命令 。
1
2
3
4
|
[root@server pssh
-
2.2
.
2
]
# vim hosts_info.txt
172.16
.
1.31
:
22
172.16
.
1.41
:
22
172.16
.
1.7
:
22
/
/
注意我的端口号不仅是默认的
22
|
说明:如果想将执行命令的批量输出信息重定向到一个文件 加-o 目录 选项 。
参数说明:
1
2
3
|
-
h HOST_FILE,
-
-
hosts
=
HOST_FILE hosts
file
(each line
"[user@]host[:port]"
)
-
o OUTDIR,
-
-
outdir
=
OUTDIR output directory
for
stdout files (OPTIONAL)
-
P,
-
-
print
print
output as we get it
|
02.pscp 把文件并行地复制到多个主机上(从服务器端给客户端传送文件) 。
1
|
[root@server pssh
-
2.2
.
2
]
# pscp -h test.txt /etc/sysconfig/network /tmp/network
|
03.prsync 使用rsync协议从本地计算机同步到远程主机 。
1
2
|
[root@server ~]
# pssh -h test.txt -P mkdir /tmp/etc
[root@server ~]
# prsync -h test.txt -l dongwm -a -r /etc/sysconfig /tmp/etc
|
04.pslurp 将文件从远程主机复制到本地,和pscp方向相反 。
1
2
3
4
5
6
7
8
9
10
11
|
[root@server ~]
# pslurp -h test.txt -L /tmp/test -l root /tmp/network test
[
1
]
14
:
53
:
54
[SUCCESS]
192.168
.
9.102
9922
[
2
]
14
:
53
:
54
[SUCCESS]
192.168
.
9.104
9922
[root@server ~]
# ll /tmp/test/192.168.9.10
192.168
.
9.102
/
192.168
.
9.104
/
[root@server ~]
# ll /tmp/test/192.168.9.102/
总计
4.0K
-
rw
-
r
-
-
r
-
-
1
root root
60
2011
-
04
-
22
14
:
53
test
[root@server ~]
# ll /tmp/test/192.168.9.104/
总计
4.0K
-
rw
-
r
-
-
r
-
-
1
root root
60
2011
-
04
-
22
14
:
53
test
|
总结 。
以上所述是小编给大家介绍的ansible服务及剧本编写,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。
原文链接:https://www.cnblogs.com/bananaaa/p/8143345.html 。
最后此篇关于python ansible服务及剧本编写的文章就讲到这里了,如果你想了解更多关于python ansible服务及剧本编写的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我只想从客户端向服务器发送数组 adc_array=[w, x, y, z]。下面是客户端代码,而我的服务器是在只接受 json 的 python 中。编译代码时我没有收到任何错误,但收到 2 条警告
我是 lua 和 Node js 的新手,我正在尝试将我正在开发的移动应用程序连接到服务器。问题是它连接到服务器,但我尝试传递的数据丢失或无法到达服务器。对我正在做的事情有什么问题有什么想法吗? th
我在这个页面上工作 http://www.haskell.org/haskellwiki/99_questions/Solutions/4 我理解每个函数的含义,看到一个函数可以像这样以多种方式定义,
我目前正在尝试将数据写入 excel 以生成报告。我可以将数据写入 csv 文件,但它不会按照我想要的顺序出现在 excel 中。我需要数据在每列的最佳和最差适应性下打印,而不是全部打印在平均值下。这
所以,我正在做一个项目,现在我有一个问题,所以我想得到你的帮助:) 首先,我已经知道如何编写和读取 .txt 文件,但我想要的不仅仅是 x.hasNext()。 我想知道如何像 .ini 那样编写、读
我正在尝试编写一个函数,该函数将返回作为输入给出的任何数字的阶乘。现在,我的代码绝对是一团糟。请帮忙。 function factorialize(num) { for (var i=num, i
这个问题已经有答案了: Check variable equality against a list of values (16 个回答) 已关闭 4 年前。 有没有一种简洁或更好的方法来编写这个条件
我对 VR 完全陌生,正在 AFrame 中为一个类(class)项目开发 VR 太空射击游戏,并且想知道 AFrame 中是否有 TDD 的任何文档/标准。有人能指出我正确的方向吗? 最佳答案 几乎
我正在尝试创建一个 for 循环,它将重现以下功能代码块,但以一种更具吸引力的方式。这是与 Soundcould 小部件 API 实现一起使用的 here on stackoverflow $(doc
我有一个非常令人困惑的问题。我正在尝试更改属性文件中的属性,但它只是没有更改... 这是代码: package config; import java.io.FileNotFoundException
我对 VR 完全陌生,正在 AFrame 中为一个类(class)项目开发 VR 太空射击游戏,并且想知道 AFrame 中是否有 TDD 的任何文档/标准。有人能指出我正确的方向吗? 最佳答案 几乎
我正在开发一个用户模式(Ring3)代码级调试器。它还应支持.NET可执行文件的本机(x86)调试。基本上,我需要执行以下操作: 1).NET在隐身模式下加载某些模块,而没有LOAD_DLL_DEBU
我有一个列表,我知道有些项目是不必要打印的,我正在尝试通过 if 语句来做到这一点...但是它变得非常复杂,所以有没有什么方法可以在 if 语句中包含多个索引而无需打印重写整个声明。 看起来像这样的东
我很好奇以不同方式编写 if 语句是否会影响程序的速度和效率。所以,例如写一个这样的: bool isActive = true; bool isResponding = false; if (isA
我在搜索网站的源代码时找到了一种以另一种方式(我认为)编写 if 语句的方法。 代替: if(a)b; 或: a?b:''; 我读了: !a||b; 第三种方式和前两种方式一样吗?如果是,为什么我们要
我的数据采用以下格式(HashMap的列表) {TeamName=India, Name=Sachin, Score=170} {TeamName=India, Name=Sehwag, Score=
我目前正在完成 More JOIN operations sqlzoo 的教程,遇到了下面的代码作为#12 的答案: SELECT yr,COUNT(title) FROM movie JOIN ca
我正试图找到一种更好的方法来编写这段代码: def down_up(array, player) 7.downto(3).each do |row| 8.times do |col
出于某种原因,我的缓冲区中充满了乱码,我不确定为什么。我什至用十六进制编辑器检查了我的文件,以验证我的字符是否以 2 字节的 unicode 格式保存。我不确定出了什么问题。 [打开文件] fseek
阅读编码恐怖片时,我刚刚又遇到了 FizzBuzz。 原帖在这里:Coding Horror: Why Can't Programmers.. Program? 对于那些不知道的人:FizzBu
我是一名优秀的程序员,十分优秀!