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 
#####################################

posted on 2025-10-28 10:41  luokeli  阅读(1)  评论(0)    收藏  举报

导航