ansible palybook
Ansible
# ansible 简介
Ansible是一种常用的自动运维化工具,基于python开发,分布式,无需客户端,轻量级,配置语言采用YAML
# Ansible 特点
1.模块化:调用特定的模块,完成特殊的任务
2.Paramiko(python对ssh的实现),PyYaml,jinja2(模块语言)三个关键模块
3.支持自定义模块,可使用任何编程语言写模块
4.基于python语言实现
5.部署简单,基于python和SSH(默认已安装),agentless,无需代理不依赖KPI(无需SSL)
6.安全,基于OpenSSH
7.幂等性:一个任务执行一次和执行n遍效果一样,不因重复执行带来意外情况
8.支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构
9.较强大的多层解决方案role
# Ansible 作用目标
1.自动化部署APP
2.自动化管理配置项
3.自动化的持续交付
4.自动化的云服务管理
# Ansible命令执行来源
1> USER,普通用户,即SYSTEM ADMINISTRATOR
2> CMDB(配置管理数据库) API 调用
3> PUBLIC/PRIVATE CLOUD API调用 (公有私有云的API接口调用)
4> USER-> Ansible Playbook -> Ansibile
# Ansible实现管理的方式
1> Ad-Hoc 即ansible单条命令,主要用于临时命令使用场景
2> Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前期的规划过程
# Ansible-playbook(剧本)执行过程
将已有编排好的任务集写入Ansible-Playbook
通过ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐条执行
# Ansible主要操作对象
HOSTS主机
NETWORKING网络设备
# Ansible注意事项
执行ansible的主机一般称为主控端,中控,master或堡垒机
主控端Python版本需要2.6或以上
被控端Python版本小于2.4需要安装python-simplejson
被控端如开启SELinux需要安装libselinux-python
windows不能做为主控端 ansible不是服务,不会一直启动,只是需要的时候启动
# Ansible 安装
yum -y install epel-release
dnf -y install epel-release
Ansible playbook
# playbook 简介
playbook是ansible用于配置,部署,和管理被节点的剧本
通过playbook的详细描述,执行其中的一些列tasks,可以让远端的主机达到预期的状态
# playbook 使用场景
执行简单任务使用ad-hoc命令,执行大量的操作的时候使用playbook
使用playbook可以方便的重复使用这些代码,可以把常见的应用都编写playbook,之后管理服务器会变得很简单
# playbook 格式
playbook由YAML语言编写
YAML的格式如下:
1.文件的第一行应该以“---”(三个连字符)开始,表明YAML文件的开始
2.在同一行中,"#号"之后的内容表示注释,类似于shell,python和ruby
3.YAML中的列表元素以“-”开头并且跟着一个空格。后面为元素内容
4.同一个列表之中的元素应该保持相同的缩进,否则会被当做错误处理
5.play中hosts、variables、roles、tasks等对象的表示方法都是以键值中间以“:”分隔表示,并且“:”之后要加一个空格
# playbook 核心元素
hosts:主机组
tasks:任务列表
variables:变量,设置方式有四种
templates:包含了模块语法的文本文件
handlers:由特定条件触发的任务 可以通过“notify”通知相应的handlers
tags: 标签 指定某条任务执行
# palybook 常用目录结构
hosts # 主机组 里面可定义IP=hostname和变量 如 harbor_registry=44.157.149.30
deplyment # 分离部署目录
install_ntp_svc.yaml # 安装 ntp 服务
install_docker_svc.yaml # 安装 docker 服务
roles
ntp
files
部署所需要的固定的文件 如:deb包
tasks
main.yaml
templates
部署所需要的带变量的文件 如: daemon.json里指定仓库ip { "insecure-registries": ["{{harbor_registry}}"] }
docker
files
tasks
main.yaml
templates
# palybook角色子目录 常用前3个
tasks: 角色任务
files: 角色引用的静态文件
templates:角色任务引用的Jinja2模板
handlers: 处理程序定义
defaults: 角色变量默认值
meta: 作者 许可证 平台
tests: 测试角色
vars: 变量
# Ansible palybook 实例
# 1 hosts 解析
####################################################################################
# 定义主机组和少量变量
[redis]
44.157.149.39 hostname=redis host_ip=44.157.149.39
[mysql]
44.157.149.40 hostname=mysql host_ip=44.157.149.40
# 先定义主机 再定义其主机变量
[redis]
44.157.149.39
[redis:vars]
hostname=redis
host_ip=44.157.149.39
# 定义一个组织 里面包括其他主机组 如 定义ntp组 应为redis和mysql都需要同步时间所以放到ntp组织下
[ntp:children]
redis
mysql
# 定义所有组的变量 也叫全局变量 常用的 root密码 ssh用户 密码 hosts python dns等
[all:vars]
ansible_sudo_pass=kc@123456
ansible_ssh_pass=kc@123456
ansible_ssh_user=kcadmin
all_hosts="44.157.149.39 redis \n44.157.149.40 mysql"
ansible_python_interpreter=/usr/bin/python3
dns_1=44.157.149.31
dns_2=44.157.149.32
############################################################################
# 2 Ansible palybook 关闭验证key
echo "[defaults]" >>/etc/ansible/ansible.cfg
echo "host_key_checking = false" >>/etc/ansible/ansible.cfg
# 3 Ansible palybook deplyment 分离部署目录
install_ntp_svc.yaml # 安装 ntp 服务
#####################################
---
- hosts: ntp
sudo: yes
roles:
- ../roles/ntp
#####################################
# 4 Ansible palybook roles 角色
#####################################
roles
ntp
files
部署所需要的固定的文件 如:deb包
tasks
main.yaml
templates
部署所需要的带变量的文件 如: daemon.json里指定仓库ip { "insecure-registries": ["{{harbor_registry}}"] }
#####################################
# 5 vim roles/ntp/main.yaml
#####################################
---
# 设置主机名 并调用 hostname 变量
- name: set hostname
shell: hostnamectl set-hostname {{hostname}}
# 设置主机 hosts
- name: set hosts
shell: echo "{{all_hosts}}" >/etc/hosts
# 设置本地时间
- name: set localtime
shell: ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 设置时区
- name: set timezone
shell: echo "Asia/Shanghai" >/etc/timezone
# 复制files里的文件到 /tmp/目录
- name: copy ntp pkg
copy: src={{item}} dest=/tmp/
with_items:
- libopts25_1.3a5.18.7-3_amd64.deb
- ntp_1.3a4.2.8p4+dfsg-3ubuntu5.9_amd64.deb
- ntpdate_1.3a4.2.8p4+dfsg-3ubuntu5.9_amd64.deb
# 安装 libopts
- name: install libopts
shell: dpkg -i /tmp/libopts25_1.3a5.18.7-3_amd64.deb
# 安装 ntpdate
- name: install ntpdate tools
shell: dpkg -i /tmp/ntpdate_1.3a4.2.8p4+dfsg-3ubuntu5.9_amd64.deb
# 安装 ntpd 服务
- name: install ntpd server
shell: dpkg -i /tmp/ntp_1.3a4.2.8p4+dfsg-3ubuntu5.9_amd64.deb
when: ansible_hostname == "m1"
# 从 template 目录里拷贝ntp配置文件到etc下
- name: config ntp server
template: src=ntp.conf dest=/etc/ntp.conf
when: ansible_hostname == "m1"
# 重启 ntp 服务
- name: restart ntp server
service: name=ntp state=restarted
when: ansible_hostname == "m1"
- name: update time
shell: ntpdate -u m1
- name: set crontab ntpdate
cron: name=dateupdate minute=* hour=* day=* month=* weekday=* job="/usr/sbin/ntpdate -u {{ntpd_server}}" state=present
#####################################
本文来自博客园,站在巨人的肩膀上,坚持开源精神,遵循开源协议:Apache Licene 2.0协议。
浙公网安备 33010602011771号