Ansible自动化工具高级篇

简介: Ansible自动化工具高级篇

什么是playbook剧本

Ansible剧本:
⼀系列的任务按照我们期望的结果编排在⼀起
playbook组成:
hosts: 定义主机⻆⾊
tasks: 具体执⾏的任务
简单理解:不同的模块去完成⼀件事

格式   两个空格

 需要执⾏的主机:nfs
  任务:
    - 任务1: 创建⽤户
      动作:创建⽤户的命令
    - 任务2: 创建⽬录
      动作:创建⽬录的命令

playbook剧本的优势

减少重复命令的书写:ansible backup -m
简洁清晰好理解
功能强⼤,可以控制流程,⽐如:判断,循环,变量,标签
可以复⽤
提供语法检查以及模拟执⾏

剧本的格式书写要求

YAML格式特点
严格的缩进表示层级关系
不要使⽤tab缩进
: 后⾯⼀定要有空格
- 后⾯⼀定要有空格
⽂件后缀名需要改为yaml或yml,vim可以智能⾼亮提示
剧本的组成
hosts: 需要执⾏的主机
tasks: 需要执⾏的任务
name: 任务名称
编写rsync剧本
  1. 添加组
  2. 添加用户
  3. 傀儡用户
  4. 安装rsync
  5. 复制配置文件
  6. 创建认证
  7. 创建备份目录
  8. 启动服务
 hosts: 10.0.1.7
  tasks:
  - name: add group
    group: 
      name: rsync 
      gid: 666
  - name: add user
    user: 
      name: rsync 
      shell: /sbin/nologin 
      create_home: no 
      group: rsync 
      uid: 666
  - name: install rsync
    yum:
      name: rsync 
      state: latest
  - name: copy rsyncd
    copy: 
      src: /tmp/rsyncd.conf 
      dest: /etc/
  - name: touch password
    file: 
      path: /etc/rsync.passwd 
      state: touch
  - name: vim password
    copy: 
      content: 'rsync_backup:123456' 
      dest: /etc/rsync.passwd 
      mode: 0600
  - name: create backup
    file: 
      path: /backup 
      state: directory 
      owner: rsync 
      group: rsync
  - name: systemctl  rsync
    systemd: 
      name: rsyncd
      state: started
      enabled: yes
模拟执行
ansible-playbook -C rsync_install.yaml
执行
ansible-playbook rsync_install.yaml
编写nfs剧本
- hosts: 10.0.1.8
  tasks:
  - name: add group
    group:
      name: www
      gid: 666
  - name: add user
    user:
      name: www
      uid: 666
      create_home: no
      shell: /sbin/nologin
      group: www
  - name: install nfs
    yum: 
      name: nfs-utils
      state: latest
  - name: install rpcbind
    yum :
      name: rpcbind
      state: latest
  - name: copy exports
    copy: 
      src: /tmp/exports
      dest: /etc/
  - name: create data
    file: 
      path: /data
      state: directory
      owner: www
      group: www
  - name: systemd rpcbind
    systemd: 
      name: rpcbind
      state: started
      enabled: yes
  - name: systemd nfs
    systemd: 
      name: nfs
      state: started
      enabled: yes

剧本⾼级特性-循环

官方文档
https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html?highlight=loop
应用场景
安装多个软件
创建多个⽬录
复制多个⽬录
复制多个⽂件到不同的⽬录
不同的⽂件权限不⼀样
循环书写风格:

单行模式:

- name: create_data  file: path=/data 
state=directory owner=www group=www

多行模式:

 name: create_data
   file:
     path: "{{ item }}"
     state: directory
     owner: www
     group: www
   loop:
     - /data
     - /backup

混合模式:

- name: create_data
     file: path="{{ item }}" state=directory owner=www group=www
     loop:
       - /data
       - /backup

多参数循环模式:

- hosts: backup
  tasks:
  - name: create_data
    file:
    path: "{{ item.path }}"
    state: directory
    owner: www
    group: www
    mode: "{{ item.mode }}"
  loop:
    - { path: '/data' , mode: '755' }
    - { path: '/backup', mode: '777' }

剧本⾼级特性-变量

