Ansible之playbook剧本编写(一)

一、 playbook概述

1、简介

playbook是ansible用于配置,部署,和管理被控节点的剧本。通过playbook的详细描述,执行其中的tasks,可以让远端主机达到预期的状态。

playbook是由一个或多个”play”组成的列表。 当对一台机器做环境初始化的时候往往需要不止做一件事情,这时使用playbook会更加适合。通过playbook你可以一次在多台机器执行多个指令。通过这种预先设计的配置保持了机器的配置统一,并很简单的执行日常任务。

ansible通过不同的模块实现相应的管理,管理的方式通过定义的清单文件(hosts)所管理的主机包括认证的方式连接的端口等。所有的功能都是通过调用不同的模块(modules)来完成不同的功能的。不管是执行单条命令还是play-book都是基于清单文件。

 2、playbook的各部分组成

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

二、playbook 剧本编写

例一:playbook编写 apache的yum安装部署剧本

vim play1.yaml

- name: first play
  gather_facts: false
  hosts: dbservers
  remote_user: root
  tasks:
  - name: disable firewalld
    service: name=firewalld state=stopped enabled=no
  - name: disable selinux
    command: 'setenforce 0'
    ignore_errors: yes
  - name: copy local yum repo
    copy: src=/etc/yum.repos.d/local.repo dest=/etc/yum.repos.d/local.repo
  - name: mount cdrom
    mount: src=/dev/sr0 path=/mnt fstype=iso9660 state=mounted
  - name: install http
    yum: name=httpd state=latest
  - name: start httpd
    service: name=httpd state=started enabled=yes

运行剧本

//运行playbook
ansible-playbook play1.yaml --syntax-check #检查是否有语法错误
ansible-playbook play1.yaml
 
//补充参数:
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户
ansible-playbook apache.yaml --syntax-check    #检查yaml文件的语法是否正确
ansible-playbook apache.yaml --list-task       #检查tasks任务
ansible-playbook apache.yaml --list-hosts      #检查生效的主机
ansible-playbook apache.yaml --start-at-task='install httpd'     #指定从某个task开始运行

剧本的相关操作:

ansible-playbook play1.yaml --list-task
#查看所有的task任务

ansible-playbook play1.yaml --start-at-task='install httpd'
#指定从install httpd任务开始执行

2、 定义、引用变量

- name: second play
  remote_user: root
  hosts: dbservers
  vars:
  - myname: ikun
  - myclass: jinitaimei
  tasks:
  - name: create group
    group: name={{myclass}}
  - name: create user
    user: name={{myname}} groups={{myclass}}

使用facts信息做变量

  - name: copy file
    copy: content={{ansible_default_ipv4}}  dest=/opt/vars.txt
                                                          

模块参数的纵向写法 :

  在命令行里定义变量 

 ansible-playbook play2.yaml -e "myname=kunkun"  

3、指定远程主机sudo切换用户

---
- hosts: dbservers
  remote_user: zhangsan            
  become: yes	                 #2.6版本以后的参数,之前是sudo,意思为切换用户运行
  become_user: root              #指定sudo用户为root
执行playbook时:ansible-playbook test1.yml -k -K 

vim play2.yaml
- name: second play
  remote_user: zhuxiang
  become: yes                              #2.6版本以后的参数,之前是sudo,意思为切换用户运行
  become_user: root                        #指定sudo用户为root
  hosts: dbservers
  gather_facts: true
  vars:
  - myname: ikun
  - myclass: jinitaimei
  tasks:
  - name: create group
    group: name={{myclass}}
  - name: create user
    user: name={{myname}} groups={{myclass}}
 
  - name: copy file
    copy: content={{ansible_default_ipv4.network}} dest=/opt/ipv4.txt
 
ansible-playbook play2.yaml -k -K
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码

4、when条件判断

在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。

案例:将192.168.10.10主机中/opt/目录下的abc.sh脚本文件复制到192.168.10.22中,并在192.168.10.21中运行。

- name: third play
  remote_user: root
  hosts: dbservers
  gather_facts: true
  tasks:
  - name: copy abc.sh to 192.168.10.22
    copy: src=/opt/abc.sh dest=/opt/
    when: ansible_default_ipv4.address == "192.168.10.22"

  - name: run abc.sh on 21
    script: '/opt/abc.sh ikun sing_jump_rap_basketball'
    when: inventory_hostname != "192.168.10.22"
~                                                 

5、迭代

