博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HA Cluster—ansible批量操作
阅读量:6291 次
发布时间:2019-06-22

本文共 7230 字,大约阅读时间需要 24 分钟。

一、简介

Ansible是一种集IT系统的配置管理、应用部署、流程设置的开源软件工具,与其他管理软件工具有多方面的差异。目标是提供面对广泛的自动化挑战如何获得大型生产力的优势。当Ansible提供更强大的生产力逐步替代其他许多核心性能的自动化解决方案,它也在寻求解决其他还没解决的IT挑战,这些包括如何时复杂多层级工作流程清晰化、清楚统一的OS配置、在单一框架下应用软件的部署。

官方文档:http://docs.ansible.com/#playbooks


二、直接安装配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost ~]
# yum -y install ansible-1.5.4-1.el6.noarch.rpm
#下载安装包后使用yum安装;因为存在依赖关系
#
[root@localhost ~]
# rpm -ql ansible
/
etc
/
ansible
/
etc
/
ansible
/
ansible.cfg
/
etc
/
ansible
/
hosts
/
usr
/
bin
/
ansible
/
usr
/
bin
/
ansible
-
doc
/
usr
/
bin
/
ansible
-
galaxy
/
usr
/
bin
/
ansible
-
playbook
/
usr
/
bin
/
ansible
-
pull
/
usr
/
bin
/
ansible
-
vault
/
usr
/
lib
/
python2.
6
/
site
-
packages
/
ansible

安装完成后进行配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost ~]
# vim /etc/ansible/hosts
[webserver]            
#定义一组服务
node1.soul.com
node2.soul.com
[dbserver]
node3.soul.com
#
#定义完成后进行ssh认证
[root@localhost ~]
# ssh-keygen -t rsa
Generating public
/
private rsa key pair.
Enter 
file 
in 
which to save the key (
/
root
/
.ssh
/
id_rsa):
Enter passphrase (empty 
for 
no passphrase):
[root@localhost ~]
# ssh-copy-id -i .ssh/id_rsa.pub node1
[root@localhost ~]
# ssh-copy-id -i .ssh/id_rsa.pub node2
[root@localhost ~]
# ssh-copy-id -i .ssh/id_rsa.pub node3

基本语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost ~]
# man ansible
ANSIBLE(
1
)              System administration commands              ANSIBLE(
1
)
NAME
       
ansible 
- 
run a command somewhere 
else
SYNOPSIS
       
