ansible的脚本—playbook剧本

目录

一、playbook

1、简介

2、playbook组成部分:

3、如何编写Playbook?

4、语句的横向/纵向写法

二、playbook模版实例:

1、playbook模版:

2、playbook的条件判断:

3、playbook中的循环:

4、循环练习:


一、playbook

1、简介


Playbook 剧本是由一个或多个play组成的列表。

play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。

Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作

Playbook 文件是采用YAML语言编写的。
 

2、playbook组成部分:

1、tasks任务:包含要在目标主机上执行的操作,使用模块定义这些操作。每个任务都是一个模块的调用。

2、variables变量:存储和传递数据,和shell脚本中的变量是一个意思,可以在playbook当中定义为全局变量,也可以在外部传参。

3、templates模版:主要用于生成配置文件。模版是包含占位符的文件。占位符由ansible在执行时转化为变量值

4、handlers处理器:当需要有变更的时候,可以执行触发器

5、roles角色:类似于docker-compose,是一种组织和封装playbook的。允许把相关的任务,变量和模版和处理器组织成一个可复用的单元

3、如何编写Playbook?

xxx.yaml/xxx.yml
--- #表示开始
- name:  #指定play的名称
  hosts: #指定主机清单中定义的主机组名
  remote_user: #指定远程主机的执行用户
  grather_facts: ture|fales #指定是否要收集远程主机的facts信息
  vars:   #自定义变量,只能在当前play有效
    - 变量1: 值1  #格式为key: value
    - 变量2: 值2
  tasks: #定义任务列表,默认从上往下依次执行
    - name: #定义任务的名称
      模块名: 模块参数        
      ignore errors: true  #忽略任务的失败
    - name: #可以定义多个任务
      模块名: 模块参数  
      notify: 任务名  #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作
      ##条件判断##
     - name:
       模块名: 模块参数
       when: #定义条件表达式(== != > < >= <=),条件成立时执行此task任务,否则不执行任务
       ##循环##
     - name:
       模块名: 模块参数={
  {item}}
       with_items: #定义循环列表
     ##tags模块,标签## 
     - name: 
       模块名: 模块参数 
       tags:
       - 标签1
       - 标签2
        
  handlers: 
    - name: 任务名  #和notify中的任务名相同
      模块名: 模块参数

#无注释版
---
- name: 
  hosts: 
  remote_user:
  grather_facts: ture|fales 
  vars:
    - 变量1: 值1
    - 变量2: 值2
  tasks:
    - name:
      模块名: 模块参数        
      ignore errors: true
    - name:
      模块名:
      notify: 任务名
     - name:
       模块名:
       when:
     - name:
       模块名: 模块参数={
  {item}}
       with_items:
  handlers: 
    - name: 任务名
      模块名: 模块参数

4、语句的横向/纵向写法

task任务的模块语法格式
横向格式:
模块名: 参数1=值 参数2={
  {变量名}} ...

纵向格式:
模块名:
  参数1: 值
  参数2: "{
  {变量名}}"
  ...
  
with_items 和 vars 的语法格式
横向格式:
with_items: ["值1", "值2", "值3", ...]

值为对象(键值对字段)时:
with_items:
- {key1: "值1", key2: "值2"}
- {key1: "值3", key2: "值4"}
...

纵向格式:
with_items:
- 值1
- 值2
- 值3
...

值为对象(键值对字段)时:
with_items:
- key1: "值1"
  key2: "值2"
- key1: "值3"
  key2: "值4"
...

二、playbook模版实例:

1、playbook模版:

ansible-playbook test1.yml
执行脚本

ansible-playbook test1.yml --start-at-task='install httpd'
从指定任务模块开始执行

ansible-playbook test1.yml --syntax-check
检查yml文件的语法是否正确

ansible-playbook test1.yml --list-task
检查有多少tasks任务

ansible-playbook test1.yml --list-hosts
检查在哪台主机生效

若要切换用户,比如从koeda切换到root用户

71行要取消注释

hosts中:

改过用户,运行时的命令

ansible-playbook test1.yml -K(大K)

-K:输入密码

若脚本中没有指定用户,可以命令指定:

ansible-playbook test1.yml -u root -k(小k)

模版实例2:

#this is second
#声明和引用变量,以及外部传参
- hosts: 192.168.10.201
  remote_user: root
  vars:
    groupname: guoqi
    username: wangdefu
  tasks:
   - name: create group
     group:
        name: "{
  { groupname }}"
        system: yes
        gid: 111
   - name: create user
     user:
       name: "{
  { username }}"
       uid: 1011
       group: "{
  { groupname }}"
       shell: /sbin/nologin
   - name: copy file
     copy:
       content: "{
  { hostvars[inventory_hostname]['ansible_default_ipv4']['address']}}"
       dest: /opt/ky32.txt
#获取目标的ip地址,然后复制到目标文件

vars:
    groupname: koeda
    username: koeda
