1.Ansible Playbook基本概述

ansible有两种执行模式,一种是用完即扔的ad-hoc模式,另一种是类似于shell 脚本的playbook模式,这里我们介绍第二种。

playbook 剧本是由一个或多个“play”组成的列表
play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。

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

2.Ansible Playbook如何工作

Ansible 模块执行任务。可以组合一个或多个 Ansible 任务来进行。可以组合两个或多个剧本来创建 Ansible Playbook。Ansible Playbook 是针对主机自动执行的任务列表。主机组构成您的 Ansible 清单。

Ansible Playbook 中的每个模块都执行特定的任务。每个模块都包含元数据,这些元数据确定执行任务的时间和地点,以及执行任务的用户。还有数以千计的其他 Ansible 模块可以执行各种 IT 任务。

3.什么是yaml

Ansible Playbook是使用YAML格式编写的自动化任务描述文件。YAML(YAML Ain’t Markup Language)是一种简洁、人类可读的数据序列化格式,非常适合用于描述数据结构和配置信息。

在Ansible中,Playbook是用于定义自动化任务的主要组件。Playbook由一系列任务组成,每个任务描述了要执行的具体操作。Playbook使用YAML格式来定义任务、变量、条件、循环、错误处理等内容。

使用YAML格式编写Playbook具有以下优点:

易于阅读和编写:YAML使用缩进和特定的符号来表示层次结构,使得Playbook的结构清晰可见。YAML的简洁语法使得Playbook易于阅读和编写,可读性强。

人类可读性:YAML的语法规则简单明了,提供了一种简洁、直观的方式来描述数据结构。这使得Playbook文件对人类来说更加可读和易于理解。

适合版本控制:YAML使用文本文件存储,易于与版本控制系统集成。这使得Playbook文件可以轻松地进行版本管理和协作开发。

灵活性:YAML支持多种数据类型和结构,可以表示复杂的数据结构和配置信息。这使得Playbook可以灵活地定义各种任务和操作。

总的来说,Ansible Playbook使用YAML格式编写,利用YAML的简洁、人类可读的特性来描述自动化任务。YAML的易读性和灵活性使得Playbook文件易于编写、理解和维护

Ansible Playbook是一个用于定义自动化任务的YAML文件。它允许您描述一系列任务,以及在哪些主机上执行这些任务。下面是Ansible Playbook YAML的一些重要概念和功能的详细介绍:

1. Playbook结构: Ansible Playbook使用YAML格式,以树状结构组织任务和配置。一个Playbook可以包含一个或多个play,每个play可以包含多个task。

2. Play: Play是一组相关的任务,它们在一组主机上执行。每个play都有一个名称、主机列表、变量和任务列表。

3. Task: Task是一个要在远程主机上执行的操作单元。每个task都有一个名称、模块和模块参数。

4. 模块(Module): 模块是Ansible的核心组件,它们提供了各种功能,如软件包管理、文件操作、服务管理等。您可以在Playbook中使用模块来执行任务。

5. 变量(Variable): 变量是存储数据的容器,可以在Playbook中使用。您可以在Playbook中定义变量,并在任务中引用它们。变量可以用于存储主机信息、配置选项、任务参数等。

6. 条件语句(Conditional Statement): 条件语句允许您根据条件来执行不同的任务。您可以在Playbook中使用条件语句来根据特定的条件执行任务。

7. 循环(Loop): 循环允许您在Playbook中迭代执行任务。您可以在Playbook中使用循环来重复执行任务,或遍历列表、字典等数据结构。

8. 注册变量(Registered Variable): 注册变量允许您将任务的输出存储到变量中,以便在后续任务中使用。您可以在任务中使用register关键字来注册变量。

9. 模板(Template): 模板允许您在Playbook中使用动态生成的文件。模板文件可以包含变量和表达式,Ansible会根据模板文件生成最终的文件。

