自动化运维工具之ansible

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动化运维工具之ansible相关的知识,希望对你有一定的参考价值。

 

维护的机器很多时有时需要批量部署。

一、什么样的情形需要批量部署

1、操作系统的安装

常见的有collber,red hat satelite(redhat)系统专用。

2、操作系统的配置

常见的有cfengine,puppet,chef,func。其中puppet最受欢迎

3、批量程序的部署

4、批量命令的运行查看状态信息

二、ansible介绍

ansible的架构大致如下

技术分享

ansible是新出现的运维工具是基于Python研发的糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。

1
2
3
运维工具常见的工作模式
1、agent模式: 基于ssl实现。代理工作在被监控端。像puppet。
2、agentless模式: 基于ssh服务实现工作在被监控端。监控端是ssh的客户端。

ansible是工作在agentless模式下具有幂等性。ansible在控制端只需要告诉监控端的期望状态就可以实现批量部署。

1
2
3
名词解释
幂等性不会重复执行相同的指令。例如不会重复安装软件
期望状态只需要告诉被监控端的期望状态

ansible是基于模块工作的ansible本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块ansible只是提供一种框架。架构包括

  1. 连接插件connection plugins负责和被监控端实现通信。

  2. Host Inventory:指定操作的主机,是一个配置文件里面定义监控的主机

  3. 各种模块核心模块command模块自定义模块

  4. 借助于插件完成记录日志邮件等功能

  5. PlayBooks:剧本执行多个任务时。并非必需可以让节点一次性运行多个任务

三、ansible的基本使用

1
2
安装软件yum install ansible -y # 对应的软件在 epel 仓库中也可自己手动编译
#源码地址 https://pypi.python.org/packages/source/a/ansible/ansible-1.5.tar.gz

 

技术分享

1
2
3
4
5
6
7
8
9
10
11
12
2、定义Host Inventory
# vim /etc/ansible/hosts
[webhosts]
172.16.10.22 ansible_ssh_user=root ansible_ssh_pass=guoting
172.16.10.33 ansible_ssh_user=root ansible_ssh_pass=guoting
解释
#ansible_ssh_user=root 是ssh登陆用户
#ansible_ssh_pass=guoting 是ssh登陆密码3、测试各个模块
# 注意每个模块的用法可以使用 ansible-doc MOD 来查看例如ansible-doc copy
 
ansible命令最常用的用法
ansible <Host-partten> -m MOE -a ‘MOD_ARV‘所支持的模块可以使用ansible-doc -l来查看

ansible示例

1、查看时间信息。command、shell模块

技术分享

2、在控制端添加添加用户。user模块

技术分享

3、实现ssh秘钥认证。shell、copy模块

技术分享

此时就可以实现基于ssh秘钥通信了此时/etc/ansible/hosts可以修改如下

1
2
3
4
###### /etc/ansible/hosts
[webhosts]
172.16.10.22
172.16.10.33

技术分享

4、安装软件和启动服务。yum、service模块

技术分享

技术分享

5、支持管道的命令。raw模块,类似于shell模块

技术分享

 

 

 

 

 

 

四、YAML语言介绍

1、YAML简介

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
YAML 是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言包括XML、C语言、Python、Perl以及电子邮件格式RFC2822等。 Clark Evans在2001年在首次发表了这种语言另外Ingy dtNet与Oren Ben-Kiki也是这语言的共同设计者。
YAML Ain‘t Markup Language即YAML不是XML。不过在开发的这种语言时YAML的意思其实是"Yet Another Markup Language"仍是一种标记语言。其特性
    YAML的可读性好
    YAML和脚本语言的交互性好
    YAML使用实现语言的数据类型
    YAML有一个一致的信息模型
    YAML易于实现
    YAML可以基于流来处理
    YAML表达能力强扩展性好
 
更多的内容及规范参见http://www.yaml.org。
 
##########################YAML语法
 
YAML的语法和其他高阶语言类似并且可以简单表达清单、散列表、标量等数据结构。其结构Structure通过空格来展示序列Sequence里的项用"-"来代表
Map里的键值对用":"分隔。YAML文件扩展名通常为.yaml或者.yml。下面是一个示例。
 
name: John Smith
age: 41gender: Male
spouse:
    name: Jane Smith
    age: 37
    gender: Female
children:
    -   name: Jimmy Smith
        age: 17
        gender: Male
    -   name: Jenny Smith
        age 13
        gender: Female
 
YAML 2 个重要的结构组成部分list和directory
################################# list
 
列表的所有元素均使用“-”打头例如
# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango
 
##############################dictionary
 
字典通过key与valuef进行标识例如
---
# An employee record
name: Example Developer
job: Developer
skill: Elite
 