ansible <host
-
pattern> [
-
f forks] [
-
m module_name] [
-
a args]
#host-pattern      主机列表
#-f forks          一次管理多少
#-m module_name    指定模块;默认为command
#-a args           参数
#
[root@localhost ~]
# ansible all -a 'date'
node2.soul.com | success | rc
=
0 
>>
Sat Apr 
19 
22
:
28
:
00 
CST 
2014
node1.soul.com | success | rc
=
0 
>>
Sat Apr 
19 
22
:
28
:
00 
CST 
2014
node3.soul.com | success | rc
=
0 
>>
Sat Apr 
19 
22
:
28
:
00 
CST 
2014
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#显示所有模块
[root@localhost ~]
# ansible-doc -l
acl                  Sets 
and 
retrieves 
file 
ACL information.               
add_host             add a host (
and 
alternatively a group) to the ansible
-
playbo
airbrake_deployment  Notify airbrake about app deployments                  
apt                  Manages apt
-
packages                                   
apt_key              Add 
or 
remove an apt key                               
apt_repository       Add 
and 
remove APT repositores                         
arista_interface     Manage physical Ethernet interfaces                    
arista_l2interface   Manage layer 
2 
interfaces                              
arista_lag           Manage port channel (lag) interfaces                   
arista_vlan          Manage VLAN resources                                  
assemble             Assembles a configuration 
file 
from 
fragments          
assert               
Fail with custom message                               
at                   Schedule the execution of a command 
or 
scripts via the at co
authorized_key       Adds 
or 
removes an SSH autho
...
#
[root@localhost ~]
# ansible-doc -s
Usage: ansible
-
doc [options] [module...]    
#查看模块的参数
[root@localhost ~]
# ansible-doc -s yum
- 
name: Manages packages with the `yum' package manager
  
action: yum
      
state
=                 
# Whether to install (`present', `latest'), or remove (`absent') a packa
      
disablerepo
=           
# `repoid' of repositories to disable for the install/update operation T
      
name
=                  
# Package name, or package specifier with version, like `name-1.0'. When
      
enablerepo
=            
# Repoid of repositories to enable for the install/update operation. The
      
list
=                  
# Various (non-idempotent) commands for usage with `/usr/bin/ansible' an
      
disable_gpg_check
=     
# Whether to disable the GPG checking of signatures of packages being in
      
conf_file
=

测试安装包:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost ~]
# ansible all -m yum -a "state=present name=corosync"
node2.soul.com | success >> {
    
"changed"
: true,
    
"msg"
: "",
    
"rc"
0
,
    
"results"
:
...
#由于需要依赖关系;所以会输出很多信息;这里不贴了
[root@localhost ~]
# ansible all  -a "rpm -q corosync"    验证
node2.soul.com | success | rc
=
0 
>>
corosync
-
1.4
.
1
-
17.el6
.x86_64
node3.soul.com | success | rc
=
0 
>>
corosync
-
1.4
.
1
-
15.el6
.x86_64
node1.soul.com | success | rc
=
0 
>>
corosync
-
1.4
.
1
-
17.el6
.x86_64

三、YAML语法

YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。其结构(Structure)通过空格来展示,序列(Sequence)里的项用"-"来代表,Map里的键值对用":"分隔。下面是一个示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
name: Tom Smith
age: 
40
gender: Male
spouse:
    
name: Jerry Smith
    
age: 
35
    
gender: Female
children:
    
-    
name: Jimmy Smith
         
age: 
17
         
gender: Male
    
-    
name: Jenny Smith
         
age: 
15
         
gender: Female

YAML文件扩展名通常为.yaml,如example.yaml。

四、ansible playbooks

playbook是由一个或多个“play”组成的列表。play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制同唱一台大戏。下面是一个简单示例

1
2
3
4
5
6
7
8
9
10
11
12
13
- 
hosts: webnodes
    
vars
:
        
http_port: 
80
    
max_clients: 
256
    
remote_user: root
    
tasks:
    
- 
name: ensure apache 
is 
at the latest version
        
yum: name
=
httpd state
=
latest
    
- 
name: ensure apache 
is 
running
    
service: name
=
httpd state
=
started
    
handlers:
        
- 
name: restart apache
            
service: name
=
httpd state
=
restarted

五、Hosts和Users

playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,其可以是一个或多个由冒号分隔主机组;remote_user则用于指定远程主机上的执行任务的用户。如上面示例中的

1
2
-
hosts: webnodes
 
remote_user: root

不过,remote_user也可用于各task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户。

1
2
3
4
5
6
7
- 
hosts: webnodes
  
remote_user: mageedu
  
tasks:
    
- 
name: test connection
      
ping:
      
remote_user: mageedu
      
sudo: yes

六、任务列表和action

play的主体部分是task list。task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在运行自下而下某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在更正playbook后重新执行一次即可。

task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致。

每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出。

定义task的可以使用“action: module options”或“module: options”的格式,推荐使用后者以实现向后兼容。如果action一行的内容过多,也中使用在行首使用几个空白字符进行换行。

1
2
3
tasks:
    
- 
name: make sure apache 
is 
running
      
service: name
=
httpd state
=
running

在众多模块中,只有command和shell模块仅需要给定一个列表而无需使用“key=value”格式,例如:

1
2
3
tasks:
    
- 
name: disable selinux
      
command: 
/
sbin
/
setenforce 
0

如果命令或脚本的退出码不为零,可以使用如下方式替代:

1
2
3
tasks:
    
- 
name: run this command 
and 
ignore the result
      
shell: 
/
usr
/
bin
/
somecommand || 
/
bin
/
true

或者使用ignore_errors来忽略错误信息:

1
2
3
4
tasks:
    
- 
name: run this command 
and 
ignore the result
      
shell: 
/
usr
/
bin
/
somecommand
      
ignore_errors: 
True

七、handlers:用于当关注的资源发生变化时采取一定的操作。

“notify”这个action可用于在每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,取而代之,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。

1
2
3
4
5
- 
name: template configuration 
file
    
template: src
=
template.j2 dest
=
/
etc
/
foo.conf
    
notify:
        
- 
restart memcached
        
- 
restart apache

handler是task列表,这些task与前述的task并没有本质上的不同。

1
2
3
4
5
handlers:
    
- 
name: restart memcached
        
service:  name
=
memcached state
=
restarted
    
- 
name: restart apache
        
service: name
=
apache state
=
restarted

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#安装heartbeat的
heartbeat.yaml
    
- 
hosts: hbhosts
    
remote_user: root
    
tasks:
        
- 
name: ensure heartbeat latest version
          
yum: name
=
heartbeat state
=
present
        
- 
name: authkeys configure 
file
          
copy: src
=
/
root
/
hb_conf
/
authkeys dest
=
/
etc
/
ha.d
/
authkeys
        
- 
name: authkeys mode 
600
          
file
: path
=
/
etc
/
ha.d
/
authkeys mode
=
600
          
notify:
            
- 
restart heartbeat
        
- 
name: ha.cf configure 
file
          
copy: src
=
/
root
/
hb_conf
/
ha.cf dest
=
/
etc
/
ha.d
/
ha.cf
          
notify:
            
- 
restart heartbeat
    
handlers:
        
- 
name: restart heartbeat
            
service: name
=
heartbeat state
=
restarted

本文转自Mr_陈 51CTO博客,原文链接:http://blog.51cto.com/chenpipi/1399808,如需转载请自行联系原作者

你可能感兴趣的文章
驰骋工作流引擎三种项目集成开发模式
查看>>
SUSE11修改主机名方法
查看>>
jdk6.0 + Tomcat6.0的简单jsp,Servlet,javabean的调试
查看>>
Android:apk签名
查看>>
2(2).选择排序_冒泡(双向循环链表)
查看>>
MySQL 索引 BST树、B树、B+树、B*树
查看>>
微信支付
查看>>
CodeBlocks中的OpenGL
查看>>
短址(short URL)
查看>>
第十三章 RememberMe——《跟我学Shiro》
查看>>
mysql 时间函数 时间戳转为日期
查看>>
索引失效 ORA-01502
查看>>
Oracle取月份,不带前面的0
查看>>
Linux Network Device Name issue
查看>>
IP地址的划分实例解答
查看>>
如何查看Linux命令源码
查看>>
运维基础命令
查看>>
入门到进阶React
查看>>
SVN 命令笔记
查看>>
检验手机号码
查看>>