应用场景
自定义某个变量,在任务中被多次引⽤
从主机收集到系统信息⾥提取某个变量,⽐如IP地址,主机名
⾃定义变量并引⽤
- hosts: backup
  vars:
    user_id: '666'
    rsync_user: 'www'
  tasks:
  #1.创建www组和www⽤户
  - name: create_group
    group:
    name: "{{ rsync_user }}"
    gid: "{{ user_id }}"
  #2.创建www⽤户 
  - name: create_user
    user:
      name: "{{ rsync_user }}"
      uid: "{{ user_id }}"
      group: "{{ rsync_user }}"
      create_home: no
      shell: /sbin/nologin
  #3.创建数据⽬录并更改授权
  - name: create_data
    file:
      path: "{{ item }}"
      state: directory
      owner: "{{ rsync_user }}"
      group: "{{ rsync_user }}"
      mode: '755'
    loop:
      - /data/
      - /backup/
  #4.安装rsync软件
  - name: install_rsync
    yum:
      name: rsync
      state: latest
  #5.复制配置⽂件和密码⽂件
  - name: copy pwd&conf
    copy:
      src: "{{ item.src }}"
      dest: /etc/
      mode: "{{ item.mode }}"
   loop:
     - { src: /root/script/rsync/rsyncd.conf, mode: '644'}
     - { src: /root/script/rsync/rsync.passwd, mode: '600'}
  #6.启动服务
  - name: start
    systemd:
      name: rsyncd
      state: started
      enabled: yes
使⽤变量获取主机的eth1地址和主机名
- hosts: all
  tasks:
  - name: echo IP
    shell: "echo {{ ansible_default_ipv4.address }} >> /tmp/ip.txt"
  - name: echo hostname
    shell: "echo {{ ansible_hostname }} >> /tmp/hostname.txt"
在主机清单中里定义变量
[root@m01 ~]# cat /etc/ansible/hosts
[web]
172.16.1.7
[web:vars] 
service_name=web
[nfs]
172.16.1.31 service_name=nfs
[backup]
172.16.1.41 service_name=rsync
[all:vars]
job=it
引⽤变量
- host: all
  tasks:
  - name: echo ip
    shell: "echo {{ service_name }} >>/tmp/service.txt"
  - name: echo hostname
    shell: "echo {{ job }} >>/tmp/hostname.txt"
内置变量
ansible_facts.eth0.ipv4.address  ip地址
 ansible_facts.eth1.ipv4.address  ip地址
 ansible_nodename 节点名字
 ansible_form_factor 服务器类型
 ansible_virtualization_role 虚拟机⻆⾊(宿主机或者虚拟机)
 ansible_virtualization_type 虚拟机类型(kvm)
 ansible_system_vendor 供应商(Dell)
 ansible_product_name 产品型号(PowerEdge R530)
 ansible_product_serial 序列号(sn)
 ansible_machine 计算机架构(x86_64)
 ansible_bios_version BIOS版本
 ansible_system 操作系统类型(linux)
 ansible_os_family 操作系统家族(RedHat)
 ansible_distribution 操作系统发⾏版(CentOS)
 ansible_distribution_major_version 操作系统发⾏版主版本号(7)
 ansible_distribution_release 操作系统发⾏版代号(core)
 ansible_distribution_version 操作系统发⾏版本号(7.3.1611)
 ansible_architecture 体系(x86_64)
 ansible_kernel 操作系统内核版本号
 ansible_userspace_architecture ⽤户模式体系(x86_64)
 ansible_userspace_bits ⽤户模式位数
 ansible_pkg_mgr 软件包管理器
 ansible_selinux.status selinux状态
 ansible_processor CPU产品名称
 ansible_processor_count CPU数量
 ansible_processor_cores 单颗CPU核⼼数量
 ansible_processor_threads_per_core 每个核⼼线程数量
 ansible_processor_vcpus CPU核⼼总数
 ansible_memtotal_mb 内存空间
 ansible_swaptotal_mb 交换空间
 ansible_fqdn 主机的域名
 ansible_default_ipv4.interface 默认⽹卡
 ansible_default_ipv4.address 默认IP地址
 ansible_default_ipv4.gateway 默认⽹关
 ansible_devices 硬盘设备名
 ansible_devices.vendor 硬盘供应商
 ansible_devices.model 硬盘整列卡型号
 ansible_devices.host 硬盘整列卡控制器
 ansible_devices.size 设备存储空间
 ansible_interfaces ⽹卡
 ansible_{interfaces}.ipv4.address ⽹卡IP地址
 ansible_{interfaces}.ipv6.0.address ⽹卡IPv6地址
 ansible_{interfaces}.macaddress ⽹卡mac地址

