Ansible的使用2

#### 一、Ansible变量

##### facts变量

> facts组件是Ansible用于采集被控节点机器的设备信息,比如IP地址、操作系统、以太网设备、mac 地址、时间/日期相关数据,硬件信息等

- setup模块
  - 用于获取所有facts信息

```shell
## 常用参数
    filter:用于过滤指定信息

# 通过setup模块查看所有facts信息
ansible web1 -m setup

# facts变量是一个由庞大的{}构成的键值字典
# 在{}中,有很多层级的嵌套。可以通过参数过滤出第一个层级的内容
ansible webservers -m setup -a "filter=ansible_all_ipv4_addresses"
ansible webservers -m setup -a "filter=ansible_bios_version"
ansible webservers -m setup -a "filter=ansible_memtotal_mb"
ansible webservers -m setup -a "filter=ansible_hostname"
ansible webservers -m setup -a "filter=ansible_mem*"
ansible web1 -m setup > facts.txt; awk -F: '/mb/{print}' facts.txt
```

- debug模块
  - 用于基本中使用facts变量打印变量信息
  - 默认有Gathering Facts任务,收集到Facts信息后可以使用该模块打印
  - 调用变量格式:{{ 变量名 }}

```shell
## 常用参数
    msg:打印变量值,格式为:{{ 变量名 }}
    var:打印变量值,格式为:变量名

- name: test debug
  hosts: webservers
  tasks:
    - name: test debug msg
      debug:
        msg: "hostname: {{ansible_hostname}}; mem: {{ansible_memtotal_mb}}"

- name: test debug
  hosts: webservers
  tasks:
    - name: test debug var
      debug:
        var: ansible_hostname, ansible_bios_version
```

##### 自定义变量

- 通过变量的使用可以让剧本更加灵活,多次运行剧本只需要调整对应变量名即可
- Ansible支持十几种变量定义方式
- Ansible变量定义的位置,下列变量优先级从低到高
  - role defaults :roles defaults目录下的变量
  - inventory vars:inventory文件中定义的变量
  - inventory group_vars:inventory文件组的变量
  - inventory host_vars:inventory文件主机的变量
  - playbook group_vars:剧本中组的变量
  - playbook host_vars:剧本中主机的变量
  - host facts:事实变量
  - play vars:vars定义的变量
  - play vars_prompt:vars_prompt定义的变量
  - play vars_files:vars_files导入的变量
  - registered vars:注册变量
  - role and include vars:roles中单独定义的及导入的变量
  - block vars (only for tasks in block):block中定义的变量
  - task vars (only for the task):任务中定义的变量
  - extra vars (always win precedence):命令行指定的变量

- Ansible变量定义的分类

  - 节点变量

  ```shell
  ## 在inventory文件中定义变量
  [webservers]
  web[1:2]
  
  [dbs]
  db1 username="natasha"   #定义属于db1主机的变量
  ……
  
  ## 定义变量在Playbook中的使用
  - name: create user with host vars
    hosts: db1
    tasks:
      - name: test host vars
        user:
          name: "{{ username }}"
          state: present
  ```

  - 组变量

  ```shell
  ## 在inventory文件中定义变量
  [webservers]
  web[1:2]
  
  ……
  
  #定义属于组的变量,:vars是固定格式
  [webservers:vars]
  username="natasha"
  
  ## 定义变量在Playbook中的使用
  - name: create user with group vars
    hosts: webservers
    tasks:
      - name: test group vars
        user:
          name: "{{ username }}"
          state: present
  ```

  - 剧本变量

  ```shell
  ## Playbook中定义变量
  - name: create user with play vars
    hosts: webservers
    vars:                     #剧本中定义变量
      username: "natasha"        #定义变量
      password: "123456"      #定义变量,数字作为密码必须用引号,表示字符串
    tasks:
      - name: test play vars
        user:
          name: "{{ username }}"
          password: "{{ password|password_hash('sha512')}}"
          state: present
  ```

  - 文件变量

