ansible 深入

一,ansible概念

Ansible 是一种自动化工具,用于配置管理、应用程序部署和任务自动化。它基于 Python 开发,并且使用 SSH 协议与远程主机进行通信,无需在远程主机上安装额外的客户端软件。

下面是一些 Ansible 的核心概念:

  1. 主机清单(Inventory):主机清单是一个文本文件,包含您希望管理的所有主机的列表。它可以指定主机名、IP 地址、分组和其他变量等信息。 

  2. 模块(Modules):Ansible 使用模块来执行特定任务。模块是 Ansible 的基本构建块,每个模块负责在目标主机上执行一个特定的操作,例如设置用户、安装软件包或执行命令等。

  3. Playbook:Playbook 是一个用 YAML 语法编写的文件,定义了一组任务和配置项的顺序。它描述了应该在目标主机上执行的操作,如何执行这些操作以及执行操作的顺序。

  4. 任务(Task):任务是 Playbook 中的最小单位,用于指定需要在目标主机上执行的具体操作。每个任务通常会调用一个或多个模块来完成特定的工作。

  5. 角色(Roles):角色是将相关任务和配置组织在一起的一种方式。它可以用于封装和重用 Playbook 中的代码,使整个配置和部署过程更加模块化和可维护。

  6. 变量(Variables):变量用于存储和传递数据。您可以在 Playbook、主机清单或角色中定义变量,并在任务和模块中使用它们。这样可以使配置更加灵活和可配置。

通过定义主机清单、编写 Playbook 和使用相应的模块,您可以编排和自动化各种任务,包括系统配置、软件部署、服务管理等。Ansible 提供了简单而强大的工具和语法,使得管理和自动化大规模基础设施变得更加容易和可靠。

二,ansible主机清单

主机清单(Inventory)是 Ansible 中用于定义被管理主机列表的文件。它指定了要对哪些主机进行操作,可以包含主机名、IP 地址、分组和其他相关变量。

下面是有关 Ansible 主机清单的一些详解:

  1. 清单文件格式:主机清单通常使用 INI 或 YAML 格式编写。INI 格式更简单且易于阅读,而 YAML 格式更灵活且支持更复杂的数据结构。

    INI 格式示例:

    [web]
    webserver1 ansible_host=192.168.1.10
    webserver2 ansible_host=192.168.1.11
    ​
    [database]
    dbserver1 ansible_host=192.168.1.20

    YAML 格式示例:

    all:
      hosts:
        webserver1:
          ansible_host: 192.168.1.10
        webserver2:
          ansible_host: 192.168.1.11
      children:
        database:
          hosts:
            dbserver1:
              ansible_host: 192.168.1.20
  1. 主机分组:您可以使用方括号 [] 来创建主机组,并将相应的主机放入组中。这样可以根据需要对不同类型的主机进行分组,以便在 Playbook 中可以更方便地针对这些组执行任务。

    示例:

    [web]
    webserver1
    webserver2
    ​
    [database]
    dbserver1
  2. 主机变量:您可以为每个主机指定额外的变量信息,如 IP 地址、端口号、用户名等。这些变量可以在 Playbook 中使用,以便根据不同的主机进行不同的操作配置。

    示例:

    [web]
    webserver1 ansible_host=192.168.1.10 ansible_user=ubuntu
    ​
    [database]
    dbserver1 ansible_host=192.168.1.20 ansible_user=root
  3. 动态清单:Ansible 还支持使用动态清单,从外部数据源动态生成主机列表。这对于自动化场景非常有用,例如从云服务提供商获取实时的主机列表。

    示例:

    ansible-inventory --list -i dynamic_inventory.py

    上述命令将通过运行名为 dynamic_inventory.py 的脚本来获取动态清单。

通过合理编写和组织主机清单,您可以更好地管理和控制要在哪些主机上执行操作。Ansible 的目标是通过简单而强大的主机清单功能来提供灵活、可读性高的自动化配置管理。

三,ansible模块

