1.Ansible介绍

1).Ansible的优点

Ansible是一个简单的自动化引擎,可完成配置管理、引用部署、服务编排以及其他各种IT需求

Ansible是Python开发并实现的开源软件,其依赖Jinja2,paramiko和PyYAML这几个Python库

安装部署简单

基于SSH进行配置管理

Ansible不需要守护进程

日志集中存储

Ansible简单易用

Ansible功能强大

Ansible设计优秀

Ansible对云计算和大数据平台都有很好的支持

2).Ansible与Fabric之间比较

Fabric像是一个工具箱,提供了很多好用的工具用于在远程服务器执行命令

Ansible提供了一套简单的流程,只需要按照它的流程来做就能轻松完成任务

Fabric是库,Ansible是框架

Fabric简单,Ansible复杂

Fabric通过SSH执行简单的命令,Ansible将模块拷贝到远程服务器后执行,执行完以后删除模块

Fabric需要Python编程背景,Ansible不需要

Fabric需要写代码,Ansible只需要编写YAML格式的配置文件来描述要做的事情

Fabric提供了基本的接口,业务逻辑需要用户自己实现,Ansible提供了大量模块,用户只需要学习模块的用法即可

3).Ansible与SaltStack之间比较

Ansible安装部署简单,SaltStack需要安装客户端接收服务端发过来的命令

SaltStack相应速度更快,Ansible使用标准SSH连接,而SaltStack使用ZeroMQ进行通信和传输

Ansible更安全,Ansible使用标准SSH连接传输数据,不需要在远程主机上启动守护进程

SaltStack对Windows支持比较友好

Ansible自身运维比较简单,SaltStack需要在Master和Minion主机启动一个守护进程

2.Ansible使用入门

1).安装Ansible

pip install ansible

2).Ansible的架构

Ansible的编排引擎由Inventory、API、Modules(模块)和Plugins组成

工程师将需要在远程服务器执行的操作写在Ansible Playbook中,然后使用Ansible执行Playbook中的操作

3).Ansible的运行环境

Ansible会默认读取/etc/ansible/hosts文件中配置的远程服务器列表
# mkdir /etc/ansible
# cat /etc/ansible/hosts
[test]
192.168.1.101
192.168.1.102
192.168.1.103 # ansible test -m ping
192.168.1.101 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.1.102 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.1.103 | SUCCESS => {
"changed": false,
"ping": "pong"
}

4).Ansible的ad-hoc模式

Ansible的ad-hoc模式,通过ansible命令执行操作的方式,称为ad-hoc
# ansible test -m command -a "hostname" # ansible test -m command -a "whoami" 将本地文件拷贝到服务器中:
# ansible test -m copy -a "src=/etc/ansible/hosts dest=/tmp/hosts" 修改文件的所有者和权限:
# ansible all -m file -a "dest=/tmp/hosts mode=500 owner=mysql group=mysql" -become
-become参数类似于Linux命令下的sudo 在远程服务器中安装软件:
# ansible test -m yum -a "name=git state=present" -become

5).使用playbook控制服务器

在实际的生产环境中,我们一般将远程服务器需要做的事情写在一个YAML配置文件中
YAML文件称为Ansible Playbook # cat test_playbook.yaml
---
- hosts : test
become : yes
become_method : sudo
tasks :
- name : copy file
copy : src=/etc/ansible/hosts dest=/tmp/data.txt - name : change mode
file : dest=/tmp/data.txt mode=500 owner=mysql group=mysql - name : ensure packages installed
yum : pkg="{{ item }}" state=present
with_items :
- git # ansible-playbook test_playbook.yaml

3.Inventory管理

1).hosts文件位置

在Ansible中,将可管理的服务器集合称为Inventory
Inventory管理便是服务器管理
默认读取/etc/ansible/hosts文件
通过命令行参数的-i指定hosts文件
通过ansible.cfg文件中的inventory选项指定hosts文件

2).动态Inventory获取