字典方式:key-value
"{
  { hostvars[inventory_hostname]['ansible_default_ipv4']['address']}}"
包含所有主机变量的字典
inventory_hostname:目标主机的主机名
ansible_default_ipv4:获取目标主机的IP地址

也可以里面不指定变量参数,外部传参:

ansible-playbook test2.yaml -e 'username=koeda groupname=koeda'

2、playbook的条件判断:

when 是一个比较常见的应用场景,实现满足条件即执行,不满足条件即跳过的任务

when是满足条件即执行,不满足不执行

- hosts: all

  remote_user: root

  tasks:

   - name: nginx when

     yum: name=nginx

     when: ansible_default_ipv4.address == '20.0.0.25'

   - name: nginx info

     debug:

       msg: "安装nginx"

     when: ansible_default_ipv4.address == '20.0.0.25'

   - name: httpd when

     yum: name=httpd

     when: ansible_default_ipv4.address == '20.0.0.26'

   - name: httpd info

     debug:

       msg: "安装httpd"

     when: ansible_default_ipv4.address == '20.0.0.26'

3、playbook中的循环:

四种循环方式:

with_items 最常用的

with_list 列表分组循环

with_together 列表对应的列中,以数据结合的方式循环

with_nested 相当于双层循环,第一层定义了循环的次数,第二层表示第一层中的每个元素会循环几次

ansible有多中循环格式:

with_items 循环遍历

- hosts: 20.0.0.25
  remote_user: root
  gather_facts: false
  tasks:
   - debug:
       msg: "{
  { item }}"
     with_items: [a,b,c,d]

- hosts: 20.0.0.25
  remote_user: root
  gather_facts: false
  tasks:
   - debug:
       msg: "{
  { item }}"
     with_items:
      - [a,b,c,d]
      - [1,2,3,4]

with_list:列表输出

- hosts: 20.0.0.25
  remote_user: root
  gather_facts: false
  tasks:
   - debug:
       msg: "{
  {item}}"
     with_list:
      - [a,b,c]
      - [1,2,3]

练习:

- hosts: 20.0.0.25
  remote_user: root
  gather_facts: false
  tasks:
   - name: create
     file:
       path: "{
  {item}}"
       state: touch
     with_items:
      - /opt/a
      - /opt/b
      - /opt/1
      - /opt/2

with_together:组合输出

组循环,列表中的值,一一对应打印出来

- hosts: 20.0.0.25
  remote_user: root
  gather_facts: false
  tasks:
   - debug:
       msg: "{
  {item}}"
     with_together:
      - [a,b,c]
      - [1,2,3]
      - [A,B]

循环嵌套:

- hosts: 20.0.0.25
  remote_user: root
  gather_facts: false
  tasks:
   - debug:
       msg: "{
  {item}}"
     with_nested:
      - [a,b,c]
      - [1,2,3]

4、循环练习:

创建用户test1、test2,用户组分别为dn1、dn2

- name: play1
  hosts: 20.0.0.25
  gather_facts: false
  tasks:
   - name: create group
     group:
       name: "{
  { item }}"
       state: present
     with_items:
       - 'dn1'
       - 'dn2'
   - name: create user
     user:
       name: "{
  { item.name }}"
       state: present
       groups: "{
  { item.groups }}"
     with_items:
       - {name: 'test1', groups: 'dn1'}
       - {name: 'test2', groups: 'dn2'}

yum 一键安装多个软件  tree sl nginx httpd vsftpd dhcp

- name: play2
  hosts: 20.0.0.25
  gather_facts: false
  tasks:
   - name: create tree sl nginx httpd vsftpd dhcp
     yum:
       name: "{
  { item }}"
     with_list:
       - tree
       - sl
       - nginx
       - httpd
       - vsftpd
       - dhcp

相关推荐

  1. ansible脚本playbook剧本

    2023-12-21 10:56:04       31 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-21 10:56:04       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-21 10:56:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-21 10:56:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-21 10:56:04       20 阅读

热门阅读

  1. Mybatis配置-映射器(mappers)

    2023-12-21 10:56:04       39 阅读
  2. Vite 打包时修改静态资源的路径

    2023-12-21 10:56:04       42 阅读
  3. 服务器不稳定因素

    2023-12-21 10:56:04       36 阅读
  4. Python基础语法:使用Python编写一个简单的计算器

    2023-12-21 10:56:04       40 阅读
  5. Linux 内核参数:vmallocinfo

    2023-12-21 10:56:04       48 阅读
  6. 数组深入学习感悟

    2023-12-21 10:56:04       50 阅读
  7. 《微信小程序开发从入门到实战》学习五十七

    2023-12-21 10:56:04       40 阅读
  8. 讲诉JVM

    2023-12-21 10:56:04       37 阅读
  9. QML基础类型之Size - 编程指南

    2023-12-21 10:56:04       40 阅读
  10. qiankun(乾坤)微前端框架简介

    2023-12-21 10:56:04       28 阅读