```shell
# 变量文件创建一个fvars.yml文件
username: "natasha"
password: "654321"

## 定义变量文件在Playbook中的使用
- name: create user with vars files
  hosts: db1
  vars_files: fvars.yml     #调用定义变量的文件
  tasks:
    - name: test vars file
      user:
        name: "{{ username }}"
        password: "{{ password | password_hash('sha512')}}"
        state: present
```

##### 调用Facts变量信息收集

```shell
# 一定要开启Facts信息收集,gather_facts: yes
- name: copy file with facts
  hosts: webservers
  tasks:
    - name: use facts
      copy:
          #加\n换行,显示两条信息
        content: "hostname: {{ ansible_hostname }}\nbios_version: {{ ansible_bios_version }}"
        dest: /tmp/facts.txt

# 验证收集
ansible webservers -a "cat /tmp/facts.txt"
```

##### Ansible补充模块

- Firewalld模块
  - 该模块用于配置firewalld防火墙规则(默认拒绝访问),对于明确允许的服务设置放行操作
  - 无论服务是否有名字,最终都基于TCP或UDP的端口,比如http服务基于TCP80端口。服务名和端口号对应关系的说明文件位于:/etc/services

```shell
## 常用参数
    port:声明放行端口与通信类型
    permanent:永久生效,但不会立即生效
    immediate:立即生效,临时生效
    state:enabled,放行;disabled拒绝

# 在webservers主机组安装nginx软件、启动服务
- name: test firewalld
  hosts: webservers
  tasks:
    - name: install nginx
      yum:
        name: nginx
        state: present

    - name: start nginx
      service:
        name: nginx
        state: started
        enabled: true
curl -I http://web1;curl -I http://web2        #测试访问

# 在webservers主机组安装firewalld防火墙软件、启动服务并访问测试
- name: test firewalld
  hosts: webservers
  tasks:
    ...
    - name: install firewalld
      yum:
        name: firewalld
        state: present

    - name: start firewalld
      service:
        name: firewalld
        state: started
        enabled: true

# 设置防火墙放行http访问
- name: test firewalld
  hosts: webservers
  tasks:
      ...
    - name: allow http
      firewalld:
        port: 80/tcp
        permanent: true
        immediate: true
        state: enabled
```

- Template模块
  - 用于上传具备特殊格式的文件(如文件中包含变量),文件的语法叫Jinja2
  - 被控节点接收到文件时,模板文件中的变量名会被替换成具体的值
  - 相比于copy模块更加灵活

```shell
## 常用参数
    src:要上传的文件
    dest:目标文件路径

# 通过facts变量找到被控节点对应ip的变量
# 创建index.html.j2文件将变量对号入座,主机名对应hostname,ip地址对应address
Welcome to {{ ansible_hostname }} on {{ ansible_eth0.ipv4.address }}

- name: upload index
  hosts: webservers
  tasks:
    - name: create web index
      template:
        src: index.html.j2
        dest: /usr/share/nginx/html/index.html
```

#### 二、PlayBook进阶语法

##### 错误处理机制

> 当Playbook中有多个task时,其中某个任务执行过程中失败则后续任务将被终止执行
>
> 使用ignore_errors对可能出现错误的task进行忽略处理,可以作用于任务级也可作用于全局级

```shell
# 任务级忽略错误
- name: test error task
  hosts: webservers
  tasks:
    - name: start mysqld
      service: 
        name: mysqld
        state: started
        enabled: true
      ignore_errors: true       #任务级

    - name: touch file
      file:
        path: /tmp/mysql.txt
        state: touch

# 全局级忽略错误
- name: test error task
  hosts: webservers
  ignore_errors: true       #全局级
  tasks:
    - name: start mysqld
      service: 
        name: mysqld
        state: started
        enabled: true

    - name: touch file
      file:
        path: /tmp/mysql.txt
        state: touch
```

##### 触发执行任务