# cat hosts.py
import argparse
import json
from collections import defaultdict
from contextlib import contextmanager
import pymysql def to_json(in_dict):
return json.dumps(in_dict, sort_keys=True, indent=2) @contextmanager
def get_conn(**kwargs):
conn = pymysql.connect(**kwargs)
try:
yield conn
finally:
conn.close() def parse_args():
parser = argparse.ArgumentParser(description='OpenStack Inventory Module')
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('--list', action='store_true', help='List active servers')
group.add_argument('--host', help='List details about the specific host')
return parser.parse_args() def list_all_hosts(conn):
hosts = defaultdict(list)
with conn as cur:
cur.execute('select * from hosts')
rows = cur.fetchall()
for row in rows:
no, host, group, user, port = row
hosts[group].append(host)
return hosts def get_host_detail(conn, host):
details = {}
with conn as cur:
cur.execute("select * from hosts where host='{0}'".format(host))
rows = cur.fetchall()
if rows:
no, host, group, user, port = rows[0]
details.update(ansible_user=user, ansible_port=port)
return details def main():
parser = parse_args()
with get_conn(host='127.0.0.1', user='root', passwd='msds007', db='test') as conn:
if parser.list:
hosts = list_all_hosts(conn)
print(to_json(hosts))
else:
details = get_host_detail(conn, parser.host)
print(to_json(details)) if __name__ == '__main__':
main()

4.YAML语法

1).语法规则

YAML文件的第一行为"---",表示是一个YAML文件
YAML中的字段大小写敏感
YAML与Python一样,使用缩进表示层级关系
YAML的缩进不允许使用Tab键,只允许使用空格,且空格的数目不重要,只要相同层次的元素左对齐即可
:冒号前后要有空格
#表示注释,从这个字符一直到行尾都会被解析器忽略

2).支持的数据格式

对象:键值对的集合,又称为映射,类似于Python中的字典
数组:一组按次序排列的值,又称为序列(sequence),类似于Python中的列表
纯量:单个的、不可再分的值,如字符串、布尔值于数字

3).解析

pip install PyYAML

使用PyYAML库解析YAML文件非常简单
import yaml
with open('data.yaml') as f:
print(yaml.load(f)) # cat data.yaml
---
name : Example Developer
job : Developer
skill : Elite
employed : True
foods:
- Apple
- Orange
- Strawberry
- Mango
languages:
ruby : Elite
python : Elite
dotnet : Lame

5.Ansible模块

1).Ansible的模块工作原理

1)将模块拷贝到远程服务器
2)执行模块定义的操作,完成对服务器的修改
3)在远程服务器中删除模块

2).常用的Ansible模块

1.ping
2.远程命令模块command
3.file
4.copy
5.user/group
6.yum
7.get_url
8.unarchive
9.git

3).模块的返回值

changed
failed

6.Playbook

1).Playbook的定义

在Ansible中,将各个模块组合起来的文件是一个YAML格式的配置文件,这个配置文件,在Ansible中称为Playbook

Ansible中的Playbook类似于Linux下的Shell脚本文件

2).使用ansible-playbook

# cat test_playbook.yaml
---
- hosts : test
become : yes
become_method : sudo
tasks :
- name : copy file
copy : src=/py/data.txt dest=/tmp/data.txt - name : change mode
file : dest=/tmp/data.txt mode=500 owner=mysql group=mysql - name : ensure packages installed
yum : pkg="{{ item }}" state=present
with_items :
- git # ansible-playbook test_playbook.yaml

3).Playbook的详细语法

1.权限
在Ansible中,默认使用当前用户连接远程服务器执行操作,我们可以在ansible.cfg文件中配置连接远程服务器的默认用户
2.通知
3.变量
4.Facts变量
Facts变量是Ansible执行远程部署之前从远程服务器中获取的系统信息,包括服务器的名称、IP地址、操作系统、分区信息、硬件信息等
Facts变量可以配合Playbook实现更加个性化的功能需求
访问复杂变量的Playbook:
---
- hosts : test
gather_facts : yes
tasks :
- shell : echo {{ ansible_eth0 ["ipv4"] ["address"] }}
register : myecho - debug : var=myecho.stdout_lines - shell : echo {{ ansible_eth0.ipv4.address }}
register : myecho - debug : var=myecho.stdout_lines
5.循环
# cat test_playbook.yaml
---
- hosts : test
become : yes
become_method : sudo
tasks :
- name : Installed MySQL Package
yum : pkg="{{ item }}" state=installed
with_items :
- mysql-server
- MySQL-python
- libselinux-python
- libsemanage-python
# ansible-playbook test_playbook.yaml
6.条件
在Playbook中可以通过when选项执行条件语句,when类似于if语句
7.任务执行策略

4).使用Playbook部署ngix

