Ansible的脚本——playbook剧本

646 阅读5分钟

playbook简介

playbook是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。我们完成一个任务,例如安装部署一个httpd服务,我们需要多个模块(一个模块也可以称之为task)提供功能来完成。而playbook就是组织多个task的容器,他的实质就是一个文件,有着特定的组织格式,它采用的语法格式是YAML。

playbook本身由以下各部分组成

  • Tasks:任务,即通过 task调用 ansible的模板将多个操作组织在一个playbook中运行
  • Variables:变量
  • Templates:模板
  • Handlers:处理器,当notify所在任务满足changed状态条件时,触发执行的操作
  • Roles:角色

playbook示例

vim httpd.yaml
- hosts: webserver
  vars:
    http_port: 80
    max_clients: 200
  user: root
  tasks:
   - name: ensure apache is at the latest version
     yum: pkg=httpd state=latest
   - name: write the apache config file
     template: src=/root/test/httpd.j2 dest=/etc/httpd/conf/httpd.conf
     notify:
     - restart apache
   - name: ensure apache is running
     service: name=httpd state=started
  handlers:
   - name: restart apache
     service: name=httpd state=restarted
      
      
#---------------------playbook解释------------------------
- hosts: webserver      //定义的主机组,即应用的主机
  vars:                 //定义变量
    http_port: 80
    max_clients: 200
  user: root            //指定用户执行任务
  tasks:                //执行的任务
   - name: ensure apache is at the latest version   //自定义输出内容,任务名称
     yum: pkg=httpd state=latest        //yum模块:指定软件包和版本参数;即使用yum安装最新版的httpd
   - name: write the apache config file
     template: src=/srv/httpd.j2 dest=/etc/httpd.conf  //定义一个httpd的模板(在管理端自己创建)
     notify:     //调用下面的操作
      - restart apache    //操作的名字,在handlers下定义
   - name: ensure apache is running
     service: name=httpd state=started  //输出httpd状态
  handlers:               //处理器
   - name: restart apache          //被调用的操作名字
     service: name=httpd state=restarted  //重启httpd服务

image.png

2、执行playbook

格式:
ansible-playbook [yaml文件名]
例如:ansible-playbook ping.yml
参数:-k(–ask-pass) 用来交互输入ssh密码
     -K(-ask-become-pass) 用来交互输入sudo密码
     -u 指定用户

补充命令:
ansible-playbook XXXX.yaml --syntax-check   #检查yaml文件的语法是否正确
ansible-playbook XXXX.yaml --list-task      #检查tasks任务
ansible-playbook XXXX.yaml --list-hosts     #检查生效的主机
ansible-playbook XXXX.yaml --start-at-task='ensure apache is at the latest version'  #指定从某个task开始运行

3、hosts和users介绍

hosts: webserver #指定主机组,可以是一个或多个组。
remote_user: root #指定远程主机执行的用户名

还可以为每个任务定义远程执行用户:

vim mysql.yaml
- hosts: mysql
  remote_user: root
  tasks:
   - name: test connection
     ping:
     remote_user: li #指定远程主机执行tasks的运行用户为li

image.png

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

cd /opt
vim 1.yaml

- hosts: mysql
  remote_user: root
  tasks:
  - name: test connection
    ping:
    remote_user: mysql  
	
ansible mysql -m user -a 'name=mysql'
ansible mysql -m shell -a 'echo 123123 | passwd --stdin mysql'
ansible-playbook 1.yaml -k
123456

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

vim 2.yaml

- hosts: mysql
  remote_user: root
  become: yes         
  become_user: mysql   
  tasks:
  - name: copy text
    copy: src=/etc/fstab dest=/home/mysql/fstab.bak

ansible-playbook 2.yaml

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

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

7、Handlers介绍

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

示例

vim handler.yaml
- hosts: webserver
  remote_user: root
  tasks:
   - name: install httpd package
     yum: name=httpd state=latest
   - name: install configuration file for httpd
     copy: src=/root/handler/httpd.conf dest=/etc/httpd/conf/httpd.conf
     notify:
       - restart httpd
   - name: start httpd service
     service: enabled=true name=httpd state=started
  handlers:
   - name: restart httpd
     service: name=httpd state=restarted

image.png

image.png

image.png

8、playbook使用变量

(1)通过ansible命令传递
例如:编辑如下yaml

vim test1.yml
- hosts: mysql
  remote_user: root
  vars:
  - user:
  tasks:
  - name: add new user
    user: name={{user}}

然后执行命令: ansible-playbook test1.yml -e "user=lisi"
可以执行命令查看:ansible mysql -m shell -a 'cat /etc/shadow |grep "lisi"'

image.png

image.png

image.png

(2)直接在yaml中定义变量

vim test2.yml
- hosts: webserver
  remote_user: root
  vars:
    package: httpd
    service: httpd
  tasks:
  - name: install httpd package
    yum: name={{package}} state=latest
  - name: install configuration file for httpd
    copy: src=/root/handler/httpd.conf dest=/etc/httpd/conf/httpd.conf
    notify:
      - restart httpd
  - name: start httpd service
    service: enabled=true name={{service}} state=started
  handlers:
  - name: restart httpd
    service: name={{service}} state=restarted

image.png

image.png

image.png

image.png

(3)直接引用一些变量 引用ansible的固定变量

vim test3.yml
- hosts: mysql
  remote_user: root
  tasks:
  - name: copy file
    copy: content="{{ansible_all_ipv4_addresses}}," dest=/opt/vars.txt

image.png

image.png

引用主机变量

image.png

vim /etc/ansible/hosts
在mysql组的主机后面添加如下
[mysql]
192.168.19.18 testvar="test1111" #定义testvar变量的值为test1111

vim test3.yml #添加{{testvar}}主机变量
- hosts: mysql
  remote_user: root
  tasks:
  - name: copy file
    copy: content="{{ansible_all_ipv4_addresses}},{{testvar}}" dest=/opt/vars.txt

9、条件测试

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

vim when.yml
- hosts: mysql
  remote_user: root
  tasks:
  - name: "shutdown CentOS"
    command: /sbin/shutdown -h now
    when: ansible_distribution == "CentOS"

image.png

10、迭代

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

vim install.yaml
- hosts: webserver
  remote_user: root
  tasks:
  - name:
    command: rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
  - name: "Install Packages"
    yum: name={{ item }}
    with_items:
      - httpd
      - mysql-server
      - php

image.png

image.png