- 通过handlers定义一组任务
- 仅当某个任务触发(notify)handlers时才会执行相应任务
- 如果有多个notify触发执行handlers任务,也仅执行一次
- 仅当任务的执行状态为changed是handlers任务才执行
- handlers任务在所有其他任务都执行后才执行

```shell
# 获取nginx配置文件
- name: get nginx config file
  hosts: webservers
  tasks:
    - name: fetch nginx config file
      fetch:
        src: /etc/nginx/nginx.conf
        dest: ./
        flat: yes

# 编辑获取文件的服务端口,调整为facts变量
vim +39 nginx.conf
...
        listen       {{ http_port }} default_server;
        listen       [::]:{{http_port}} default_server;
...

# 修改nginx服务端口为8000并重启服务
- name: configure nginx
  hosts: webservers
  vars:
    http_port: 8000
  tasks:
    - name: upload nginx.conf
      template:
        src: nginx.conf
        dest: /etc/nginx/nginx.conf

    - name: restart nginx
      service:
        name: nginx
        state: restarted

######执行上条命令,修改文件并重启服务,第二次执行命令,未修改文件但重启服务
# 实现目标:只有修改了配置文件才会重启服务
# 加入handlers触发器
- name: configure nginx
  hosts: webservers
  vars:
    http_port: 80
  tasks:
    - name: upload nginx.conf
      template:
        src: nginx.conf
        dest: /etc/nginx/nginx.conf
      notify: restart nginx service     #任务状态为changed时触发指定任务执行

  handlers:
    - name: restart nginx service
      service:
        name: nginx
        state: restarted

####!!!!!注意notify与handlers的name要一致否则回报错
ERROR! The requested handler 'restart nginx service' was not found in either the main handlers list nor in the listening handlers list
```

##### when条件判断

- 满足条件时才执行任务,多任务使用and或or进行连接,表达逻辑关系
- when表达式中的变量不需要使用{{}}

```shell
## 常用操作符
    ==:相等
    !=:不等
    >:大于
    <:小于
    <=:小于等于
    >=:大于等于

# 单条件测试:当目标主机内存至少4G时安装MySQL软件
- name: test when
  hosts: dbs
  tasks:
    - name: install mysql soft
      yum:
        name: mysql-server
        state: present
      when:
        ansible_memtotal_mb >= 4096

# 多条件测试:当目标主机系统为Rocky8时发送文件,/etc/motd是用户登录时屏幕显示的内容
- name: test when
  hosts: webservers
  tasks:
    - name: modify /etc/motd
      copy: 
        src: motd
        dest: /etc/motd
      when: >   #多条件合并成1行
        ansible_distribution == "Rocky"
        and
        ansible_distribution_major_version == "8"
```

##### register注册变量

- register用于捕获和保存任务执行结果,它允许将其他任务的输出作为变量使用
- register也是一个关键字,可以将任务执行的结果赋值给指定的变量名称,并在后续任务中使用
- register可以捕获各种类型的输出,包括stdout、stderr、rc、changed等并与其他模块一起使用,例如"when"条件、"loop"循环等

```shell
# 在web1主机执行创建/tmp/reg1.txt,捕获命令执行结果并打印
- name: test register
  hosts: web1
  tasks:
    - name: create file
      file:
        path: /tmp/reg1.txt
        state: touch
      register: result

    - name: display result
      debug:
        msg: "{{result}}" 

# 在web1主机上执行任务,创建文件/tmp/abcdemo/abc。如果创建不成功,则通过debug输出create failed
- name: test register
  hosts: web1
  ignore_errors: true   #如果不忽略则任务2无法执行
  tasks:
    - name: create file
      file:
        path: /tmp/abcdemo/abc
        state: touch
      register: result

    - name: debug out
      debug:
        msg: "create failed"
      when: result.failed
```

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/75081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多模态大语言模型arxiv论文略读(六)

FashionLOGO: Prompting Multimodal Large Language Models for Fashion Logo Embeddings ➡️ 论文标题&#xff1a;FashionLOGO: Prompting Multimodal Large Language Models for Fashion Logo Embeddings ➡️ 论文作者&#xff1a;Zhen Wang, Da Li, Yulin Su, Min Yang,…