10. 错误处理(Error Handling): Ansible Playbook提供了一些机制来处理错误。您可以使用failed_when关键字来定义任务失败的条件,并使用ignore_errors关键字来忽略错误。

11. 包含(Include): 您可以将多个Playbook组合在一起,以便复用和组织任务。使用include关键字可以将一个Playbook包含到另一个Playbook中。

以上是Ansible Playbook YAML的一些重要概念和功能。Ansible Playbook还提供了许多其他功能,如处理文件、处理文本、使用外部变量文件等

yaml 语言的特性

Ansible Playbook使用YAML语言作为其描述文件的格式。下面是一些Ansible Playbook中使用的YAML语言的特性:

层次结构:YAML使用缩进来表示层次结构,使用空格缩进来表示子项。这使得Playbook的结构清晰可见,易于阅读和理解。

键值对:YAML使用冒号(:)来分隔键和值。键是一个字符串,值可以是字符串、整数、浮点数、布尔值、null值等。

列表:YAML使用短横线(-)来表示列表项。可以在一个键下定义一个列表,每个列表项可以是一个值或一个字典。

字典:YAML使用冒号(:)来表示字典的键值对。可以在一个键下定义一个字典,字典的键可以是字符串,值可以是字符串、整数、浮点数、布尔值、null值等。

变量:YAML支持变量的定义和引用。可以在Playbook中定义变量,并在任务中使用{{ 变量名 }}来引用变量的值。

条件语句:YAML支持条件语句,可以使用if、elif和else来定义条件判断。条件语句可以根据变量的值来执行不同的任务。

循环:YAML支持循环语句,可以使用循环来重复执行任务。可以使用with_items关键字来定义循环,并在任务中使用{{ item }}来引用循环变量的值。

模板:YAML支持使用Jinja2模板语言来动态生成文件内容。可以在Playbook中使用模板来根据变量的值来生成不同的配置文件。

错误处理:YAML支持定义任务执行时发生错误时的处理方式。可以使用ignore_errors关键字来忽略错误,或使用failed_when关键字来定义任务失败的条件。

这些是Ansible Playbook中使用的一些常见的YAML语言特性。通过使用这些特性,可以编写出灵活、可读性强的自动化任务描述文件

YAML的可读性好
YAML和脚本语言的交互性好
YAML使用实现语言的数据类型
YAML有一个一致的信息模型
YAML易于实现
YAML可以基于流来处理
YAML表达能力强,扩展性好

4.Ansible Playbook与AD-Hoc的关系

Ansible Playbook和Ad-Hoc是Ansible的两种主要用法,它们之间存在一些关系和区别。

1. Ansible Playbook: Ansible Playbook是一种使用YAML语法编写的自动化任务描述文件。它允许您定义复杂的任务流程、变量、条件逻辑、循环和错误处理等。Playbook通常用于执行长期、复杂的自动化任务,可以在多个主机上执行多个任务。

2. Ad-Hoc命令: Ad-Hoc命令是一种在命令行上直接执行的单个Ansible任务。它使用简单的命令行语法,不需要编写和维护Playbook文件。Ad-Hoc命令通常用于执行简单和临时的任务,例如快速检查主机状态、执行一次性命令或在少数主机上执行任务。

关系: Ansible Playbook和Ad-Hoc都是使用Ansible进行自动化的不同方式。它们都使用相同的底层机制和模块来执行任务。Playbook可以包含Ad-Hoc命令,并且Ad-Hoc命令可以在Playbook中使用。Playbook通常用于管理复杂的自动化流程,而Ad-Hoc命令则更适合于快速执行简单任务。

区别: Ansible Playbook和Ad-Hoc在语法、用法和功能上有一些区别

Playbook使用YAML语法,具有更丰富的功能,可以定义复杂的任务流程和逻辑。Ad-Hoc命令使用简单的命令行语法。

Playbook可以在多个主机上执行多个任务,具有更高的灵活性和扩展性。Ad-Hoc命令通常只在单个主机或少数主机上执行单个任务。

