Ansible自动化工具
Devops-Ansible自动化部署工具
Ansible自动化工具
自动化运维平台:
- puppet+perl
- saltstack+py
- 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