也可以将key:value放置于{}中进行表示例如
---
# An employee record
{name: Example Developer, job: Developer, skill: Elite}
 
多个映射关系组成一个字典一个列表可以包含多个字典。

2、ymal中的变量

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
################################## 变量命名
变量名仅能由字母、数字和下划线组成且只能以字母开头。
 
################################## facts
facts是由正在通信的远程目标主机发回的信息这些信息被保存在ansible变量中。要获取指定的远程主机所支持的所有facts可使用如下命令进行
# ansible hostname -m setup 这个命令可以获得被监控端主机的各种信息将这些信息得到后保存到变量中。
 
################################ 自定义变量
在 yaml 中可以使用vars关键字来定义变量
vars:
  var_name: value
 
############################# 变量的引用
{{ var_name }}
 
 
########################### 特殊的变量迭代
当有需要重复性执行的任务时可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用并通过with_items语句来指明迭代的元素列表即可。
 
#######################################示例
例如在被控端添加 2 个用户
 
方式1一般做法
- name: add user testuser1
  user: name=testuser1 state=present groups=wheel
- name: add user testuser2
  user: name=testuser2 state=present groups=wheel
 
方式2使用变量方式
- name: add several users
  vars:
   user1: testuser1
   user2: testuser2
  user: name={{ user1 }} state=present groups=wheel
  user: name={{ user2 }} state=present groups=wheel
  
方式3使用迭代方式
- name: add several users
  user: name={{ item }} state=present groups=wheel
  with_items:     
    - testuser1     
    - testuser2
事实上with_items中可以使用元素还可为hashes例如
- name: add several users
  user: name={{ item.name }} state=present groups={{ item.groups }}
  with_items:
    - { name: ‘testuser1‘groups‘wheel‘ }
    - { name: ‘testuser2‘groups‘root‘ }

3、Inentory文件的格式

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
inventory文件遵循INI文件风格中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中此外当如若目标主机使用了非默认的SSH端口还可以在主机名称之后使用冒号加端口号来标明。
 
[webservers]
www1.magedu.com:2222
www2.magedu.com
[dbservers]
db1.magedu.com
db2.magedu.com
db3.magedu.com
 
如果主机名称遵循相似的命名模式还可以使用列表的方式标识各主机例如
[webservers]
www[01:50].example.com
[databases]
db-[a:f].example.com
 
#################### 主机变量
可以在inventory中定义主机时为其添加主机变量以便于在playbook中使用。例如
[webservers]
www1.magedu.com http_port=80 maxRequestsPerChild=808
www2.magedu.com http_port=303 maxRequestsPerChild=909
 
################### 组变量
组变量是指赋予给指定组内所有主机上的在playbook中可用的变量。例如
 
[webservers]
www1.magedu.com
www2.magedu.com
 
[webservers:vars]
ntp_server=ntp.magedu.com
nfs_server=nfs.magedu.com
 
################## 组嵌套
inventory中组还可以包含其它的组并且也可以向组中的主机指定变量。不过这些变量只能在ansible-playbook中使用而ansible不支持。例如
 
[apache]
httpd1.magedu.com
httpd2.magedu.com
 
ngx1.magedu.com
ngx2.magedu.com
 
[webservers:children]
apache
nginx
 
[webservers:vars]
ntp_server=ntp.magedu.com
 
######################### inventory参数
 
ansible基于ssh连接inventory中指定的远程主机时还可以通过参数指定其交互方式常用的参数如下所示
ansible_ssh_host  # 要连接的主机名
ansible_ssh_port  # 端口号默认是22
ansible_ssh_user  # ssh连接时默认使用的用户名
ansible_ssh_pass  # ssh连接时的密码
ansible_sudo_pass # 使用sudo连接用户是的密码
ansible_ssh_private_key_file # 秘钥文件如果不想使用ssh-agent管理时可以使用此选项
ansible_shell_type # shell的类型默认sh
#########################################################################################
ansible的循环机制还有更多的高级功能具体请参见官方文档http://docs.ansible.com/playbooks_loops.html

4、playbooks

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
playbook是由一个或多个“play”组成的列表。play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。
从根本上来讲所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中即可以让它们联同起来按事先编排的机制同唱一台大戏。
 
###########################playbook基础组件
1、Hosts和Users
 
playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。

以上是关于自动化运维工具之ansible的主要内容,如果未能解决你的问题,请参考以下文章

自动化运维工具之ansible

自动化运维工具之ansible的简单应用

运维自动化工具之Ansible

自动化运维工具之Ansible

Ansible自动化运维工具Ansible变量之Facts变量

运维打怪升级之Ansible自动化运维工具