Playbook可以使用变量、条件语句、循环和错误处理等功能。Ad-Hoc命令通常不支持这些高级功能。

Playbook可以被保存、版本控制和重复使用。Ad-Hoc命令是即时执行的,不需要保存和维护。

总之,Ansible Playbook和Ad-Hoc是Ansible的两种主要用法,它们在功能和用法上有所不同,但都可以用于自动化任务。选择使用哪种方式取决于任务的复杂性、持久性和灵活性要求。

5.Ansible Playbook书写格式

Ansible Playbook使用YAML语法进行编写,以下是一般的Ansible Playbook的书写格式:

---
- name: Playbook Name
  hosts: target_hosts
  become: yes
  become_user: root
  vars:
    variable_name: variable_value
  tasks:
    - name: Task Name
      module_name:
        parameter1: value1
        parameter2: value2

解释一下上述格式的各个部分:

—:这是YAML文档的开始标志。
name:Playbook的名称,用于标识和描述Playbook。
hosts:指定要在哪些主机上执行任务,可以是单个主机、主机组或使用模式匹配。
become:指定是否切换到特权用户执行任务,默认为no。
become_user:指定切换到的特权用户,默认为root。
vars:指定Playbook中使用的变量。
tasks:指定要执行的任务列表。
name:任务的名称,用于标识和描述任务。
module_name:要执行的Ansible模块的名称。
parameter1, parameter2:模块的参数,可以根据模块的要求进行设置。

此外,Ansible Playbook还支持其他功能,如条件语句、循环、错误处理、模板等。您可以在Playbook中使用这些功能来实现更复杂的自动化任务。

缩进:YAML使用固定的缩进风格表示层级结构,每个缩进由两个空格组成, 不能使用tabs
冒号:以冒号结尾的除外,其他所有冒号后面所有必须有空格
短横线:表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一列表

注意:在编写Ansible Playbook时,请注意缩进和正确的YAML语法。Ansible对于缩进和格式要求非常严格,因为它是基于YAML语法的。错误的缩进和格式可能会导致Playbook执行失败

6.Ansible Playbook的指令详细信息

当使用Ansible Playbook时,有许多常用的指令可用于执行不同的任务。以下是一些常用的指令的详细说明:

name:用于给任务或角色命名,以便描述任务的目的或作用。这个指令对于代码的可读性非常重要。

- name: Install Apache
  apt:
    name: apache2
    state: present

hosts:用于指定要在哪些主机上执行任务或角色。可以使用主机组或单个主机来定义。

- hosts: webservers
  tasks:
    - name: Install Apache
      apt:
        name: apache2
        state: present

become:以特权用户(例如root)身份执行任务。这个指令允许你在执行需要特权的操作时切换用户身份。

- hosts: webservers
  become: true
  tasks:
    - name: Install Apache
      apt:
        name: apache2
        state: present

vars:用于定义变量,以便在Playbook中重复使用。这个指令可以帮助你在不同的任务中共享数据。

- hosts: webservers
  vars:
    http_port: 80
  tasks:
    - name: Install Apache
      apt:
        name: apache2
        state: present

include:用于包含其他Playbook或任务文件。这个指令可以帮助你将复杂的Playbook拆分成更小的模块。

- include: tasks/install_apache.yml

when:根据条件判断是否执行任务。这个指令允许你根据主机属性或其他条件来选择执行特定的任务。

- name: Install Apache on Ubuntu
  apt:
    name: apache2
    state: present
  when: ansible_distribution == 'Ubuntu'

register:将任务的输出保存到变量中,以供后续任务使用。这个指令允许你捕获命令执行的结果并在后续任务中使用。

- name: Check if Apache is installed
  command: dpkg -s apache2
  register: apache_status

- name: Print Apache status
  debug:
    var: apache_status.stdout_lines

