扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
ansible是新出现的 自动化 运维工具 , 基于Python研发 。 糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。 仅需在管理工作站上安装 ansible 程序配置被管控主机的 IP 信息,被管控的主机无客户端。 ansible 应用程序存在于 epel( 第三方社区 ) 源,依赖于很多 python 组件
python语言是运维人员必会的语言!
ansible是一个基于Python开发的自动化运维工具
ansible的功能实现基于SSH远程连接服务
ansible可以实现批量系统配置,批量软件部署,批量文件拷贝,批量运行命令等功能
模块化设计,调用特定的模块来完成特定任务,本身是核心组件,短小精悍:
基于Python语言实现,由
Paramiko (python 的一个可并发连接 ssh主机功能库 ) ,PyYAML和Jinja2 ( 模板化 ) 三个关键模块实现;
1)不需要单独安装客户端,基于系统自带的sshd服务,sshd就相当于ansible的客户端
2)不需要服务端
3)需要依靠大量的模块实现批量管理
4)配置文件/etc/ansible/ansible.cfg
ansible 应用程序的主配置文件/etc/ansible/ansible.cfg
Host Inventory 定义管控主机 :/etc/ansible/hosts
遵循 INI风格;中括号中的字符是组名;一个主机可同时属于多个组;
[webserver]
172.16.1.7
172.16.1.8
[server]
172.16.1.7
3. A collection of hosts belonging tothe'webservers' group;一批主机属于一个组,例如定义为 'webservers' 的组
[webservers]
172.16.1.31
175.16.1.31
#[webservers] 组名 下面是管理的主机 可以实现批量管理一个组的主机,前提必须是sshkey秘钥认证。
注意:默认是以 root 用户执行,但是基于 ssh 连接操作要多次输入密码,为方便可以使用基于 ssh 密钥方式进行认证
#安装ansible之前需要安装epel.repo源wget -O /etc/yum.repos.d/epel.repo
http://mirrors.aliyun.com/repo/epel-6.repo
#安装ansible工具
yum -y install ansible
#管理的机器必须安装
yum -y install libselinux-python
#安装完毕以后检查
[root@nfs01 ~]# rpm -qa | grep libselinux-python
libselinux-python-2.0.94-7.el6.x86_64
ansible-doc命令:获取模块列表,及模块使用格式;
ansible-doc -l :获取列表查看所有的模块
ansible-doc -s module_name :获取指定模块的使用信息
ansible-doc -s service查看指定模块用法
ansible 命令常用参数
-C, --check don't make any changes; instead, tryto predict some
Connection Options: #检查不做任何改动;相反, 尝试预测一些
-v 显示输出信息 -vvvv 最多可以4v
#ansible 命令帮助参数详解
[root@m01 /]# ansible --help
Usage: ansible
Options:
-a MODULE_ARGS, --args=MODULE_ARGS
module arguments
--ask-vault-pass ask forvault password
-BSECONDS, --background=SECONDS
run asynchronously,failing after X seconds
(default=N/A)
-C, --check don't make any changes; instead, tryto predict some
of the changes that mayoccur
-D,--diff when changing (small)files and templates, show the
differences in thosefiles; works great with --check
-eEXTRA_VARS, --extra-vars=EXTRA_VARS
set additional variablesas key=value or YAML/JSON
-fFORKS, --forks=FORKS
specify number ofparallel processes to use
(default=5)
-h,--help show this help messageand exit
-iINVENTORY, --inventory-file=INVENTORY
specify inventory hostpath
(default=/etc/ansible/hosts) or comma separated host
list.
-lSUBSET, --limit=SUBSET
further limit selectedhosts to an additional pattern
--list-hosts outputs alist of matching hosts; does not execute
anything else
-m MODULE_NAME,--module-name=MODULE_NAME
module name to execute(default=command)
-M MODULE_PATH,--module-path=MODULE_PATH
specify path(s) tomodule library (default=None)
--new-vault-password-file=NEW_VAULT_PASSWORD_FILE
new vault password filefor rekey
-o,--one-line condense output
--output=OUTPUT_FILE output filename for encrypt or decrypt; use - for
stdout
-PPOLL_INTERVAL, --poll=POLL_INTERVAL
set the poll intervalif using -B (default=15)
--syntax-check perform asyntax check on the playbook, but do not
execute it
-tTREE, --tree=TREE log output to thisdirectory
--vault-password-file=VAULT_PASSWORD_FILE
vault password file
-v,--verbose verbose mode (-vvv formore, -vvvv to enable
connection debugging)
--version showprogram's version number and exit
Connection Options:
control as whom and how to connect to hosts
-k,--ask-pass ask for connectionpassword
--private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE
use this file toauthenticate the connection
-uREMOTE_USER, --user=REMOTE_USER
connect as this user(default=None)
-cCONNECTION, --connection=CONNECTION
connection type to use(default=smart)
-TTIMEOUT, --timeout=TIMEOUT
override the connectiontimeout in seconds
(default=10)
--ssh-common-args=SSH_COMMON_ARGS
specify common arguments topass to sftp/scp/ssh (e.g.
ProxyCommand)
--sftp-extra-args=SFTP_EXTRA_ARGS
specify extra argumentsto pass to sftp only (e.g. -f,
-l)
--scp-extra-args=SCP_EXTRA_ARGS
specify extra argumentsto pass to scp only (e.g. -l)
--ssh-extra-args=SSH_EXTRA_ARGS
specify extra argumentsto pass to ssh only (e.g. -R)
Privilege Escalation Options:
controlhow and which user you become as on target hosts
-s,--sudo run operations with sudo(nopasswd) (deprecated, use
become)
-USUDO_USER, --sudo-user=SUDO_USER
desired sudo user(default=root) (deprecated, use
become)
-S,--su run operations with su(deprecated, use become)
-RSU_USER, --su-user=SU_USER
run operations with suas this user (default=root)
(deprecated, usebecome)
-b,--become run operations withbecome (does not imply password
prompting)
--become-method=BECOME_METHOD
privilege escalationmethod to use (default=sudo),
valid choices: [ sudo |su | pbrun | pfexec | doas |
dzdo | ksu | runas ]
--become-user=BECOME_USER
run operations as thisuser (default=root)
--ask-sudo-pass ask for sudopassword (deprecated, use become)
--ask-su-pass ask for supassword (deprecated, use become)
-K,--ask-become-pass
ask for privilegeescalation password
.ansible 命令格式
ansible
命令 主机模式 指定模块默认(command) d
指明管控主机,以模式形式表示或者直接给定 IP,必须事先定义在文件中; all 设置所有;主机组; | |
[-m module_name] | 使用那种模块管理操作,所有的操作都需要通过模块来指定 默认不指定模块是command |
[-a args] | 指明模块专用参数; args 一般为 key=value 格式 注意:command模块的参数非为kv格式,而是直接给出要执行的命令即可; 如:-a "hostname" |
注意:
-iPATH, --inventory=PATH:指明使用的host inventory文件路径;
ansible重要模块功能总结
command(重要模块)执行命令模块,ansible命令执行默认模块
shell(重要模块)执行shell脚本模块
script(重要模块)把脚本发到客户端,然后执行;执行脚本命令在远端服务器上
copy(重要模块)把本地文件发送到远端
cron (重要模块)编写定时任务的模块
默认模块,可省略。在远程主机上进行操作命令。 -a "hostname"
注意: comand 模块的参数非 key=value 格式,直接给出要执行的命令
-a "name= state= minute= hour= day= month= weekday= job="
#通过ansible 给主机172.16.1.41添加一个定时任务 描述信息为 By Kaile uptime 每隔一个小时五分钟更新一次系统时间
#首先可以管理机器上进行测试
ansible 172.16.1.41 -C -m cron -a "name='ByKaile uptime' minute=5 job='/usr/sbin/ntpdate
time.nist.gov >/dev/null 2>&1'"
#给172.16.1.4主机创建定时任务
[root@m01 /]# ansible 172.16.1.41 -m cron -a"name='By Kaile uptime' minute=5 job='/usr/sbin/ntpdate time.nist.gov>/dev/null 2>&1'"
172.16.1.41 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"By Kaile uptime"
]
}
#检查定时任务
[root@m01 /]# ansible 172.16.1.41 -a"crontab -l"
172.16.1.41 | SUCCESS | rc=0 >>
#Ansible: By Kaile uptime
05 * * * * /usr/sbin/ntpdate time.nist.gov>/dev/null 2>&1
4.3.6 定时任务注释
root@m01 /]# ansible 172.16.1.31 -m cron -a "name='timecrontab' disabled='yes'job='/usr/sbin/ntpdate time.nist.gov>/dev/null 2>&1'"
172.16.1.31 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"time crontab"
]
}
[root@m01 /]# ansible 172.16.1.31 -a "crontab -l"
172.16.1.31 | SUCCESS | rc=0 >>
#crond-id-001:time sync By Kaile
*/5 * * * * /usr/sbin/ntpdate time.nist.gov>/dev/null 2>&1
#-002:time backup
00 00 * * * /bin/sh /server/scripts/nfs_back.sh>/dev/null 2>&1
#Ansible: time crontab
#* * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1
定时任务开启注释信息
[root@m01 /]# ansible 172.16.1.31 -m cron -a "name='timecrontab' disabled='no'job='/usr/sbin/ntpdate time.nist.gov>/dev/null 2>&1'"
172.16.1.31 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"time crontab"
]
}
[root@m01 /]# ansible 172.16.1.31 -a "crontab -l"
172.16.1.31 | SUCCESS | rc=0 >>
#crond-id-001:time sync By Kaile
*/5 * * * * /usr/sbin/ntpdate time.nist.gov>/dev/null 2>&1
#-002:time backup
00 00 * * * /bin/sh /server/scripts/nfs_back.sh>/dev/null 2>&1
#Ansible: time crontab
* * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1
服务器说明 | 外网IP | 内网IP | 主机名 |
nginx web | 10.0.0.8/24 | 172.16.1.7/24 | web02 |
NFS存储服务器 | 10.0.0.31/24 | 172.16.1.31/24 | nfs01 |
rsync备份服务器 | 10.0.0.41/24 | 172.16.1.41/24 | backup |
管理服务器 | 10.0.0.61/24 | 172.16.1.61/24 | m01 |
[root@m01 ~]# tree /etc/ansible/
/etc/ansible/
├── ansible.cfg #ansible配置文件
├── hosts #被ansible管理的主机名单(分组)
└── roles
1 directory, 2 files
[root@m01 ~]# cp /etc/ansible/hosts{,.bak} #改前备份可是个好习惯
[root@m01 ~]# tail -6 /etc/ansible/hosts
[guanli]
172.16.1.31
172.16.1.41
172.16.1.61
172.16.1.7
如果设置了ssh密钥连接的话,hosts文件到这里就算配置完毕了。但是我们还没有设置,因此还需要对ansible的主机映射文件/etc/ansible/hosts继续加工
[root@m01 ~]# tail -6 /etc/ansible/hosts
[zhaokai]
172.16.1.31 ansible_ssh_user=root ansible_ssh_pass=登录密码
172.16.1.41 ansible_ssh_user=root ansible_ssh_pass=登录密码
172.16.1.61 ansible_ssh_user=root ansible_ssh_pass=登录密码
172.16.1.7 ansible_ssh_user=root ansible_ssh_pass=登录密码
172.16.1.8 ansible_ssh_user=root ansible_ssh_pass=登录密码
命令说明:
ansible_ssh_user:ssh连接的用户名
ansible_ssh_pass:ssh连接的密码
注意:
如果没有做密钥认证,hosts又没有如上方式配置的话,ansible进行远程连接是会失败的。
语法:
ansible zhaokai -m command -a 'uptime'
ansible主机组 -m ansible内置功能模块名 -a命令
ansible命令测试
示例1:获取172.16.1.8的主机的w信息
[root@m01 ~]
# ansible 172.16.1.8 -m command -a"w"
172.16.1.8 | SUCCESS | rc=0 >>
13:44:07
up
5:32,
3 users, load
average:0.
00,
0.
01,
0.
05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - Sat09
14:160
.
07s
0.
07s -bash
root pts/
0172.16
.
1.1 Mon23
13:29m
0.08s
0.
00s -bash
root pts/
1 m01
13:440
.
00s
0.
14s
0.
00s /bin/sh -c /usr
[root@m01 ~]
#
[root@m01 ~]
# ansible zhaokai -m command -a "w"
172.16.1.8 | SUCCESS | rc=0 >>
13:45:12
up
5:33,
3 users, load
average:0.
00,
0.
01,
0.
05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - Sat09
15:210
.
07s
0.
07s -bash
root pts/
0172.16
.
1.1 Mon23
13:30m
0.08s
0.
00s -bash
root pts/
1 m01
13:450
.
00s
0.
12s
0.
00s /bin/sh -c /usr
172.16.1.61 | SUCCESS | rc=0 >>
21:05:58
up
6:34,
3 users, load
average:0.
00,
0.
01,
0.
05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 -
14:414:22
m
0.
07s
0.
07s -bash
root pts/
0172.16
.
1.116:44
2.00
s
1.11s
0.
67s /usr/bin/python
root pts/
8 m01
21:051.00
s
0.
10s
0.
00s /bin/sh -c /usr
172.16.1.7 | SUCCESS | rc=0 >>
12:05:07
up
1:05,
2 users, load
average:0.
00,
0.
01,
0.
05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 -
11:0026:21
0
.09s
0.09s -bash
root pts/
0 m01
12:050
.
00s
0.
30s
0.
00s /bin/sh -c /usr
172.16.1.41 | SUCCESS | rc=0 >>
22:36:51
up
18:39,
2 users, load
average:0.
00,
0.
01,
0.
05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 -
03:5858:54
0
.
11s
0.
11s -bash
root pts/
0 m01
22:360
.
00s
0.
32s
0.
00s /bin/sh -c /usr
172.16.1.31 | SUCCESS | rc=0 >>
13:45:13
up
6:49,
2 users, load
average:0.
00,
0.
01,
0.
05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - Mon2
013:42
0
.
15s
0.
15s -bash
root pts/
0 m01
13:450
.
00s
0.
30s
0.
00s /bin/sh -c /usr
[root@m01 ~]
#
[root@m01 ~]
# ansible 172.16.1.8 -m copy -a" src=/etc/hosts dest=/tmp" #输入命令
172.16.1.8 | SUCCESS => {
"changed":
true,
"checksum":"dba0126bf49ea8d4cdc476828f9edb37085c6afe"
,
"dest":"/tmp/hosts"
,
"gid":0
,
"group":"root"
,
#文件复制过去以后的属组
"md5sum":"09bad48d0c62411850fd04b68f836335"
,
"mode":"0644"
,
#文件复制过去以后的权限
"owner":"root"
,
#文件复制过去以后的属主
"secontext":"unconfined_u:object_r:admin_home_t:s0"
,
"size":294
,
"src":"/root/.ansible/tmp/ansible-tmp-1489411262.1-267125154401179/source"
,
"state":"file"
,
"uid":0
}
[root@m01 ~]
# ansible 172.16.1.8 -m command -a "ls/tmp" #查看一下对方主机目录下有啥
172.16.1.8 | SUCCESS | rc=0 >>
ansible_0qlGau
hosts
#在这里呢,拷贝成功
pulse-d3qHAaSjkIhZ
pulse-PbcqlrG9QxEK
virtual-root.yrc60j
yum.log
[root@m01 ~]
# ssh root@172.16.1.8 "ls /tmp" #用ssh再看一下
`root@172.16.1.8's password: `
hosts
#在这里呢拷贝成功
pulse-d3qHAaSjkIhZ
pulse-PbcqlrG9QxEK
virtual-root.yrc60j
yum.log
[root@m01 ~]
#
命令说明:
-m:调用ansible内置模块 copy 拷贝模块
-a:接命令。由于调用了copy模块,命令格式发生改变。src=本地文件路径 dest=目的地所在路径
示例4:调用copy模块实现保存文件的属性改变
[root@m01 ~]
# ansible 172.16.1.8 -m copy -a" src=/etc/hosts dest=/tmp owner=zhaokai group=zhaokai mode=600"
172.16.1.8 | SUCCESS => {
"changed":
true,
"checksum":"dba0126bf49ea8d4cdc476828f9edb37085c6afe"
,
"dest":"/tmp/hosts"
,
"gid":502
,
"group":"zhaokai"
,
"mode":"0600"
,
"owner":"zhaokai"
,
"path":"/tmp/hosts"
,
"secontext":"unconfined_u:object_r:admin_home_t:s0"
,
"size":294
,
"state":"file"
,
"uid":502
}
[root@m01 ~]
# ssh root@172.16.1.8 "ls -l/tmp/hosts"
`root@172.16.1.8's password: `
-rw-------.
1 zhaokai zhaokai
2943月
1414:00 /tmp/hosts
命令说明:
对于ansible内置模块的使用,大家参考命令执行后的返回信息里看就可以了。写的很清楚。
备注:
copy模块,如果复制的对方主机路径下没有目录,那么会递归创建
特别提示:
ansible的部分模块并不支持
1)管道符 “|”
2)重定向 “> < >> <<”
3)类似top,tail -f这种不能即刻返回明确信息的命令
4)*
[root@m01 ~]# echo "echo '测试成功!'" >>/server/scripts/test.sh
ansible zhaokai -m copy -a" src=/server/scripts/yum.sh dest=/server/scripts/ mode=0755backup=yes"
注意:dest路径的写法,若是不存在的目录,结尾要加斜线(/server/scripts/),否则默认不会创建目标目录
ansible zhaokai -m shell -a"/server/scripts/yum.sh"
示例:
[root@m01 ~]
# ansible zhaokai -m command -a "sh/server/scripts/test.sh"
172.16.1.41 | SUCCESS | rc=0 >>
测试成功!
172.16.1.31 | SUCCESS | rc=0 >>
测试成功!
172.16.1.7 | SUCCESS | rc=0 >>
测试成功!
172.16.1.8 | SUCCESS | rc=0 >>
测试成功!
172.16.1.61 | SUCCESS | rc=0 >>
测试成功!
模块名 | 作用 |
command | 执行命令模块(重要) |
copy | 文件拷贝模块(重要) |
shell | 执行shell脚本模块(重要) |
script | 执行shell脚本模块(重要) |
file | 设定文件属性模块 |
service | 系统服务管理模块 |
cron | 计划任务管理模块 |
yum | yum软件包安装管理模块 |
synchronize | 使用rsync同步文件模块 |
绝对路径:进入目录执行一次,下一次如果还需要进入这个目录,需要再次用绝对路径进入执行命令。
执行剧本的另一台机器,如果在挂载中,需要检查挂载,卸载,不然不执行卡主。
yaml使用一个固定的缩进风格表示数据层结构关系,Saltstack/ansible需要每个缩进级别由
两个空格组成。一定不能使用tab键
yaml:
mykey: my_value
每个冒号后面一定要有一个空格(以冒号结尾不需要空格,表示文件路径的模版可以不需要空
格)
想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一个列表的
一部分 - hosts
---
### 剧本的开头,可以不写
hosts: all <- 处理所有服务器,找到所有服务器; -(空格)hosts:(空格)all
tasks: <- 剧本所要干的事情; (空格)(空格)task:
- command: echo hello oldboy linux. (空格)(空格)空格)(空格)-(
空格)模块名称:(空格)模块中对应的功能
- hosts:172.16.1.7 <- 处理指定服务器 -(空格)hosts:(空格)
tasks: <- 剧本所要干的事情; (空格)(空格)task:
- name:
command: echo hello oldboy linux. (空格)(空格)空格)(空格)-(
空格)模块名称:(空格)模块中对应的功能
# ansible all -m cron -a "name='restartnetwork' minute=00 hour=00
#job='/usr/sbin/ntpdate time.nist.gov>/dev/null 2>&1'"
-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'
#ansible-playbook -C /etc/ansible/network-restart.yml -vvvx
说明:测试剧本命令后面可以跟多个-v进行调试检查
-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/ntpdatepool.ntp.com >/dev/null 2>&1"
-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/ntpdatepool.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
ansible oldboy -m authorized_key -a "key='公钥文件里面的内容,锁头里面的内容' user=root" -k
#实战操作
[root@m01 .ssh]# ansible 172.16.1.41 -mauthorized_key -a "key='ssh-dss AAAAB3NzaC1kc3MAAACBAOkVRb7MpNPcYR6HbR5Q6iT2028sSgNlaKX8yXEHDp/YGuobBzYvHKvLMhokak4Eo2DE/g9n29z+J4krWGpWZz9680YaT8T8Z0qmMXorK44FuAQqcifoyvMlW97DPvF+H8ilYNHnSE1D2EY4TXU1ruNPGAeaqLaUr6xcP7enc+hVAAAAFQCv0mTqYI6uraAAwV+YqV0fwynuSwAAAIEA54se+MAC8WxsugYsVEkvCnSWhAhB/KLsBCk5k7Y8pTdirnJ/ZviXM2/GTsPYdMHw9cZFyT4L3lsflorcj9gjsavWiyK9/GDerBe1vXg6JyRXstgWax2hIpH702dzSuENXSlbTua1tGNdBGt2A+mKQouBKqGMgyz3SWoF3CEb0gkAAACBAIUnpl1V9+w4tgccRoVUcnRx7H3hkaVSGzFXz1KxNGyASWVtgBdDn9+VT4T+U9JE9hlwKx4s9ySRyYvivZnT/6kZODleFVvVckr8jEdV/ILlesu+wQ31kLETiaOli5EGCyJmTNNK6x2Uz1Dq3rK4Rlb+tBSH3rMLzFp4aYBP+i+9root@m01' user=root" -k
SSH password:
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流