Ansible提供了很多种循环结构,一般都命名为with_items。

- name: fourth play
  remote_user: root
  hosts: dbservers
  gather_facts: no
  tasks:
  - name: create users
    user: name={{item}} groups=jinitaimei
    with_items:
    - kunkun01
    - kunkun02
    - kunkun03

使用迭代循环创建多个用户并加入不同组:

- name: fourth play
  remote_user: root
  hosts: dbservers
  gather_facts: no
  vars:
  - mygroups: ["ikun01", "ikun02", "ikun03"]
  tasks:
  - name: create groups
    group: name={{item}}
    with_items: "{{mygroups}}"

  - name: create users
    user: name={{item.myname}} groups={{item.myclass}}
    with_items:
    - myname: kunkun01
      myclass: ikun01
    - myname: kunkun02
      myclass: ikun02
    - myname: kunkun03
      myclass: ikun03

总结:

 vim XXX.yaml   XXX.yml
- name:                        #设置play的名称(一个playbook文件里可以有多个play)
  hosts:                       #设置执行此play的远程主机组,多个组用 : 分隔
  remote_user:                 #设置在远程主机执行此play的用户名,默认为root
  become: yes                  #设置是否需要在远程主机sudo切换执行任务
  become_user: root            #设置sudo切换的用户,一般为root
  gather_facts: true|false     #设置是否收集facts信息,默认为true
  vars:                        #设置此play中使用的自定义变量
  - 变量1: 值1
  - 变量2: 值2
  tasks:                       #设置此play的任务列表
  - name:                         #定义任务的名称
    模块名: 模块参数              #定义此任务要使用的模块和参数(键值对格式 key=value)
  - name:           
    模块名: 模块参数
    ignore_errors: true           #忽略此任务可能的失败(如果不忽略,则任务失败会导致中断后续任务的执行)
  - name:           
    模块名: 模块参数
    when: 条件表达式              #条件表达式成立则执行此任务,不成立则不执行此任务
  - name:           
    模块名: 模块参数={{item}}     #循环遍历
    with_items:                   #定义循环的取值列表
  - name:           
    模块名: 模块参数
    notify: '任务名'              #定义此任务执行状态为changed时要触发的handler任务
 
  handlers:                    #设置notify触发的任务
  - name: 任务名
    模块名: 模块参数
 
 
playbook运行命令
ansible-playbook XXX.yaml -u <远程用户> -k
                          --become-user <sudo切换的用户> -K
                          --syntax-check
                          --list-task
                          --list-hosts
                          --start-at-task="任务名"
                          -e "变量=值"
 
模块参数的格式
横向格式:
  模块名: 参数1=值  参数2={{变量名}}  ....
 
纵向格式:
  模块名: 
    参数1: 值
    参数2: "{{变量名}}"
    ....
 
 
vars 和 with_items 的格式
#值为纯量类型时:
tasks:
- name:
  模块名: 参数1={{item}}
  with_items:
  - 值1                                 #纵向格式:
  - 值2
  ....
 
tasks:
- name:
  模块名: 参数1={{item}}
  with_items: ["值1", "值2", ....]     #横向格式
 
 
#先使用vars定义循环取值列表,再用with_items引用vars的变量
vars:
- 变量1:
  - 值1                                #纵向格式
  - 值2
  ....
- 变量2: ["值1", "值2", ....]          #横向格式
 
tasks:
- name:
  模块名: 参数1={{item}}
  with_items: "{{变量1}}"         #使用with_items引用vars的变量
- name:
  模块名: 参数1={{item}}
  with_items: "{{变量2}}"
  
 
#当值为对象类型(键值对)时:
tasks:
- name:
  模块名: 参数1={{item.key1}}  参数2={{item.key2}}
  with_items: 
  - key1: 值1                    #纵向格式
    key2: 值2
  - key1: 值3
    key2: 值4
  ....
  
  with_items:
  - {key1: 值1, key2: 值2}      #横向格式
  - {key1: 值3, key2: 值4}
  ....
    
    
vars:
- 变量1: 
  - key1: 值1                    #纵向格式
    key2: 值2
  - key1: 值3
    key2: 值4
  ....
- 变量2:
  - {key1: 值1, key2: 值2}      #横向格式
  - {key1: 值3, key2: 值4}
  ....
tasks:
- name:
  模块名: 参数1={{item.key1}}  参数2={{item.key2}}
  with_items: "{{变量1}}"    

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值