• Ansible自动化运维工具(二)playbook剧本


    目录

    一、playbook

    1、playbook简介

    2、playbook使用场景

    3、yaml基本语法规则

    4、yaml支持的数据结构

    二、Inventory中的变量

    1、inventor变量参数

    三、playbook示例

    1、为每个任务定义远程执行用户 

    2、指定远程主机切换用户执行剧本

    3、tasks忽略错误,强制返回成功

    4、针对多个主机节点执行剧本

    5、Handlers概述

    6、引入变量

    6.1 通过ansible命令参数-e传递

    6.2 直接在yaml中定义,或者内置变量

    6.3 引用主机清单内自定义变量

    7、条件测试

    7.1 单条件判断

    7.2 多条件判断

    7.3 组条件判断

    7.4 迭代


    一、playbook

    1. playbook是剧本的意思
    2. 通过 task 调用 ansible 的模块将多个 play 组织在一 个playbook中运行。

    playbook本身由以下各部分组成:

    1. Tasks: 任务,即调用模块完成的某操作
    2. Variables: 变量
    3. Templates: 模板
    4. Handlers: 处理器,当某条件满足时,触发执行的操作
    5. Roles: 角色
    6. playbook yaml语法是换行空两格,-和:后必须空一格

    playbook由YMAL语言编写,YAML是一种非标记语言。是用来写配置文件的语言,非常简洁合强大

    1. YAML语法和其他语言类似,也可以表达散列表、标量等数据结构
    2. 结构通过空格来展示,
    3. 序列里配置项通过 - 来表示
    4. Map里的键值用:来分隔
    5. YAML的扩展名为yaml
       

    1、playbook简介

    1. Playbooks 是 Ansible的配置、部署、编排语言,他们可以被描述为一个需要希望远程主机执行命令的方案,或者一组IT程序运行的命令集合
    2. Playbooks 与 ad-hoc相比,是一种完全不同的运用ansible的方式,是非常之强大的。
    3. 简单来说,playbooks是一种简单的配置管理系统与多机器部署系统的基础,与现有的其他系统有不同之处,且非常适合于复杂应用的部署。
    4. playbook是ansible用于配置,部署,和管理被控节点的剧本
    5. 通过playbook的详细描述,执行其中的一系列tasks,可以让远端主机达到预期的状态。playbook就像Ansible控制器给被控节点列出的的一系列to-do-list,而被控节点必须要完成。
    6. 也可以这么理解,playbook 字面意思,即剧本,现实中由演员按照剧本表演,在Ansible中,这次由计算机进行表演,由计算机安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情
       

    2、playbook使用场景

    1. 执行一些简单的任务,使用ad-hoc命令可以方便的解决问题,但是有时一个设施过于复杂,需要大量的操作时候,执行的ad-hoc命令是不适合的,这时最好使用playbook。
    2. 就像执行shell命令与写shell脚本一样,也可以理解为批处理任务,不过playbook有自己的语法格式。
    3. 使用playbook你可以方便的重用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码。在你使用Ansible的过程中,你也会发现,你所处理的大部分操作都是编写playbook。可以把常见的应用都编写成playbook,之后管理服务器会变得十分简单。
       

    3、yaml基本语法规则

    1、大小写敏感
    2、使用缩进表示层级关系
    3、缩进时不允许使用tab键、只允许使用空格
    4、缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

    hosts定义节点,可以是组
    remote_user是你以什么用户身份进行登陆
    tasks是你的任务
    become:yes表示切换用户
    become_user: mysql表示切换到mysql用户,配合上一条使用
    - name:为下面执行的操作起名

    4、yaml支持的数据结构

    1. 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes)/ 字典(dictionary)
    2. 数组:一组按次序排列的值,又称为序列(sequence)/ 列表(list)
    3. 纯量:单个的、不可再分的值

    二、Inventory中的变量

    Inventory是Ansible管理主机信息的配置文件,相当于系统HOSTS文件的功能,默认存放在/etc/ansible/hosts

    主机变量

    1. [web1]
    2. www.zhangbin.com
    3. www.lichen.com

    组变量

    [servers:vars]
    

    组嵌套

    1. [web1]
    2. www.zhangbin.com
    3. www.lichen.com
    4. [web2]
    5. www.lcdb.com
    6. www.lc2b.com
    7. [webservers]
    8. web1
    9. web2

    1、inventor变量参数

    参数说明
    ansible_ssh_host将要连接的远程主机名,与你想要设定的主机的别名不同的话,可通过此变量设置
    ansible_ssh_portssh端口号,如果不是默认的端口号,通过此变量设置
    ansible_ssh_user默认的ssh用户名
    ansible_ssh_passssh密码(这种方式并不安全,我们强烈建议使用 --ask-pass或SSH密钥)
    ansible_ssh_private_key_filessh使用的私钥文件,适用于有多个密钥,而你不想使用SSH代理的情况
    ansible_ssh_common_args此设置附加到sftp,scp和ssh的缺省命令行
    ansible_sftp_extra_args此设置附加到默认sftp命令行
    ansible_scp_extra_args此设置附加到默认scp命令行
    ansible_ssh_extra_args此设置附加到默认ssh命令行
    ansible_ssh_pipelining确定是否使用SSH管道。这可以覆盖ansible.cfg中得到设置
    ansible_shell_type目标系统的shell类型,默认情况下,命令的执行使用sh语法,可设置为csh 或 fish
    ansible_python_interpreter目标主机的python路径,适用于的情况:系统中有多个python,或者命令路径不是“/usr/bin/python”
    ansible_*_interpreter这里的*可以是ruby或perl或其他语言的解释器,作用和ansible_python_interpreter类似
    ansible_shell_executable这将设置ansible控制器将在目标机器上使用的shell,覆盖ansible.cfg中的配置,默认为/bin/sh

        

    三、playbook示例

    基本命令介绍

    1. ansible-playbook xxx.yaml --syntax-check #检查yaml文件的语法是否正确
    2. ansible-playbook xxx.yaml --list-task #检查tasks任务
    3. ansible-playbook xxx.yaml --list-hosts #检查生效的主机
    4. ansible-playbook xxx.yaml --start-at-task='xxx' #指定从某个task开始运行
    5. - hosts: webserver #指定主机组,可以是一个或多个组
    6. remote_user: root #指定远程主机执行的用户名
    参数说明
    -k(-ask-pass)用来交互输入ssh密码
    -K(-ask-become-pass)用来交互输入sudo密码
    -u指定用户
    -e引入变量值

    1、为每个任务定义远程执行用户
     

    1. cd /opt
    2. vim 1.yaml
    3. - hosts: mysql
    4. remote_user: root
    5. tasks:
    6. - name: test connection
    7. ping:
    8. remote_user: mysql
    9. ansible mysql -m user -a 'name=mysql'
    10. ansible mysql -m shell -a 'echo 123456 | passwd --stdin mysql'
    11. ansible-playbook 1.yaml -k
    12. 123456

    2、指定远程主机切换用户执行剧本

    1. vim 2.yaml
    2. - hosts: mysql
    3. remote_user: root
    4. become: yes
    5. become_user: mysql
    6. tasks:
    7. - name: copy text
    8. copy: src=/etc/fstab dest=/home/mysql/fstab.bak
    9. ansible-playbook 2.yaml

    3、tasks忽略错误,强制返回成功

    1. Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始。在运行playbook时 (从上到下执行),如果一个host执行task失败, 整个tasks都会停止。
    2. 每一个task必须有一个名称 name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。

    错误示例:遇到错误task自动停止,apache服务不会继续安装

    1. vim 3.yaml
    2. - hosts: webserver
    3. remote_user: root
    4. tasks:
    5. - name: stop selinux
    6. command: '/usr/sbin/setenforc 0'
    7. - name: install httpd
    8. yum: name=httpd
    9. - name: start httpd
    10. service: name=httpd state=started
    11. ansible-playbook 3.yaml

    加入ignore_errors: True 忽略错误,报错后继续执行

    1. vim 3.yaml
    2. - hosts: webserver
    3. remote_user: root
    4. tasks:
    5. - name: stop selinux
    6. command: '/usr/sbin/setenforc 0'
    7. ignore_errors: True
    8. - name: install httpd
    9. yum: name=httpd
    10. - name: start httpd
    11. service: name=httpd state=started
    12. ansible-playbook 3.yaml

    4、针对多个主机节点执行剧本

    1. vim 4.yaml
    2. - hosts: webserver
    3. remote_user: root
    4. tasks:
    5. - name: remove httpd
    6. yum: name=httpd state=absent
    7. - hosts: mysql
    8. remote_user: root
    9. tasks:
    10. - name: copy file
    11. copy: src=/etc/fstab dest=/opt/haha.txt

    5、Handlers概述


    Handlers也是一些task的列表, 和一般的task并没有什么区别。
    是由通知者进行的notify(通知),如果没有被notify,则Handlers不会执行,假如被notify了 ,则Handlers被执行不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次

    1. vim 5.yaml
    2. - hosts: webserver
    3. remote_user: root
    4. tasks:
    5. - name: remove httpd
    6. yum: name=httpd state=absent
    7. - name: start firewalld
    8. service: name=firewalld state=started
    9. - name: setenforce 0 && install httpd
    10. command: '/usr/sbin/setenforce 0'
    11. notify:
    12. - step one
    13. - name: stop firewalld && start httpd
    14. service: name=firewalld state=stopped
    15. notify:
    16. - step two
    17. handlers:
    18. - name: step one
    19. yum: name=httpd
    20. - name: step two
    21. service: name=httpd state=started
    22. ansible-playbook 5.yaml

    6、引入变量

    playbook引入变量有三种方式

    1. 通过ansible命令参数-e传递
    2. 直接在yaml中定义
    3. 引用主机清单中定义的变量

    6.1 通过ansible命令参数-e传递

    1. vim 6_1.yaml
    2. - hosts: mysql
    3. remote_user: root
    4. vars:
    5. - user:
    6. tasks:
    7. - name: add user
    8. user: name={{user}}
    9. ansible-playbook 6_1.yaml -e "user=wangwu"
    10. ansible mysql -a 'tail -1 /etc/passwd'

    6.2 直接在yaml中定义,或者内置变量

    1. vim 6_2.yaml
    2. - hosts: mysql
    3. remote_user: root
    4. vars:
    5. - user: lisi
    6. tasks:
    7. - name: add user
    8. user: name={{user}}
    9. ansible-playbook 6_2.yaml
    10. ansible mysql -a 'tail -1 /etc/passwd'
    1. vim 6_2.yaml
    2. - hosts: mysql
    3. remote_user: root
    4. tasks:
    5. - name: copy file
    6. copy: content="{{ansible_all_ipv4_addresses}}" dest=/opt/vars.txt
    7. ansible-playbook 6_2.yaml
    8. ansible mysql -a 'ls /opt'
    9. ansible mysql -a 'cat /opt/vars.txt'

    6.3 引用主机清单内自定义变量

    1. vim /etc/ansible/hosts
    2. [webserver]
    3. 192.168.184.20
    4. [mysql]
    5. 192.168.184.30 user=zhaoliu
    6. vim 6_3.yaml
    7. - hosts: mysql
    8. remote_user: root
    9. tasks:
    10. - name: add user
    11. user: name={{user}}
    12. ansible-playbook 6_3.yaml
    13. ansible mysql -a 'tail -1 /etc/passwd'

    7、条件测试

    如果需要根据变量、facts (setup) 或此前任务的执行结果来作为某task执行与否的前提时要用到条件测试,在Playbook中条件测试使用。在task后添加when子句即可使用条件测试: when子句支持 jinjia2 表达式或语法

    7.1 单条件判断

    1. vim 7_1.yaml
    2. - hosts: mysql
    3. remote_user: root
    4. tasks:
    5. - name: "shutdown CentOS"
    6. command: /sbin/shutdown -h now
    7. when: ansible_distribution == "CentOS"
    8. ansible-playbook 7_1.yaml

    7.2 多条件判断

    1. vim 7_2.yaml
    2. - hosts: mysql
    3. remote_user: root
    4. tasks:
    5. - name: "shut down CentOS 7 systems"
    6. command: /sbin/shutdown -r now
    7. when:
    8. - ansible_distribution == "CentOS"
    9. - ansible_distribution_major_version == "7"
    10. ansible-playbook 7_2.yaml

    7.3 组条件判断

    1. vim 7_3.yml
    2. - hosts: mysql
    3. remote_user: root
    4. tasks:
    5. - name: "shut down CentOS 6 and Debian 7 systems"
    6. command: /sbin/shutdown -t now
    7. when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "6") or (ansible_distribution == "Debian" and ansible_distribution_major_version == "7")
    8. ansible-playbook 7_3.yaml

    7.4 迭代

    当有需要重复性执行的任务时,可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句指明迭代

    1. vim 7_5.yaml
    2. - hosts: webserver
    3. remote_user: root
    4. tasks:
    5. - name: install
    6. yum: name={{item}} state=latest
    7. with_items:
    8. - httpd
    9. - rpcbind
    10. - nfs-utils
    11. ansible-playbook 7_5.yaml
    12. ansible webserver -a 'rpm -q httpd'
    13. ansible webserver -a 'rpm -q rpcbind'
    14. ansible webserver -a 'rpm -q nfs-utils'

    也可以自己定义item变量

    1. vim 7_5.yaml
    2. - hosts: webserver
    3. remote_user: root
    4. tasks:
    5. - name: add user && join group
    6. user: name={{item.x}} state=present group={{item.y}}
    7. with_items:
    8. - {x: 'qianqi', y: 'wheel'}
    9. - {x: 'sicong', y: 'root'}
    10. ansible-playbook 7_5.yaml
    11. ansible webserver -a 'tail -2 /etc/passwd'

  • 相关阅读:
    平面上最接近点对(分治法)
    javaJdk说明
    etc-day30
    Linux驱动开发(十三)---USB驱动HID开发学习(鼠标)
    操作系统实验二:进程同步程序设计
    新学期的分享,立个flag吧
    深度学习推荐系统(七)NFM模型及其在Criteo数据集上的应用
    Day02_《MySQL索引与性能优化》
    CSS基础
    QML中使用自定义Model和SortFilterProxyModel实现搜索
  • 原文地址:https://blog.csdn.net/qq_45088125/article/details/126202714