【Ansible】Ansible playbook

Ansible playbook简介

Ansible playbook是一种用于描述和自动化IT基础设施配置和管理的工具。它使用YAML格式来定义一系列任务和配置项,并利用Ansible的执行引擎自动执行这些任务。

Playbook包含一个或多个play,每个play定义了一组任务,这些任务将在目标主机上执行。每个任务可以是一个模块(例如复制文件、安装软件等),也可以是一个自定义的脚本。

Playbook还可以定义变量、条件语句、循环和其他控制结构,以实现更复杂的配置和管理逻辑。可以使用Ansible的模块来管理主机的各种资源,如文件、用户、服务等。

通过使用Ansible playbook,可以实现自动化的部署、配置和管理,提高系统的可靠性和可维护性,并减少人工干预的工作量。它还可以根据需要进行扩展和定制,以满足不同环境和需求的要求。

playbook结构

Playbook结构是一个Ansible playbook文件的组织结构。一个Ansible playbook是一个用来描述一组关联主机上执行任务的文件。

Playbook结构通常包括以下几个部分:

  1. 主机组或主机名:指定要在哪些主机上执行任务。可以使用主机组名或逗号分隔的主机名列表。

  2. 变量定义:定义用于在任务中引用的变量。可以是全局变量或主机特定变量。

  3. 任务列表:列出需要在主机上执行的任务。每个任务都包含一个名称和一个或多个操作。

  4. 模块和参数:使用Ansible模块来执行任务。每个任务都会调用一个模块,并为模块传递必要的参数。

  5. 条件语句:根据条件,有选择地执行任务。条件语句可以基于主机变量或事先定义的变量。

  6. 循环:重复执行一个任务集。循环可以用来处理多个主机或不同的变量组合。

  7. 错误处理:处理任务执行过程中可能出现的错误。可以定义失败任务的处理方式。

  8. 注释:包含有关Playbook的注释,以便于其他人理解和维护。

整个Playbook结构通常以YAML格式编写,具有易读性和可维护性。通过定义主机、变量、任务和条件,Playbook可以用来自动化配置、部署和管理远程主机。

Ansible playbook语法

Ansible playbook是用于编写自动化任务的脚本文件,其中包含了一系列的任务和配置信息。以下是Ansible playbook的基本语法:

  1. 文件头部:在文件的头部指定一些基本的信息,如Ansible版本、作者等。
yaml 复制代码
---
- hosts: <目标主机>
  gather_facts: <是否收集主机信息,默认为True>
...
  1. 变量定义:可以定义一些变量,用于在任务中引用。
yaml 复制代码
vars:
  var_name: var_value
  ...
  1. 任务定义:定义一系列的任务,每个任务包含一个名称和一系列操作步骤。
yaml 复制代码
tasks:
  - name: <任务名称>
    <操作步骤>
    ...
  1. 动作(Action):在任务中执行的操作步骤,可以是Ansible模块、命令、脚本等。
yaml 复制代码
- name: <任务名称>
  <操作步骤>
  ...
  1. 模块(Module):Ansible提供了大量的模块,用于执行各种操作。模块可以通过参数传递不同的配置信息。
yaml 复制代码
- name: <任务名称>
  <模块名称>:
    <参数>
  ...
  1. 条件判断:可以使用条件判断来根据不同的情况执行不同的操作。
yaml 复制代码
- name: <任务名称>
  <操作步骤>
  when: <条件>
  ...
  1. 循环(Loop):可以使用循环来重复执行一系列的任务。
yaml 复制代码
- name: <任务名称>
  <操作步骤>
  loop: <循环列表>
  ...
  1. 注释:可以在脚本中添加注释以提高可读性。
yaml 复制代码
# 这是一个注释

要启动一个Ansible playbook任务,可以使用ansible-playbook命令。该命令将使用指定的playbook文件来执行自动化任务。以下是启动任务的基本语法:

bash 复制代码
ansible-playbook <playbook_file>

其中,<playbook_file>是要执行的playbook文件的路径。可以使用绝对路径或相对路径。

