Ansible自动化工具

Devops-Ansible自动化部署工具

Ansible自动化工具

自动化运维平台:

  1. puppet+perl
  2. saltstack+py
  3. ansible+py

此文章讲解Ansible工具:

Ansible是一个简单的自动化运维管理工具,基于Python语言实现,由Paramiko和PyYAML两个关键模块构建,可用于自动化部署应用、配置、编排task(持续交付、无宕机更新等)

特点:

去中心化,同时执行多台
上手简单,学习曲线平滑
安全,无需安装客户端
配置简单,功能强大,扩展性强
支持API及自定义模块,可以通过Python轻松扩展
通过Playbooks来定制强大的配置,状态管理
幂等性,一次操作重复多次结果相同

ansible基础架构:

ansible基础架构

1.Ansible:
	ansible核心程序
	
2.Host Inventory:
	主机仓库
		记录了每一个由ansible管理的主机信息,包括主机地址,ssh端口,账号密码等等。可以通过file加载,也可以通过CMDB加载
		
3.Playbooks:
	YAML格式文件,多个任务定义在一个文件中,使用时可以统一调用,剧本用来定义哪些主机需要调用哪些模块来完成的功能
	
4.Core Modules:
	ansible执行任何管理任务都不是由ansible自己完成的,而是由核心模块完成;ansible管理主机前,先调用core modules中的模块,然后申明管理Host Inventory中的主机,就可以完成管理主机
	
5.Connect Plugins:
	连接插件,Ansible和Host通信使用:
	连接插件的协议可以是ssh(python的paramiko模块)
	
6.用户通过公有云或者私有云管理主机

环境部署

1.实验环境

1.主机资源:
Ansible管理端:{{IP1}}
	hostnamectl set-hostname ansible_center
Node1:{{IP2}}
	hostnamectl set-hostname node1
		被管理端节点

2.HOSTNAME设置:
hostname(cento6)
hostnamectl set-hostname name (centos7)

2.安装

1.pip安装
	更新python2.7.xx(或者更新版本)
	安装pip
		pip install ansible
2.yum安装
	yum -y install ansible

3.密钥部署

1.管理端生成密钥:
	ssh-keygen
2.将密钥分发到2个节点中
	ssh-copy-id root@{{IP2}}

4.配置文件(/etc/ansible)详解

ansible.cfg主配置文件

1.hosts主机&主机组定义文件
		指定要操作的主机组或者IP地址
	    主机组:web-server
			
	    ip4
	    [webserver]
	    ip1
	    ip2
	    ip3

2.roles角色目录

常用命令

	1.ansible-doc:
		ansible-doc 模块名
			查看指定模块文档
		ansible-doc -s 模块名
			只显示模块关键参数
				simple
				ansible-doc -s ping
		ansible-doc -l
			列出所有模块
		 ansible-doc --version
			查看ansible版本及配置信息
		例
			查看ping模块帮助
				ansible-doc -v ping
			使用ping模块测试主机存活
				ansible plservers -m ping
			使用shell模块执行shell命令
				ansible plservers -m shell -a "uptime"
	2.ansible:
		执行单项任务
			ansible 10.1.1.1 -m apt -a "name=openssh-devel state=last"
			ansible 10.1.1.1 -m ping
	3.ansible-playbook:
		执行剧本

常用模块

1.远程命令模块
	功能
		模块包括command,scirpt,shell,都可以实现远程shell命令运行.
		command为ansible默认模块,可以远程执行命令
		script功能是在远程主机执行主控端存放的shell脚本
		shell功能是执行远程主机的shell脚本
			可执行文件
	例
		ansible webservers -m command -a "free -m"
		ansible webservers -m script -a "home/test.sh 12 34"
		ansible webservers -m shell -a "/home/test.sh"
		

2.yum,apt模块
	功能
		linux平台软件包管理操作
		state
			present,表示安装
			latest,安装最新版
			absent(缺席),卸载
	例
		ansible webservers -m apt -a "pkg=zsh state=latest"
		ansible webservers -m yum -a "name=zsh state=latest"
		ansible all -m yum -a "name=* state=latest"
		ansible webservers -m yum -a "name=xxx.rpm state=present"
		ansible webservers -m yum -a "name='@Development Tools' state=present"