Ansible 模块(Modules)是 Ansible 的基本构建块,用于执行特定的任务或操作。模块可以在远程主机上执行命令、配置系统设置、安装软件包等等。以下是有关 Ansible 模块的详解:

  1. 内置模块:Ansible 提供了大量的内置模块,可满足不同的自动化需求。这些模块被打包在 Ansible 中,并且无需额外安装即可使用。一些常用的内置模块包括:

    • shell:在目标主机上执行 Shell 命令。

    • copy:将文件复制到目标主机。

    • apt(适用于 Debian 系统):用于管理 APT 软件包。

    • yum(适用于 Red Hat 系统):用于管理 YUM 软件包。

    • service:用于管理系统服务的状态。

  2. 自定义模块:除了内置模块外,Ansible 还支持编写自定义模块以满足特定的自动化需求。自定义模块可以使用任何编程语言编写,并以可执行脚本的形式提供给 Ansible 使用。通常,自定义模块需要与 Ansible 的执行环境进行交互,通过标准输入和输出来传递数据。

  3. 模块参数和返回值:每个模块都有自己特定的参数和返回值。模块参数用于传递给模块的输入数据,而模块返回值则提供给 Ansible 以便进行后续处理。模块的参数和返回值通常是通过 JSON 格式进行传递。

  4. 模块文档:每个 Ansible 模块都有相应的文档,详细说明了模块的功能、使用方法和参数说明。您可以通过 ansible-doc 命令来查看特定模块的文档。例如,要查看 copy 模块的文档,可以执行以下命令:ansible-doc copy

  5. 模块示例:下面是一个使用 copy 模块复制文件的示例 Playbook:

    - name: Copy file to target hosts
      hosts: webserver1
      tasks:
        - name: Copy file
          copy:
            src: /path/to/source/file
            dest: /path/to/destination/file

    上述示例中,copy 模块被用于将源文件复制到目标主机的指定位置。

使用不同的模块,您可以执行各种任务,从简单的命令执行到复杂的系统配置。Ansible 的模块化架构使得自动化配置变得灵活且易于扩展。确保熟悉可用的内置模块,并在需要时编写自定义模块以满足特定的需求。

四,ansible playbook

Ansible Playbook 是 Ansible 的核心组件之一,它是一个用于定义和管理自动化任务的文件。Playbook 由一个或多个任务组成,并以 YAML 格式编写。以下是有关 Ansible Playbook 的详解:

  1. 结构:Playbook 通常由以下几个部分组成:

    • name:Playbook 的名称,用于标识和描述该 Playbook 的作用。

    • hosts:要执行任务的目标主机或主机组。

    • vars:变量定义,可以在 Playbook 中使用,用于传递输入数据。

    • tasks:任务列表,其中定义了要在目标主机上执行的具体任务。

    • handlers:处理程序,用于处理任务执行后触发的事件。

    • roles:角色列表,用于按照特定的组织结构和功能将任务模块化。

  2. 任务:任务(task)是 Playbook 中的基本单元,用于定义要在目标主机上执行的操作。每个任务通常包含以下属性:

    • name:任务的名称,用于描述任务的作用。

    • module:要使用的 Ansible 模块,确定任务执行的具体操作。

    • args:模块参数,指定模块执行时所需的输入参数。

    • when:条件语句,用于根据满足特定条件来决定是否执行任务。

  3. 变量:Playbook 可以使用变量来传递数据和配置信息。变量可以在 Playbook 文件中定义,也可以从外部文件或动态数据源加载。变量可以用于设置主机参数、模块参数、任务控制等。

    示例:

    vars:
      http_port: 80
      database_name: mydb
    ​
    tasks:
      - name: Install Apache
        apt:
          name: apache2
          state: present
    ​
      - name: Configure Apache
        template:
          src: apache.conf.j2
          dest: /etc/apache2/httpd.conf
        notify:
          - Restart Apache
  4. 处理程序:处理程序(handler)是用于处理任务完成后触发的事件的功能模块。处理程序通常与特定的任务相关联,并且只有在有任务触发时才会执行。

    示例:

    handlers:
      - name: Restart Apache
        service:
          name: apache2
          state: restarted
  5. 角色:角色(role)是一种组织和复用 Playbook 的方式,通过将任务和变量组织在一起,可以更好地管理和维护自动化配置。角色可以包含多个任务、变量和处理程序,并可以在多个 Playbook 中重复使用。

    示例:

    - name: Web Server Configuration
      hosts: webserver
      roles:
        - common
        - apache

使用 Ansible Playbook,您可以将自动化任务以结构化和可维护的方式描述,并通过执行 Playbook 将其应用到目标主机上。Playbook 提供了强大的功能和灵活性,可用于自动化各种系统配置、应用部署和任务管理。确保熟悉 Playbook 的语法和组织结构,并利用角色的力量来实现高效的自动化配置管理。

6.debug 插件是一种回调插件,用于打印任务执行期间的调试信息。它可以用来输出变量的值、模块执行结果和其他相关信息。

要使用 debug 插件,你可以按照以下步骤配置:

  • 在 playbook 目录下创建或编辑 ansible.cfg 文件。
  • 将以下内容添加到 ansible.cfg 文件中:

[defaults] stdout_callback = debug

这将设置默认的回调插件为 debug

  • 运行 playbook 时,debug 插件会自动将任务执行期间的调试信息打印到终端上,包括变量的值、模块执行结果等。

下面是一个简单的 playbook 示例,演示了如何在 debug 插件下输出变量的值:

