ansible 剧本(playbook)

1、剧本(playbook)简介

PlayBook即"剧本","兵书"之意,PlayBook是由以下部分组成的
 
play(host): 定义的是主机的角色。(主角还是配角)
Book(task): 定义的是具体执行的任务。(角色的台词和动作)
playbook: 由一个或多个play(角色)组成,一个play(角色)可以包含多个task(台词,动作)。

剧本的格式是一个YAML文件格式。

2、剧本(playbook)的组成

1、host	: 指定的需要操作的主机
2、vars	: 指定的是变量(非必须)
3、tasks	: 具体要执行的任务
4、remote_user : 执行时使用的用户


实战练习:
先用vim创建一个3.yaml的文件
[root@localhost ~]# vim 3.yaml
ansible 剧本(playbook)
然后在3.yaml里写入事先准备的剧本


  • hosts: web01
    tasks:
    • name: 测试ls
      shell: 'ls'
    • name: 测试安装文件
      shell: 'touch i.txt'
    • name: 安装nginx
      yum:
      name: nginx
      state: preset
      ansible 剧本(playbook)

最后用ansible-playbook命令执行
[root@localhost ~]# ansible-playbook 3.yaml
ansible 剧本(playbook)

3、剧本(playbook)的变量

1、主机清单

2、变量

	2.1、全局变量
		- hosts: web01
           vars:
             package_name: nginx

    2.2、局部变量
    	    - name: 安装Nginx
              vars:
                package_name: mariadb
              yum:
                name: "{{ package_name }}"
                state: present


    2.3、配置清单中的变量
    	[web01:vars]
         package_name=redis


    2.4、在命令行中设置变量
    	[root@localhost ansible]# ansible-playbook test.yaml -e 'package_name=mamecache'


    2.5、变量的优先级
    	在命令行中设置变量 > 局部变量 > 全局变量 > 配置清单

案例:使用剧本部署超级玛丽

- hosts: web01
  vars:
    package_name: nginx
  tasks:
    - name: 上传代码
      unarchive:
        src: /root/mario.tar.gz
        dest: /usr/share/nginx/html
        remote_src: no
    - name: 安装Nginx
      yum:
        name: "{{ package_name }}"
        state: present
    - name: 启动Nginx
      service:
        name: "{{ package_name }}"
        state: restarted

4、流程控制

4.1、条件判断(when)

案例:在CentOS系统中,安装Nginx
- hosts: web01
  tasks:
    - name: 安装Nginx
      yum:
        name: nginx
        state: present
      when: ansible_distribution == "CentOS"

and : 并且
or  : 或者


案例:判断Nginx服务是否启动
- hosts: web01
  tasks:
    - name: nginx服务监测
      script: './1.sh'
      register: check_nginx
    - name: 查看check_nginx变量
      debug: var=check_nginx
    - name: 启动Nginx
      service:
        name: nginx
        state: started
      when: check_nginx.rc == 0
      
[root@localhost ansible]# cat 1.sh 
#!/bin/bash
function main() {
    RES=`systemctl is-active nginx`
    if [ $RES == 'unknown' ];then
      return 1
    else
      return 0
    fi
}
main

4.2、循环流程(with_item、items)

案例:要求安装nginx、mariadb等软件
- hosts: web01
  tasks:
    - name: 安装Nginx
      yum:
        name: "{{ item }}"
        state: present
      with_items:
        - nginx
        - mariadb

案例:要求安装Nginx、卸载mariaDB
- hosts: web01
  tasks:
    - name: 安装Nginx
      yum:
        name: "{{ item.name }}"
        state: "{{ item.state }}"
      with_items:
        - {"name":"nginx","state":"present"}
        - {"name":"mariadb","state":"absent"}
        
        
安装:nginx、mariadb
卸载:redis

5、在某种条件下执行任务

案例:要求在安装完成之后再启动Nginx
- hosts: web01
  tasks:
    - name: 安装Nginx
      yum:
        name: "{{ item.name }}"
        state: "{{ item.state }}"
      with_items:
        - {"name":"nginx","state":"present"}
      notify: 启动Nginx
  handlers:
    - name: 启动Nginx
      service:
        name: nginx
        state: restarted

6、标签

- hosts: web01
  tasks:
    - name: 安装Nginx
      yum:
        name: "{{ item.name }}"
        state: "{{ item.state }}"
      with_items:
        - {"name":"nginx","state":"present"}
      tags: nginx

    - name: 安装mariadb
      yum:
        name: mariadb
        state: present
      tags: mairadb


[root@localhost ansible]# ansible-playbook test.yaml -t mairadb,nginx
[root@localhost ansible]# ansible-playbook test.yaml -t mairadb
上一篇:尝试 clickhouse operator


下一篇:主从服务器配置(R...name too long )