评论

收藏

[Unix] 自动化运维工具Ansible-playbook详解和案例实战(四)

服务系统 服务系统 发布于:2021-06-30 16:30 | 阅读数:394 | 评论:0

1、playbook-剧本介绍

playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。
1.1、核心元素

  1. hosts:执行的远程主机列表
  2. tasks:任务,由模板定义的操作列表
  3. variables:变量,内置变量或者自定义变量在playboook中调用
  4. templates:模板,即 使用模板语法的文件;可替换模板中的变量并实现一些简单逻辑的而文件
  5. handlers:处理器,和notify结合使用 ;当某条件满足时,触发执行的操作
  6. tags:标签,指定某条件下,用于选择运行playbook中的部分代码。Ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常的长。此时,如果确信其没有变化,就可以通过tags跳过这些代码片段
  7. roles:角色

1.2、基础组件

  1. hosts:playbook中的每个play的目的都是为了让某个或者某些主机在某个指定的用户身份执行任务。hosts用于指定任务的主机,须事先定义在主机清单中
  形式如下:
hosts: websrvs
  2. remote_user:可用于hosts和tasks中,也可以通过指定sudo的方式在远程主机上执行,其可用于paly全局或某任务;此外甚至可以在sudo时使用sudo_user指定sudo时切换的用户
  形式如下:
hosts: 192.168.16.10
 remote_user: root
tasks:
   name: test connection
   ping:
remote_user: root
sudo: yes
sudo_user: root

  • tasks:任务列表;格式有两种:
  action: module argument
  module: argument    建议使用
  注意:shell和command模块后面跟命令,而非key=value
  某任务的状态在运行后changed时,可通过‘notify’通知给相应的handlers
  任务可以通过‘tags’打标签,而后可在absible-playbook命令上使用-t指定进行调用
  示例:
tasks:
  - name: disable selinux
  command: /sbin/setenforce 0
  如果命令或者脚本的退出码不为零,可以使用一下方式替代
tasks:
  - name: run this command and ignore the result
  shell: /usr/bin/somecommand || /bin/true
  或者
tasks: 
  - name: run this command and ignore the result
  shell: /usr/bin/somecommand
  ignore_errors: True
DSC0000.png
  2. 使用setup变量
cat var.yaml
- hosts: 192.168.16.115
  remote_user: root
  tasks:
  - name: create log file
    file: name=/root/ansible-test/{{ ansible_fqdn }} state=touch  #{{ ansible_fqdn }}为setup模块中域名的一个内置变量
DSC0001.png
  4. hosts中的变量(/etc/asible/hosts)
[websrvs:vars]  #公共(组)变量
mark="-"
[websrvs]   #普通变量
192.168.16.115 hname=wg sname=115
192.168.16.118 hname=wg sname=118
  ansible websrvs -m hostname -a 'name= {{ hname }}{{ mark }}16{{ mark }}{{sname}}'

DSC0002.png
  示例2:
cat user.yaml 
- hosts: 192.168.16.115
  remote_user: root
  tasks:
  - name: "create some group"
  group: name={{ item }}
  when: ansible_distribution_major_version == "7"
  with_items:
    - g1
    - g2
    - g3
  - name: cerate user
  user: name={{ item.name }} group={{ item.group }}
  with_items:
    - { name: "user1",group: "g1"}
    - { name: "user2",group: "g2"}
    - { name: "user3",group: "g3"}
[img]/root/ansible-test/nginx.conf.j2 dest=/root/nginx.confbr /br /cat nginx.conf.j2br /{% for vhost in nginx_hosts %}br /server {br /  listen {{ vhost }}br /}br /{% endfor %}/prep  生成为文件为/ppre
cat /root/nginx.confbr /server {br /  listen 80br /}br /server {br /  listen 8088br /}
/prebrimg src=[/img]
  示例2:
cat temnginx.yaml
---
- hosts: websrvs
  remote_user: root
  vars:
  nginx_hosts:
    - web1:
    listen: 8080
    root: "/var/www/nginx/web1/"
    - web2:
    listen: 8080
    server_name: "www.wkx.com"
    root: "/var/www/nginx/web2/"
  tasks:
  - name: templete config
    template: src=/root/ansible-test/nginx.conf.j2 dest=/root/nginx.conf
cat nginx.conf.j2
{% for vhost in nginx_hosts %}
server {
  listen {{ vhost.listen }}
  {% if vhost.server_name is defined %}
  server_name {{ vhost.server_name }}
  {% endif %}
  root {{ vhost.root }} 
}
{% endfor %}
DSC0003.png
DSC0004.png
DSC0005.png
5、role

  ansible自1.2版本后引入的新特性。用于层次性、结构性的组织playbook。Roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来说,roles就是通过分别将变量、文件、任务、模板以及处理器放置于单独的目录中,并可以便捷的include他们的一种机制。角色一般基于主机结构构建服务的场景中,但也可以是用于构建守护进程等场景中。
  复杂场景:建议使用roles,代码复用度高
  变更主机及主机组
  如命名不规范维护或传承成本高
  某些功能需要多个playbook,通过include实现
  Ansible的roles目录结构
  每个角色,以特定的层级目录结构进行组织
Roles目录结构:
playbook.yaml
roles/
project/   项目名称,有以下子目录
tasks/  定义task、role的基本元素,至少包含一个名为main.yaml的文件;其他需要的文件在此通过include进行包含
files/  存放由copy或者script模块调用的文件
vars/ 不常用,定义变量;至少包含一个名为main.yaml的文件;其他需要的文件在此通过include进行包含
default/ 不常用,设定默认变量时使用此目录中的main.yaml
templates/  template模块查找所需要的模板问文件的目录
handlers/
meta/  不常用,定义当前角色的特殊设定以及依赖关系;至少包含一个名为main.yaml的文件;其他需要的文件在此通过include进行包含
关注下面的标签,发现更多相似文章