# cat deploy_nginx.yaml
---
- hosts: test
become: yes
become_method: sudo
vars:
worker_processes: 4
worker_connections: 768
max_open_files: 65506
tasks:
- name: install nginx
yum: name=nginx update_cache=yes state=present - name: copy nginx config file
template: src=/py/nginx.conf.j2 dest=/etc/nginx/nginx.conf - name: copy index.html
template:
src: /py/index.html.j2
dest: /usr/share/nginx/html/index.html
mode: 0644
notify: restart nginx handlers:
- name: restart nginx
service: name=nginx state=restarted # ansible-playbook depoly_nginx.yml

5).使用Playbook部署MongoDB

# cat mongo.yml
---
- hosts: test
become: yes
become_method: sudo
vars:
mongodb_datadir_prefix: /data
mongod_port: 27018 tasks:
- name: Create the mongodb user
user: name=mongodb comment="MongoDB" - name: Create the data directory for the namenode metadata
file: path={{ mongodb_datadir_prefix }} owner=mongodb group=mongodb state=directory - name: Install the mongodb package
yum: name={{ item }} state=installed
with_items:
- mongodb-server
- mongodb - name: create data directory for mongodb
file:
path: "{{ mongodb_datadir_prefix }}/mongo-{{ ansible_hostname }}"
state: directory
owner: mongodb
group: mongodb - name: create log directory for mongodb
file: path=/var/log/mongo state=directory owner=mongodb group=mongodb - name: Create the mongodb startup file
template: src=mongod.j2 dest=/etc/init.d/mongod-{{ ansible_hostname }} mode=0655 - name: Create the mongodb configuration file
template: src=mongod.conf.j2 dest=/etc/mongod-{{ ansible_hostname }}.conf - name: Copy the keyfile for authentication
copy: src=secret dest={{ mongodb_datadir_prefix }}/secret owner=mongodb group=mongodb mode=0400 - name: Start the mongodb service
command: creates=/var/lock/subsys/mongod-{{ ansible_hostname }} /etc/init.d/mongod-{{ ansible_hostname }} start # ansible-playbook mongo.yml

7.role的定义与使用

role并不是某一个具体的东西,而是一个规范与抽象,是一种将复杂的Playbook分割成多个文件的机制

Ansible从复杂的Playbook中抽象出了role的概念,并在Playbook提供了roles选项来使用role,在命令行提供了ansible-galaxy命令来创建、删除和查看role

所谓role,只是一种规范的文件组织方式。每个Ansible的role都会有一个名字,比如mongodb,与mongodb role相关的文件都存放在/etc/ansible/roles/mongodb目录下

8.Ansible的配置文件

1).配置文件的查找路径

配置文件的查找路径
Ansible命令行工具使用的配置文件是/etc/ansible/ansible.cfg文件
一般将所有的role、Playbook、Inventory文件、ansible.cfg文件保存在一个版本控制的库中 在Ansible中,可以有多种方式使用ansible.cfg文件。Ansible查找ansible.cfg文件的顺序如下:
1)ANSIBLE_CONFIG环境变量指定的配置文件
2)当前目录下的ansible.cfg文件
3)当前用户home目录下的.ansible.cfg文件
4)Ansible默认的/etc/ansible/ansible.cfg文件

2).Ansible中的常用配置

1.默认配置
inventory
remote_user
remote_port
private_key_file
roles_path
log_path
host_key_checking
forks
gathering
2.ssh连接配置
ssh_args
pipelining
control_path
3.权限提升配置
become
become_method
become_user
become_ask_pass