MySQL深入

体系结构 连接层&#xff1a;主要处理客户端的连接进行授权认证、校验权限等相关操作 服务层&#xff1a;如sql的接口、解析、优化在这里完成&#xff0c;所有跨存储引擎的操作在这里完成 引擎层&#xff1a;索引是在存储引擎层实现的&#xff0c;所以不同的存储引擎他的索引…

智能 SQL 优化工具 PawSQL 月度更新 | 2025年3月

&#x1f4cc; 更新速览 本月更新包含 21项功能增强 和 9项问题修复&#xff0c;重点提升SQL解析精度与优化建议覆盖率。 一、SQL解析能力扩展 ✨ 新增SQL语法解析支持 SELECT...INTO TABLE 语法解析&#xff08;3/26&#xff09; ALTER INDEX RENAME/VISIBLE 语句解析&#…

数组划分使元素总和最接近

0划分 - 蓝桥云课 将一个数组划分为两个元素总和最接近的两个数组 要使得两组权值的乘积最大&#xff0c;根据数学原理&#xff0c;当两组权值越接近时&#xff0c;它们的乘积就越大。因此&#xff0c;可以将这个问题转化为一个 0 - 1 背包问题&#xff0c;把所有数的总和的一…

多线程代码案例(线程池)- 4

目录 引入 标准库中的线程池 -- ThreadPoolExecutor 研究一下这个方法的几个参数 1. int corePoolSize 2. int maximumPoolSize 3. long keepAliveTime 4. TimeUnit unit 5. BolckingQueue workQueue 6. ThreadFactory threadFactory 7. RejectedExecutionHandler h…

C,C++,C#

C、C 和 C# 是三种不同的编程语言&#xff0c;虽然它们名称相似&#xff0c;但在设计目标、语法特性、运行环境和应用场景上有显著区别。以下是它们的核心区别&#xff1a; 1. 设计目标和历史 语言诞生时间设计目标特点C1972&#xff08;贝尔实验室&#xff09;面向过程&#…

nginx 代理 https 接口

代码中需要真实访问的接口是&#xff1a;https://sdk2.028lk.com/application-localizationdev.yml文件中配置&#xff1a; url: http:/111.34.80.138:18100/sdk2.028lk.com/该服务器111.34.80.138上 18100端口监听&#xff0c;配置信息为&#xff1a; location /sdk2.028lk.c…

数据结构实验3.1:顺序栈的基本操作与进制转换

文章目录 一&#xff0c;问题描述二&#xff0c;基本要求三&#xff0c;算法分析四&#xff0c;示例代码五&#xff0c;实验操作六&#xff0c;运行效果 一&#xff0c;问题描述 在数据处理中&#xff0c;常常会遇到需要对链接存储的线性表进行操作的情况。本次任务聚焦于将链…

经典频域分析法(Bode图、Nyquist判据) —— 理论、案例与交互式 GUI 实现

目录 经典频域分析法(Bode图、Nyquist判据) —— 理论、案例与交互式 GUI 实现一、引言二、经典频域分析方法的基本原理2.1 Bode 图分析2.2 Nyquist 判据三、数学建模与公式推导3.1 一阶系统的频域响应3.2 多极系统的 Bode 图绘制3.3 Nyquist 判据的数学描述四、经典频域分析…

Vue知识点(5)-- 动画

CSS 动画是 Vue3 中实现组件动画效果的高效方式&#xff0c;主要通过 CSS transitions 和 keyframes 动画 CSS Keyframes&#xff08;关键帧动画&#xff09; 用来创建复杂的动画序列&#xff0c;可以精确控制动画的各个阶段。 核心语法&#xff1a; keyframes animationNa…

小型园区网实验