剧本⾼级特性-注册变量

应⽤场景

调试,回显命令执⾏的内容
把状态保存成变量,其他任务可以进⾏判断或引⽤
使⽤内置变量将IP地址保存到⽂本⾥,并将⽂本内容显示出来
- hosts: all
  tasks:
  - name: echo IP
    shell: "echo {{ ansible_default_ipv4.address }} >> /tmp/ip.txt"
  - name: cat IP
    shell: "cat /tmp/ip.txt"
    register: ip_txt
  - debug:
    msg: "{{ ip_txt.stdout_lines }}"
如果配置⽂件发⽣了变化**,就重启服务,**否则不重启
    - host: backup
      tasks:
      - name: copy_conf
        copy: 
          src: /root/rsyncd.conf
          dest: /etc/
        register: resync_status
      - name: start 
        systemd:
          name: rsyncd
          state: started
          enabled: yes
      - name: restart 
        systemd: 
          name: rsyncd
          state: restarted
        wehen: rsync_status.changed
    注册变量和判断场景
    场景:
    判断所有机器/root/下有没有ip.txt的⽂件
    如果有,打印出来内容并且格式为:
    例如:
    web01 has ip.txt
    内容为:
    如果不存在:
    输出内容:nfs is nofile
    解决方案
     host: all
      tasks: 
      - name: test1
          shell: cat /root/ip.txt;
          register: status
      - name: test2
        debug: 
          msg: '{{ ansible_hostname }} has ip.txt ,  content is:
    {{status.stdout}}'
        when: status is success
      - name: test3
        debug:
          msg: 'ip.txt is nofile'
        when: status is failed

    剧本⾼级特性-服务状态管理

    官⽅⽂档

    https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html#handlers-running-operations-on-change

    应⽤场景

    如果配置⽂件发⽣了变化,就重启服务
    如果配置⽂件没发⽣变化,不重启

    命令实现

    - hosts: backup
       tasks:
       - name: copy_conf
         copy:
           src: /root/script/rsync/rsyncd.conf
           dest: /etc/
         notify:
           - restart rsyncd
       - name: start
         systemd:
           name: rsyncd
           state: started
           enabled: yes
       handlers:
         - name: restart rsyncd
           systemd:
             name: rsyncd
             state: restarted

    错误总结

    handlers必须放在最后执⾏
    notify⾥的服务名称必须和handlers⾥定义的⼀样

    剧本⾼级特性-选择标签

    添加标签
    - name: enable nfs
    systemd: name=nfs enabled=yes
    tags: enable-nfs
    打印出playbook⾥要执⾏的所有标签
    ansible-playbook --list-tags rsync_install.yaml
    指定运⾏某个标签
    ansible-playbook -t '03-install nfs service' rsync_install_tag.yaml
    指定运⾏多个标签
    ansible-playbook -t 01-add-group,02-add-user,05-create-data-dir rsync_install_tag.yaml
    指定不运⾏某个标签
    ansible-playbook --skip-tags 01-add-group rsync_install_tag.yaml
    指定不运⾏多个标签
    ansible-playbook --skip-tags 01-add-group,02-add-user,04-copy-nfs-exports rsync_install_tag.yaml

    剧本⾼级特性-选择tasks

    查看task列表
    ansible-playbook --list-tasks rsync_install_tag.yaml
    选择从哪⼀个task开始执⾏
    ansible-playbook --start-at-task '05-create data dir' rsync_install_tag.yaml

    运⾏检查规范

    检查剧本拼写规范
    ansible-playbook --syntax-check rsync_install_tag.yaml
    检查这个任务执⾏的主机对象
    ansible-playbook --list-hosts rsync_install_tag.yaml
    检查这个剧本需要执⾏哪些任务
    ansible-playbook --list-tasks rsync_install_tag.yaml
    模拟执⾏剧本
    ansible-playbook -C rsync_install_tag.yaml
    真正执⾏
    ansible-playbook rsync_install_tag.yaml
    相关文章
    |
    14天前
    |
    运维 应用服务中间件 网络安全
    自动化运维的新篇章:使用Ansible进行服务器配置管理
    【10月更文挑战第34天】在现代IT基础设施的快速迭代中,自动化运维成为提升效率、确保一致性的关键手段。本文将通过介绍Ansible工具的使用,展示如何实现高效的服务器配置管理。从基础安装到高级应用,我们将一步步揭开自动化运维的神秘面纱,让你轻松掌握这一技术,为你的运维工作带来革命性的变化。
    |
    1月前
    |
    运维 Linux Apache
    Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
    Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
    59 3
    |
    1月前
    |
    运维 Linux Apache
    ,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
    【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
    54 4
    |
    1月前
    |
    运维 Linux Apache
    Puppet这一强大的自动化运维工具,涵盖其基本概念、安装配置及使用示例
    【10月更文挑战第8天】本文介绍了Puppet这一强大的自动化运维工具,涵盖其基本概念、安装配置及使用示例。Puppet通过定义资源状态和关系,确保系统配置始终如一,支持高效管理基础设施。文章详细讲解了Puppet的安装步骤、配置方法及DSL语言示例,帮助读者快速掌握Puppet的使用技巧。
    66 2
    |
    1月前
    |
    监控 虚拟化 云计算
    从物理到云:使用自动化工具简化服务器迁移流程
    【10月更文挑战第4天】随着云计算的快速发展,越来越多的企业选择将物理服务器迁移到云环境以提高效率和降低成本。本文详细介绍了使用自动化工具简化从物理到云的服务器迁移流程的技术实现细节,并提供了代码示例。
    120 6
    |
    12天前
    |
    安全 前端开发 测试技术
    如何选择合适的自动化安全测试工具
    选择合适的自动化安全测试工具需考虑多个因素,包括项目需求、测试目标、系统类型和技术栈,工具的功能特性、市场评价、成本和许可,以及集成性、误报率、社区支持、易用性和安全性。综合评估这些因素,可确保所选工具满足项目需求和团队能力。
    |
    13天前
    |
    运维 Ubuntu 应用服务中间件
    自动化运维工具Ansible的实战应用
    【10月更文挑战第36天】在现代IT基础设施管理中,自动化运维已成为提升效率、减少人为错误的关键手段。本文通过介绍Ansible这一流行的自动化工具,旨在揭示其在简化日常运维任务中的实际应用价值。文章将围绕Ansible的核心概念、安装配置以及具体使用案例展开,帮助读者构建起自动化运维的初步认识,并激发对更深入内容的学习兴趣。
    33 4
    |
    14天前
    |
    运维 监控 数据安全/隐私保护
    自动化运维工具的设计与实现
    【10月更文挑战第34天】在现代IT基础设施管理中,自动化运维工具扮演着至关重要的角色。它们不仅提高了运维效率,还确保了服务的连续性和稳定性。本文将深入探讨如何设计并实现一个自动化运维工具,从需求分析到功能实现,再到最终的测试与部署。我们将通过一个简单的代码示例来展示如何自动执行常见的运维任务,如日志清理和性能监控。文章旨在为读者提供一套完整的方法论,以便他们能够构建自己的自动化运维解决方案。
    |
    22天前
    |
    运维 应用服务中间件 调度
    自动化运维:使用Ansible实现服务器批量管理
    【10月更文挑战第26天】在当今快速发展的IT领域,自动化运维已成为提升效率、降低人为错误的关键技术手段。本文通过介绍如何使用Ansible这一强大的自动化工具,来简化和加速服务器的批量管理工作,旨在帮助读者理解自动化运维的核心概念和实践方法。文章将围绕Ansible的基础使用、配置管理、任务调度等方面展开,通过实际案例引导读者深入理解自动化运维的实现过程,最终达到提高运维效率和质量的目的。
    |
    1月前
    |
    运维 负载均衡 安全
    自动化运维:使用Ansible进行服务器配置管理
    【10月更文挑战第15天】在本文中,我们将探讨如何利用Ansible这一强大的自动化工具来简化和加速服务器的配置管理工作。通过实际案例和代码示例,我们将展示Ansible如何帮助运维人员高效地进行软件部署、系统更新和日常维护任务,从而提升工作效率并减少人为错误。
    下一篇
    无影云桌面