3.service模块
	功能
		远程主机系统服务管理
		state
			started,启动服务
			stopped,停止服务
			restarted,重启服务
	例
		ansible webservers -m service -a "name=httpd state=stopped"
		ansible webservers -m service -a "name=httpd state=restarted"
		ansible webservers -m service -a "name=httpd state=reloaded"


4.iptables防火墙模块
	功能
		管理linux系统防火墙
	例
		ansible webservers -m iptables -a "action=append chain=INPUT protocol=tcp destination_port=80 jump=ACCEPT state=present"


5.lineinfile文件编辑模块
	功能
		替换文件内容,可以基于正则
	例
		ansible all -m lineinfile -a "dest=/etc/selinux/config regexp='^SELINUX' line='SELINUX=disabled'"


6.setup系统参数
	功能
		显示操作系统相关信息


7.user模块
	功能
		远程主机系统用户管理
	例
		#添加用户
			echo 123 | openssl  passwd -1 -stdin
				$1$MGZ4qLh.$45x8QSwvR.qIE7OJnbtRP0
					先加密
			  ansible webservers -m user -a "name=alice password=$1$MGZ4qLh.$45x8QSwvR.qIE7OJnbtRP0'"
		ansible webservers -m user -a "name=bob state=absent remove=yes"
			#删除用户


8.file模块
	功能
		文件管理
		state=absent
			删除
	例
		ansible webservers -m file -a "path=/tmp/test state=directory"
			创建目录
		ansible webservers -m file -a "path=/tmp/test state=touch"
			创建文件
		ansible webservers -m file -a "path=/tmp/test src=/etc/fstab state=link"
			创建链接文件
		ansible webservers -m file -a "path=/tmp/test  state=absent"
			创建链接文件


9.copy模块
	功能
		实现主控端向目标主机拷贝文件,类似scp的功能
	例
		ansible webservers -m copy -a "src=/home/test.sh dest=/tmp/ owner=root group=root mode=0755"


10.远程增量同步synchronize
	功能
		增量备份
	例子
		ansible webservers -m synchronize -a "src= dest="
		ansible webservers -m synchronize -a "compress=yes  src= dest="
			compress压缩


11.stat模块
	功能
		获取远程文件状态信息,包括atime,ctime,mtime,md5,uid,gid等信息
	例
		ansible webservers -m stat -a "path=/etc/sysctl.conf"


12.get_url模块
	功能
		实现远程主机下载执行URL到本地,支持sha256sum文件校验
	例
		ansible webservers -m get_url -a "url=http://images.17173.com/2016/acg/2016/01/07/gq0107tt10.jpg dest=/root/ mode=0755 force=yes "


13.cron模块
	功能
		远程主机crontab配置
	例
		ansible webservers -m cron -a "name='do something' hour=5,2 job='ls -alh > /dev/null'"


14.mount模块
	功能
		远程主机分区挂载
	例
		ansible webservers -m mount -a "name=/mnt/data src=dev/sd0 fstype=ext4 opts=ro state=present"

PLAYBOOK

介绍

playbook是ansible的配置、部署、编排语言。他们可以被描述为一个需要希望远程主机执行命令的方案,或者一组ansible模块程序运行的命令集合。

YAML语法详解

YAML语法详解:
YAML语言是一种用来表达数据序列的编程语言,他的主要特点包括:可读性强,语法简单明了,支持丰富的语言解析库,通用性强.ansible和saltstack环境中的配置文件都以YAML格式存在,所以必须要熟悉YAML格式来配置管理ansible

块序列描述:
块序列描述就是将描述的元素序列到Python的列表中,以下代码演示了YAML与Python的对应关系
例子

import yaml

obj=yaml.load(
"""
- alice
- bob
- cindy
""")
print(obj)
#运行结果如下:
['alice', 'bob', 'cindy']
			-
   - alice
   - bob
   - cindy
-
   - china
   - japan
   - US