要配置一个role,可以按照以下步骤进行:

  1. 创建一个名为roles的目录,作为roles的根目录。该目录应该与playbook文件在同一级。

  2. roles目录下创建一个新的角色目录,在此处设置角色的名称。例如,可以创建一个名为webserver的目录:

    复制代码
    roles/
      └── webserver/
  3. 在角色目录中,创建以下目录和文件结构:

    复制代码
    roles/
      └── webserver/
          ├── tasks/
          │   └── main.yml
          ├── handlers/
          │   └── main.yml
          ├── vars/
          │   └── main.yml
          ├── files/
          └── templates/
    • tasks目录:包含角色的主要任务文件,通常名为main.yml
    • handlers目录:包含角色的处理程序文件,用于处理特定事件的触发。
    • vars目录:包含角色的变量文件,用于定义角色的变量。
    • files目录:包含角色需要使用的文件。
    • templates目录:包含角色需要使用的模板文件。
  4. main.yml文件中,定义该角色的任务。可以使用Ansible模块和任务语句来描述任务的操作。例如:

    yaml 复制代码
    - name: Install Apache
      apt:
        name: apache2
        state: present
    
    - name: Start Apache
      service:
        name: apache2
        state: started
        enabled: yes

    这是一个简单的示例,其中安装了Apache包并启动了Apache服务。

  5. 在playbook文件中,使用角色的名称来调用它。例如:

    yaml 复制代码
    - name: My Playbook
      hosts: all
      roles:
        - webserver

    在此示例中,我们调用了名为webserver的角色,该角色将在所有主机上执行。

这样,就可以在playbook中使用roles来组织和管理任务。每次执行playbook时,都会调用相应的角色,并执行其定义的任务。

1、使用ansible playbook远程部署docker、httpd、nginx、mysql

和#2在一起

2、编写一个安装并且运行httpd的playbook,该playbook可以在执行命令时指定被控端主机,要求每台机上的httpd首页内容为该主机的主机名、IP地址、子网掩码、网关信息

yaml 复制代码
---
- hosts: gr1
  remote_user: root
  tasks:
    - name: add yum repo
      copy:
        src: ./docker-ce.repo
        dest: /etc/yum.repos.d/docker-ce.repo
      become: true
    - name: yumlist reflash
      yum:
        name: yum-utils
        update_cache: yes
    - name: install docker
      yum:
        name:
          - docker-ce-cli-20.10.18
          - docker-ce-20.10.18
          - containerd.io
        state: present
    - name: install nginx
      yum:
        name: nginx
        state: present
    - name: install mysql
      yum:
        name: mysql
        state: present
    - name: change docker daemon.json
      copy:
        content: |
          {
            "insecure-registries": ["192.168.99.130:5000"],
            "registry-mirrors": ["https://docker.1panel.live"]
          }
        dest: /etc/docker/daemon.json
      become: true
    - name: start docker
      service:
        name: docker
        state: started
- hosts: gr1
  remote_user: root
  tasks:
    - name: install httpd
      yum:
        name: httpd
        state: present
    - name: index write
      copy:
        content: 'Hostname "{{ ansible_fqdn }}" and IP "{{ansible_ens33.ipv4.address }}" and mask "{{ansible_ens33.ipv4.netmask }}" and gateway "{{ansible_default_ipv4.gateway }}"'
        dest: /var/www/html/index.html
      become: true
    - name: restart httpd
      service:
        name: httpd
        state: restarted

3、使用ansible远程部署docker nginx容器

bash 复制代码
yum install -y python3
pip3 install docker
yaml 复制代码
---
- hosts: gr1
  remote_user: root
  tasks:
    - name: docker run nginx
      docker_container:
        name: nginx
        image: nginx:latest
        state: started
        ports:
          - "81:80"
        volumes:
          - /var/www/html:/usr/share/nginx/html

或者

bash 复制代码
ansible gr1 -m shell -a "docker run -d -p 81:80 nginx" 
相关推荐
宇钶宇夕25 分钟前
MODBUS RTU通信协议详解与调试指南
运维·程序人生·自动化
maomi_952628 分钟前
操作系统之EXT文件系统
linux·服务器
小羊Linux客栈3 小时前
自动化:批量文件重命名
运维·人工智能·python·自动化·游戏程序
伤不起bb4 小时前
MySQL 高可用
linux·运维·数据库·mysql·安全·高可用
IT成长日记5 小时前
【Ansible基础】Ansible设计理念与无代理架构深度解析
架构·自动化·ansible·无代理
shykevin6 小时前
python开发Streamable HTTP MCP应用
开发语言·网络·python·网络协议·http
whgjjim6 小时前
docker迅雷自定义端口号、登录用户名密码
运维·docker·容器
tmacfrank7 小时前
网络编程中的直接内存与零拷贝
java·linux·网络
数据与人工智能律师9 小时前
虚拟主播肖像权保护,数字时代的法律博弈
大数据·网络·人工智能·算法·区块链
瀚高PG实验室9 小时前
连接指定数据库时提示not currently accepting connections
运维·数据库