notify:在任务状态改变时触发通知。这个指令通常用于重新启动服务或执行其他操作。

- name: Restart Apache
  service:
    name: apache2
    state: restarted
  notify: Restart Apache

这些是一些常用的Ansible Playbook指令,可以根据具体的需求和场景进行使用。Ansible提供了丰富的指令和模块,可以满足各种自动化任务的需求

在Ansible Playbook中,handlers是一种特殊类型的任务,它们在特定的条件下触发。Handlers通常用于在任务执行后执行特定的操作,例如重新启动服务或执行其他操作。

Handlers的定义和使用如下所示:

handlers:
  - name: Restart Apache
    service:
      name: apache2
      state: restarted

tasks:
  - name: Install Apache
    apt:
      name: apache2
      state: present
    notify: Restart Apache

在上面的示例中,我们定义了一个名为Restart Apache的handler,它使用service模块重新启动Apache服务。然后,在安装Apache的任务中,我们使用notify指令将该handler与任务关联起来。这意味着当安装Apache的任务执行完成后,将触发Restart Apache handler。

Handlers会在Playbook的所有任务执行完成后进行处理。如果多个任务触发了相同的handler,handler只会执行一次。这样可以确保在需要时只执行一次特定的操作,而不会重复执行。

Handlers还可以使用listen指令来监听特定的事件,并在事件发生时触发。例如,可以使用listen指令来监听文件的变化,并在文件发生更改时执行特定的操作。

handlers:
  - name: Restart Apache
    service:
      name: apache2
      state: restarted
    listen: "File changed"

tasks:
  - name: Update config file
    template:
      src: config.j2
      dest: /etc/apache2/config.conf
    notify: "File changed"

在上面的示例中,我们定义了一个名为Restart Apache的handler,并使用listen指令来监听名为File changed的事件。然后,在更新配置文件的任务中,我们使用notify指令将File changed事件与该任务关联起来。这意味着当配置文件发生更改时,将触发File changed事件,并执行Restart Apache handler。

Handlers是Ansible Playbook中非常有用的功能,可以帮助你在需要时执行特定的操作,例如重新启动服务或执行其他任务

7.Ansible Playbook的使用

使用机器要在hosts文件里写上IP

剧本

创建目录

[root@ansible ~]$ mkdir -p /server/playbook

写剧本

[root@ansible /server/playbook]$ cat 01cs.yml
---
- hosts: all
  tasks:
  - name: show name
    command: hostname

测试结果

[root@ansible /server/playbook]$ ansible-playbook 01cs.yml -C

执行playbook,注意观察执行返回的状态颜色

绿色(Green):表示任务成功执行
黄色(Yellow):表示任务已经执行过,但可能有一些变化或警告
红色(Red):表示任务执行失败
蓝色(Blue):表示任务已经被跳过,因为条件不满足或者已经被标记为跳过
紫色(Purple):表示任务已经被忽略,因为之前的任务已经失败
无颜色(No color):表示任务正在执行中

使用ansible playbook安装并配置nfs服务

剧本

[root@ansible /server/playbook]$ cat 02nfs.yml 
---
- hosts: 172.16.1.78
  tasks:
  - name: install nfs
    yum: 
      name: rpcbind,nfs-utils
      state: installed
  - name: nfs copy
    copy: 
      src: ./exports.j2 
      dest: /etc/exports
      backup: yes
  - name: mkdir dir
    file:
       path: /data-nfs
       state: directory
       owner: nfsnobody
       group: nfsnobody
  - name: start rpcbind
    systemd: 
      name: rpcbind
      state: started
      enabled: yes
  - name: start nfs
    systemd: 
      name: nfs
      state: started
      enabled: yes
  - name: mount
    mount:
      src: 172.16.1.78:/data-nfs
      path: /mnt
      fstype: nfs
      state: mounted

文件(需要提前准备好文件)

[root@ansible /server/playbook]$ cat exports.j2
/data-nfs 172.16.1.0/24(rw,all_squash)