#结果为
[['alice', 'bob', 'cindy'], ['china', 'japan', 'US']]
	块映射描述
		块映射就是将描述的元素序列到python的字典中,格式为"键:值
		例子
			obj3=yaml.load(
   """
alice:
   hp: 34
   sp: 8
   level:  4

bob:
   hp: 66
   sp: 1
   level:  4
   """

)

print(obj3)
#对应python的结果为
{'alice': {'hp': 34, 'sp': 8, 'level': 4}, 'bob': {'hp': 66, 'sp': 1, 'level': 4}}
	两种混合
		obj4=yaml.load(
   """
alice:
   hp: 34
   sp: 8
   level:  4

bob:
   hp:
       - 12
       - 30
   sp:
       - 10
       - 20
   level: 4
   """

)
#结果为:
print(obj4)
{'alice': {'sp': 8, 'level': 4, 'hp': 34}, 'bob': {'sp': [10, 20], 'level': 4, 'hp': [12, 30]}} 

PLAYBOOK组成

playbook组成:

hosts: 运行指定任务的目标主机
remote_user: 在远程主机以哪个用户的身份执行
sudo_user: 非管理员用户有那一些组成
tasks:任务列表,模块和参数组成

例1:install_nginx.yaml:

	- hosts: webservers(主机组)
  remote_user: root
  
  tasks:
  - name: create a user
    user: name=nginx1 uid=3000
    ignore_errors: yes
  - name: install httpd
    yum: name=httpd
  - name: start nginx service
    service: name=nginx state=started
			ignore_errors忽略任务执行中的错误
			最外面只有一个-,所以是一个元素
			user、yum、service是模块
			任务之后,第二次执行时不会执行

检测playbook影响的主机及任务:
ansible-playbook -C --list-hosts --list-tags --list-tasks useradd.yaml

PLAYBOOK核心组件

1.task:任务,由模块定义的操作的列表

2.variables:变量
示例1:install_nginx.yaml

  - hosts: webservers
  remote_user: root
  tasks:
  - name: install {{ pkgname }}
  	yum: name={{ pkgname }}
  	tags: install {{ pkgname }}
  - name: start  {{ pkgname }}
  	service: name= {{ pkgname }} state=started enabled=true
	执行
		ansible-playbook  -e pkgname=nginx install_nginx.yaml
		
示例2:install_nginx.yaml

- hosts: webservers
  remote_user: root
  vars:
      - pkgname: nginx
  tasks:
  - name: install {{ pkgname }}
  	yum: name={{ pkgname }}
  	tags: install {{ pkgname }}
  - name: start  {{ pkgname }}
  	service: name= {{ pkgname }} state=started enabled=true
	执行
		ansible-playbook install_nginx.yaml


 3.templates:
当我们要根据不同服务器来定制不能的配置文件时,需要借助于模板文件,模板文件的语法为jinja

 4.handlers:有特定条件触发的Tasks
 
触发器handlers:syn_nginx_conf.yaml
- hosts: webservers
  remote_user: root
  tasks:
  - name: copy config file
  	copy: src=/tmp/nginx.conf dest=/etc/nginx/nginx.conf   #推送文件
  	notify: reload nginx server
  - name: start nginx service
    service: name=nginx state=started
    handlers:
    	- name: reload nginx service
    	   service: name=nginx state=restarted

notify:表示信号,与handlers的名称对应
handlers:触发器,接受到notify信号后执行其下的任务



5.roles:角色,以特定的层级目录结构进行组织的tasks,variables,handlers,templates,files(依赖的文件)等
   
6.tag:当有些任务我们需要单独执行或者跳过时,可以给任务打标签

- hosts: webservers
  remote_user: root
  tasks:
  - name: copy config file
  	copy: src=/tmp/nginx.conf dest=/etc/nginx/nginx.conf   #推送文件
        tags: copyfile
  	notify: reload nginx server
  - name: start nginx service
    service: name=nginx state=started
    handlers:
    	- name: reload nginx service
    	   service: name=nginx state=restarted
只执行标签任务
	ansible-playbook -t copyfile syn_nginx_conf.yaml  
跳过标签任务
	ansible-playbook --skip-tags copyfile syn_nginx_conf.yaml  
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务