划分VLAN SW3 [sw3]vlan batch 2 3 20 30 [sw3]interface GigabitEthernet 0/0/1 [sw3-GigabitEthernet0/0/1]port link-type access [sw3-GigabitEthernet0/0/1]port default vlan 2 [sw3-GigabitEthernet0/0/1]int g0/0/2 [sw3-GigabitEthernet0/0/2]port link-type acces…

使用LangChain Agents构建Gradio及Gradio Tools(6)——创建自己的GradioTool

使用LangChain Agents构建Gradio及Gradio Tools(6)——创建自己的GradioTool 本篇摘要16. 使用LangChain Agents构建Gradio及Gradio Tool16.6 创建自己的GradioTool16.6.1 创建步骤16.6.2 创建示例StableDiffusionTool参考文献本章目录如下: 《使用LangChain Agents构建Grad…

SDL显示YUV视频

文章目录 1. **宏定义和初始化**2. **全局变量**3. **refresh_video_timer 函数**4. **WinMain 函数**主要功能及工作流程&#xff1a;总结&#xff1a; 1. 宏定义和初始化 #define REFRESH_EVENT (SDL_USEREVENT 1) // 请求画面刷新事件 #define QUIT_EVENT (SDL…

AnimateCC基础教学:随机抽取花名册,不能重复

一.核心代码: this.btnStartObj.addEventListener("click", switchBtn); this.btnOkObj.addEventListener("click", oKBtn); createjs.Ticker.addEventListener("tick", updateRandom); var _this this; var nameArr ["张三", &quo…

软考 系统架构设计师系列知识点 —— 设计模式之抽象工厂模式

本文内容参考&#xff1a; 软考 系统架构设计师系列知识点之设计模式&#xff08;2&#xff09;_系统架构设计师中考设计模式吗-CSDN博客 https://baike.baidu.com/item/%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/2361182 特此致谢&#xff01; Abstract Fac…

P2040 打开所有的灯

题目背景 pmshz在玩一个益(ruo)智(zhi)的小游戏&#xff0c;目的是打开九盏灯所有的灯&#xff0c;这样的游戏难倒了pmshz。。。 题目描述 这个灯很奇(fan)怪(ren)&#xff0c;点一下就会将这个灯和其周围四盏灯的开关状态全部改变。现在你的任务就是就是告诉pmshz要全部打开…

汉得企业级 PaaS 平台 H-ZERO 1.12.0 发布!四大维度升级,构建企业数字化新底座

汉得企业级 PaaS 平台&#xff08;以下简称"H-ZERO"&#xff09;是一款基于微服务架构的企业级数字化 PaaS 平台&#xff0c;可支持企业各类系统搭建、产品研发&#xff0c;帮助企业快速构架技术中台。 H-ZERO于2025年3月底正式发布 V1.12.0 &#xff0c;此次发布聚…

ReplicaSet、Deployment功能是怎么实现的?

在Kubernetes中&#xff0c;ReplicaSet 和 Deployment 是用于管理 Pod 副本的关键对象。它们各自的功能和实现机制如下&#xff1a; 1. ReplicaSet 功能 管理 Pod 副本&#xff1a;确保指定数量的 Pod 副本一直在运行。如果有 Pod 副本崩溃或被删除&#xff0c;ReplicaSet 会…

物联网外设管理服务平台

1 开发目标 1.1 架构图 操作系统&#xff1a;基于Linux5.10.10源码和STM32MP157开发板&#xff0c;完成tf-a(FSBL)、u-boot(SSBL)、uImage、dtbs的裁剪&#xff1b; 驱动层&#xff1a;为每个外设配置DTS并且单独封装外设驱动模块。其中电压ADC测试&#xff0c;采用linux内核…

PyTorch教程:如何读写张量与模型参数

本文演示了PyTorch中张量&#xff08;Tensor&#xff09;和模型参数的保存与加载方法&#xff0c;并提供完整的代码示例及输出结果&#xff0c;帮助读者快速掌握数据持久化的核心操作。 1. 保存和加载单个张量 通过torch.save和torch.load可以直接保存和读取张量。 import to…