执行剧本

-C先测试

[root@ansible /server/playbook]$ ansible-playbook 02nfs.yml

挂载web服务器

[root@ansible /server/playbook]$ cat 03web-nfs.yml 
---
- hosts: web
  tasks:
  - name: web-nfs
    mount:
      src: 172.16.1.78:/data-nfs
      path: /code/backup
      fstype: nfs
      state: mounted

使用ansible安装并配置nginx服务

剧本

[root@ansible /server/playbook]$ cat 04nginx.yml 
---
- hosts: 172.16.1.78
  tasks:
  - name: nginx Repo
    yum_repository:
      name: nginx
      description: nginx repo
      baseurl: http://nginx.org/packages/centos/$releasever/$basearch/
      enabled: yes
      gpgcheck: yes
      gpgkey: https://nginx.org/keys/nginx_signing.key
  - name: install nginx
    yum:
      name: nginx
      state: installed
  - name: file
    copy: 
      content: "ansible.playbook.com"
      dest: /usr/share/nginx/html/index.html
  - name: copy nginx
    copy: 
      src: ./www.ansible.com.conf
      dest: /etc/nginx/conf.d/www.ansible.com.conf
      backup: yes
  - name: state nginx
    systemd:
    name: nginx
    state: started
    enabled: yes

执行剧本

[root@ansible /server/playbook]$ ansible-playbook 04nginx.yml

配置文件

[root@ansible /server/playbook]$ cat www.ansible.com.conf
server {
listen 80;
server_name www.ansible.com;

location / {
root /usr/share/nginx/html/;
index index.html index.php;
}
}

nginx配置文件发生变化重启

[root@ansible /server/playbook]$ cat 04nginx.yml 
---
- hosts: 172.16.1.78
  tasks:
  - name: nginx Repo
    yum_repository:
      name: nginx 
      description: nginx repo
      baseurl: http://nginx.org/packages/centos/$releasever/$basearch/
      enabled: yes
      gpgcheck: yes
      gpgkey: https://nginx.org/keys/nginx_signing.key
  - name: install nginx
    yum:
      name: nginx
      state: installed
  - name: file
    copy: 
      content: "ansible.playbook.com"
      dest: /usr/share/nginx/html/index.html
  - name: copy nginx
    copy: 
      src: ./www.ansible.com.conf
      dest: /etc/nginx/conf.d/www.ansible.com.conf
      backup: yes
      notify: Restart Nginx
  - name: state nginx
    systemd:
      name: nginx
      state: started
      enabled: yes
  handlers:
    - name: Restart Nginx
      systemd:
        name: nginx
        state: restarted

NFS配置文件发生变化重启使用多个handlers

[root@ansible /server/playbook]$ cat 02nfs.yml 
---
- hosts: 172.16.1.78
  tasks:
  - name: install nfs
    yum: 
      name: rpcbind,nfs-utils
      state: installed
  - name: nfs copy
    copy: 
      src: ./exports.j2 
      dest: /etc/exports
      backup: yes
    notify: 
      - Restart NFS 
      - Remount NFS
  - name: mkdir dir
    file:
      path: /data-nfs
      state: directory
      owner: nfsnobody
      group: nfsnobody
  - name: start rpcbind
    systemd: 
      name: rpcbind
      state: started
      enabled: yes
  - name: start nfs
    systemd: 
      name: nfs
      state: started
      enabled: yes
  - name: mount
    mount:
      src: '172.16.1.78:/data-nfs'
      path: /mnt
      fstype: nfs
      state: mounted
  handlers: 
    - name: Restart NFS
      systemd: 
        name: nfs
        state: restarted
    - name: Remount NFS
      mount:
        src: '172.16.1.78:/data-nfs'
        path: /mnt
        fstype: nfs
        state: remounted

作者 dmxsp

发表回复

您的电子邮箱地址不会被公开。