---
- name: Debug Plugin Example
  hosts: localhost
  gather_facts: false

  tasks:
    - name: Set variable
      set_fact:
        my_var: "Hello, World!"

    - name: Print variable value
      debug:
        var: my_var

在上述 playbook 中,set_fact 模块设置了一个 my_var 变量,并将其值设为 "Hello, World!"。然后,debug 模块使用 var 参数打印了 my_var 变量的值。

运行此 playbook 后,你将在终端上看到类似以下的输出:

TASK [Print variable value] ***********************************************
ok: [localhost] => {
    "my_var": "Hello, World!"
}

这表明 debug 插件成功地打印了变量的值。

请注意,如果你不想全局配置 stdout_callback,你也可以直接在运行 playbook 时使用 -c 参数指定回调插件,例如:

ansible-playbook -c debug your_playbook.yml

这将仅在此次运行中使用 debug 回调插件。

Ansible 的 debug 模块并不支持 shell 参数。

可以尝试在 handlers 中执行 shell 命令并将其结果注册到变量 lldpjiancha 中,然后使用 debug 模块打印该变量的值。

但是需要注意的是,Ansible 的 handlers 并不支持像 command 这样的模块。handlers 主要用于定义处理任务的动作,并在特定条件下触发执行。它们通常用于响应其他任务的状态变化。

如果你想执行命令并打印其输出,你可以将其放在一个单独的任务中。请参考以下示例:

---
- name: Execute Shell Command and Print Output
  hosts: localhost
  gather_facts: false

  tasks:
    - name: Run shell command
      shell: lldpctl show
      register: lldpjiancha

    - name: Print lldpjiancha output
      debug:
        var: lldpjiancha.stdout_lines
 

在上述示例中,我将 shell 模块用于执行命令 lldpctl show,并将其结果注册到变量 lldpjiancha 中。然后,debug 模块使用 var 参数来打印 lldpjiancha.stdout_lines,即命令的输出结果。

运行此 playbook 后,你将会看到类似以下的输出:

TASK [Print lldpjiancha output] ********************************************
ok: [localhost] => {
    "lldpjiancha.stdout_lines": [
        "Output line 1",
        "Output line 2",
        "..."
    ]
}

这表示成功执行了命令,并打印了其输出行。

请确保将 lldpctl show 替换为你实际想要执行的 shell 命令。同时,请注意在使用 shell 模块时要注意安全性和潜在的风险。

五,ansible roles角色

Ansible 中的角色(Roles)是一种组织和复用 Playbook 的方法,它将相关的任务、变量、文件和模板组织在一个目录结构中。角色可以使 Playbook 更加模块化、可读性更好,并且方便与其他 Playbook 共享和重用。以下是有关 Ansible 角色的详细解释:

  1. 角色目录结构:一个典型的角色目录结构如下所示:

my_role/
├── defaults/
│   └── main.yml
├── files/
├── handlers/
│   └── main.yml
├── meta/
│   └── main.yml
├── tasks/
│   └── main.yml
├── templates/
└── vars/
    └── main.yml
  • defaults/:包含角色默认变量。这些变量会被其他位置的变量覆盖。

  • files/:存放角色使用的文件,可以在 Playbook 中复制到远程主机。

  • handlers/:角色使用的处理程序(Handlers),用于在适当的时候触发任务。

  • meta/:角色的元数据,如作者信息、依赖关系等。

  • tasks/:角色的主要任务定义文件。

  • templates/:角色使用的模板文件。

  • vars/:角色使用的变量文件。

  1. 定义角色:创建一个角色的常见方法是使用 Ansible Galaxy 命令行工具。运行 ansible-galaxy init my_role 可以创建一个基本的角色目录结构,然后在每个目录中添加相应的文件。

  2. 使用角色:在 Playbook 中使用角色时,可以通过 roles 关键字来引入和指定要使用的角色。您还可以在 Playbook 中为角色设置变量,并使用 vars 关键字将其传递给角色。

    示例:

    - name: Playbook using roles
      hosts: my_hosts
      roles:
        - my_role
      vars:
        my_variable: value
  3. 角色依赖:角色可以定义对其他角色的依赖关系,以确保它们在执行之前正确加载。在角色的 meta/main.yml 文件中,使用 dependencies 关键字指定所依赖的角色。

    示例:

    dependencies:
      - role: dependent_role
  4. 角色的优先级:当多个 Playbook 或包含角色的 Playbook 合并时,角色的执行顺序和变量优先级可能会受到影响。Ansible 角色有一个优先级顺序列表,其中包括获取角色的位置。默认情况下,该列表按以下顺序获取角色:

    • roles_path 配置的路径中的角色。

    • <playbook_dir>/roles/ 目录中的角色。

    • 由 Ansible Galaxy 预设的标准角色路径中的角色。