第10章:深入浅出Ansible的更多相关文章

  1. 《构建之法》之第8、9、10章读后感 ,以及sprint总结

    第8章: 主要介绍了软件需求的类型.利益相关者,获取用户需求分析的常用方法与步骤.竞争性需求分析的框架NABCD,四象限方法以及项目计划和估计的技术. 1.软件需求:人们为了解决现实社会和生活中的各种 ...

  2. 敏捷软件开发:原则、模式与实践——第10章 LSP:Liskov替换原则

    第10章 LSP:Liskov替换原则    Liskov替换原则:子类型(subtype)必须能够替换掉它们的基类型(base type). 10.1 违反LSP的情形 10.1.1 简单例子 对L ...

  3. 孙鑫视频学习:对第10章设置线宽时为什么不调用UpDateData(TRUE)的理解

    在第10章10.2.1小节中,首先分别对视图类和对话框类添加了一个名为m_nLineWidth的int型变量,再将用户在CSetting dlg对话框的edit控件中输入的线宽值记录在dlg.m_nL ...

  4. 第10章 系统级I/O

    第10章 系统级I/O 10.1 Unix I/O 一个Unix文件就是一个m个字节的序列:B0,B1,…,BK,…,Bm-1 Unix I/O:一种将设备优雅地映射为文件的方式,允许Unix内核引出 ...

  5. 高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化

    高性能Linux服务器 第10章    基于Linux服务器的性能分析与优化 作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.但硬件问题.软件问题.网络环境等 ...

  6. Linux就这个范儿 第10章 生死与共的兄弟

    Linux就这个范儿 第10章 生死与共的兄弟 就说Linux系统的开机.必须经过加载BIOS.读取MBR.Boot Loader.加载内核.启动init进程并确定运行等级.执行初始化脚本.启动内核模 ...

  7. 【翻译】《深入解析windows操作系统第6版下册》第10章:内存管理

    [翻译]<深入解析windows操作系统第6版下册>第10章:内存管理(第一部分) [翻译]<深入解析windows操作系统第6版下册>第10章:内存管理(第二部分) [翻译] ...

  8. 《构建之法》第8、9、10章读后感和Sprint总结

    <构建之法>第8.9.10章读后感  第八章重点讲了需求分析,在一个项目中,需求分析是最基础也是最重要的,只有充分了解了用户需求,我们才不会走弯路,才能做出正确的规划,保证项目的进行是按照 ...

  9. JavaScript高级程序设计(第三版)学习笔记8、9、10章

    第8章,BOM BOM的核心对象是window,具有双重角色,既是js访问浏览器的一个接口,又是ECMAScript规定的Global对象.因此,在全局作用域中声明的函数.变量都会变成window对象 ...

  10. 《Android开发艺术探索》读书笔记 (10) 第10章 Android的消息机制

    第10章 Android的消息机制 10.1 Android消息机制概述 (1)Android的消息机制主要是指Handler的运行机制,其底层需要MessageQueue和Looper的支撑.Mes ...

随机推荐

  1. c 判断数字是否无限

    /* isinf example */ #include <stdio.h> /* printf */ #include <math.h> /* isinf, sqrt */ ...

  2. postgresql could not connect to server

    问题: postgresql部署在linux上,在自己电脑上使用pgadmin连接出现could not connect to server错误 问题分析: 出现上述原因有3种情况 1.linux上的 ...

  3. 讨论SQLite数据库损坏与修复

      版权声明:博客将逐步迁移到 http://cwqqq.com https://blog.csdn.net/cwqcwk1/article/details/45541409 昨晚,朋友和我反馈SQL ...

  4. qt 创建及调用QT的 DLL

    先讲一下对QT动态链接库的调用方法,主要包括: 1.显式链接DLL,调用DLL的全局函数,采用Qt的QLibrary方法 2.显示链接DLL,调用DLL中类对象.成员函数.(通过对象即可实现类成员函数 ...

  5. 多进程之间的互斥信号量的实现(Linux和windows跨平台)

    最近工作中遇到了一些关于文件读取权限的问题.当一个程序中对一个固定名称的文件做了读写的操作的时候,外界通过并发式的调用这个应用的时候,可能存在多个进程同时去操作这个文件,这个时候可能会造成调用失败的问 ...

  6. Xshell查看日志

    查询日志命令(复制后鼠标右键粘贴): tail  -1000f /mnt/logs/SMFManagement/SMFManagement_info.log

  7. ORACLE EXECUTE IMMEDIATE 小结

    EXECUTE IMMEDIATE 代替了以前Oracle8i中DBMS_SQL package包.它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,E ...

  8. CXF框架构建和开发 Services

    Apache CXF 是一个开源的 Services 框架,CXF 帮助您来构建和开发 Services 这些 Services 可以支持多种协议,比如:SOAP.POST/HTTP.RESTful ...

  9. Objective-C中的self与LLVM Clang新引入的instancetype

    我们知道,大部分面向对象语言对于一个类的成员方法都有一个隐含的参数.在C++.Java.C#和JavaScript中是this,而在Objective-C中则是self.当然,由于Objective- ...

  10. Qt编写安防视频监控系统7-全屏切换

    一.前言 全屏切换这个功能点属于简单的,一般会做到右键菜单中,也提供了快捷键比如alt+enter来触发,恢复全屏则按esc即可,全屏处理基本上都是隐藏通道面板以外的窗体,保持最大化展示,由于采用了模 ...