通过使用 Ansible 角色,您可以将任务、变量和文件组织起来,使 Playbook 更可读、可重用且易于维护。它们提供了一种结构化方法来管理和共享 Ansible 配置,并使得构建复杂系统配置更加简单。

六,ansible变量

Ansible 中的变量是用于存储和传递数据的容器,可以在 Playbook、模板或角色中使用。变量允许您动态地配置任务和模块,并使其更加灵活和可重用。以下是有关 Ansible 变量的一些重要信息:

  1. 变量类型:

    • 主机变量(Host Variables):为单个主机定义的变量,可以在 inventory 文件中指定或通过动态数据源加载。它们具有最高优先级,并应用于特定主机上的所有任务。

    • 组变量(Group Variables):为主机组定义的变量,可以在 inventory 文件中指定,并将应用于属于该组的所有主机。

    • Playbook 变量:在 Playbook 中定义的变量,可以在整个 Playbook 中访问。它们通常位于 Playbook 的顶层,也可以作为任务和角色的输入。

    • 注册变量(Registered Variables):通过执行任务获取的结果存储在注册变量中,以供后续任务使用。

    • Facts 变量:Ansible 自动获取的关于目标主机的系统信息存储在 Facts 变量中,您可以使用这些变量进行条件判断、配置管理等。

  2. 变量的定义:变量可以通过多种方式定义,例如在 Playbook 中使用 varsvars_files 关键字,通过命令行传递 -e 参数,从外部文件加载等。

    示例:

    vars:
      my_variable: value
    
    tasks:
      - name: Task using variable
        debug:
          msg: "{{ my_variable }}"
  3. 使用变量:在 Playbook 或模板中,可以使用 Jinja2 模板语言来引用和操作变量。通过双花括号 {{ variable_name }} 引用变量的值。

    示例:

    tasks:
      - name: Task using variable
        debug:
          msg: "The value is {{ my_variable }}"
  4. 条件判断:变量常用于条件判断,以决定是否执行任务或采取不同的行动。您可以使用 when 关键字和逻辑运算符来编写条件表达式。

    示例:

    tasks:
      - name: Conditional task
        debug:
          msg: "Task executed"
        when: my_variable == "value"
  5. 外部变量文件:为了更好地组织和管理变量,您可以将变量定义存储在外部文件中,并在 Playbook 中引用。通过 vars_files 关键字指定要加载的变量文件。

    示例:

    vars_files:
      - vars.yml
    
    tasks:
      - name: Task using variable from file
        debug:
          msg: "{{ external_variable }}"

通过使用 Ansible 变量,您可以实现可配置、灵活和可重用的自动化配置。了解变量的不同类型、定义方式和使用方法,可以帮助您更好地利用 Ansible 进行任务管理和系统配置。

七,ansible 命令

  1. ansible:执行一个或多个主机上的操作。

    示例:`ansible <host-pattern> -m <module> -a '<arguments>'`

  2. ansible-playbook:运行 Ansible Playbook。

    示例:`ansible-playbook <playbook.yml>`

  3. ansible-galaxy:管理 Ansible 角色和集合。

    示例:`ansible-galaxy <subcommand>`

  4. ansible-vault:管理 Ansible Vault 加密的文件。

    示例:`ansible-vault <subcommand>`

  5. ansible-doc:获取 Ansible 模块、插件和角色的文档。

    示例:`ansible-doc <module_name>`

  6. ansible-config:配置 Ansible 的全局设置。

    示例:`ansible-config <subcommand>`

  7. ansible-console:在交互式控制台中执行 Ansible 命令。

    示例:`ansible-console`

  8. ansible-pull:从远程 Git 存储库中拉取并执行 Ansible Playbook。

    示例:`ansible-pull -U <repository>`
  • 基础命令

    -a 模块参数
    -e 指定要使用的并行进程的数量
    -h,——help显示帮助信息并退出
    -i 指定目录主机路径或以逗号分隔的主机列表
    -l 子集 ——limit子集
    -m 要执行的模块名
    -o 一行压缩输出
    -t TREE日志输出到该目录
    -v verbose模式(-vvv表示更多,-vvvv表示启用连接调试)
    -T 以秒为单位覆盖连接超时(默认= 10)
    -c 连接要使用的连接类型(默认=smart)
    -k 请求连接密码
    -u 以该用户连接

ansible-playbook --tags=跟tagsname
        表示执行指定playbook里的某一个tags

ansible-playbook --skip-tags=跟tagsname
        表示不执行playbook里的某个tags

检测语法是否正确 ansible-playbook --syntax-check 跟yml名

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值