Ansible的使用2

news2025/4/18 0:09:35

#### 一、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.coloradmin.cn/o/2331077.html

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

相关文章

mapbox进阶,使用本地dem数据,加载hillshade山体阴影图层

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️hillshade 山体阴影图层 api1.3.1 ☘️…

【C++】Stack Queue 仿函数

&#x1f4dd;前言&#xff1a; 这篇文章我们来讲讲STL中的stack和queue。因为前面我们已经有了string、vector和list的学习基础&#xff0c;所以这篇文章主要关注一些stack和queue的细节问题&#xff0c;以及了解一下deque&#xff08;缝合怪&#xff09;和priority_queue &am…

代码随想录_单调栈

代码随想录_单调栈 739.每日温度 739. 每日温度 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;…

BoostSearch搜索引擎项目 —— 测试用例设计 + web自动化测试代码

web自动化代码&#xff1a; https://gitee.com/chicken-c/boost-search/tree/master/AutoTest

【Ansible自动化运维】一、初步了解,开启自动化运维之旅

在当今数字化时代&#xff0c;随着企业 IT 基础设施规模的不断扩大&#xff0c;传统的手工运维方式逐渐显得力不从心。自动化运维技术应运而生&#xff0c;其中 Ansible 凭借其简洁易用、功能强大的特点&#xff0c;成为众多运维工程师和开发人员的首选工具。本篇文章将从基础概…

条件概率、概率乘法公式、全概率公式和贝叶斯 (Bayes) 公式

定义 设 P ( A ) > 0 P(A) > 0 P(A)>0&#xff0c;若在随机事件 A A A发生的条件下随机事件 B B B发生的概率记作 P ( B ∣ A ) P(B|A) P(B∣A)&#xff0c;定义 P ( B ∣ A ) P ( A B ) P ( A ) P(B|A) \frac{P(AB)}{P(A)} P(B∣A)P(A)P(AB)​ 则称 P ( B ∣ A ) …

kotlin,Android,jetpack compose,日期时间设置

AI生成&#xff0c;调试出来学习&#xff0c;这些小组件会用了&#xff0c;就可以组合一个大点的程序了。 package com.example.mydatetimeimport android.app.AlertDialog import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.co…

ASP.NET图书馆借阅系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 近些年来&#xff0c;随着科技的飞速发展&#xff0c;互联网的普及逐渐延伸到各行各业中&#xff0c;给人们生活带来了十分的便利&#xff0c;图书馆借阅系统利用计算机网络实现信息化管理&#xff0c;使图书信息、图书借阅、归还的管理发展和服务水平有显著提升。 本文拟…

vi/vim常用快捷键

那么今天我们继续昨天没有介绍完的vi编辑器,来看看常用的一些快捷键,方便我们对文件的编辑. 1.拷贝当前行yy,拷贝当前行向下的5行5yy,并粘贴(输入p) 2.删除当前行dd,删除当前行向下的5行5d 3.在文件中查找某个单词[命令模式/关键字,回车查找,输入n就是查找下一个] ⭐️&…

opencv无法设置禁用RGB转换问题

树莓派连接摄像头,摄像头输出格式为YUYV(YUV422)。 通过执行 v4l2-ctl --list-formats --device/dev/video0 可以看的具体的摄像头的数据格式。 使用opencv获取视频流&#xff0c;通过cap.set(cv2.CAP_PROP_CONVERT_RGB, 0)设置禁用自动转换RGB格式&#xff0c;但是打印输出…

MCP+Blender创建电力塔

MCP&#xff08;Model Context Protocol&#xff09;与Blender的结合是当前AI与3D建模领域的热门技术&#xff0c;它通过协议化的方式让Claude等AI模型直接控制Blender&#xff0c;实现自动化3D建模。 1. 功能与原理 • 核心能力&#xff1a;用户通过自然语言指令&#xff08;…

Selenium自动化:玩转浏览器,搞定动态页面爬取

嘿&#xff0c;各位爬虫爱好者和自动化达人们&#xff01;是不是经常遇到这种情况&#xff1a;信心满满地写好爬虫&#xff0c;requests一把梭&#xff0c;结果抓下来的HTML里&#xff0c;想要的数据空空如也&#xff1f;定睛一看&#xff0c;原来数据是靠JavaScript动态加载出…

QAI AppBuilder 快速上手(8): 图像修复应用实例2

LaMa-Dilated模型旨在通过扩张卷积技术实现高效的图像擦除和修复。该模型采用先进的卷积神经网络架构&#xff0c;能够处理复杂的图像输入&#xff0c;并填补图像中的缺失部分&#xff0c;使修复后的图像更加自然和逼真。LaMa-Dilated不仅在图像编辑领域表现出色&#xff0c;还…

【计网】作业4

一. 单选题&#xff08;共22题&#xff0c;64分&#xff09; 1. (单选题)主机甲采用停止-等待协议向主机乙发送数据&#xff0c;数据传输速率是4kb/s&#xff0c;单向传播时延为30ms&#xff0c;忽略确认帧的发送时延。当信道利用率等于80%时&#xff0c;数据帧的长度为&#…

MPDrive:利用基于标记的提示学习提高自动驾驶的空间理解能力

25年4月来自南方科技大学、百度、英国 KCL和琶洲实验室&#xff08;广东 AI 和数字经济实验室&#xff09;的论文“MPDrive: Improving Spatial Understanding with Marker-Based Prompt Learning for Autonomous Driving”。 自动驾驶视觉问答&#xff08;AD-VQA&#xff09;…

【学习笔记】HTTP和HTTPS的核心区别及工作原理

一、基础概念 HTTP&#xff08;超文本传输协议&#xff09;&#xff1a;明文传输数据&#xff0c;默认端口80&#xff0c;容易被窃听或篡改。 HTTPS&#xff08;HTTP SSL/TLS&#xff09;&#xff1a;通过加密传输数据&#xff0c;默认端口443&#xff0c;保障安全性。 二、…

【STL】list介绍(附与vector的比较)

文章目录 1.关于list2.使用2.1 list的构造2.2 list 迭代器的使用2.3 list 容量操作2.3.1 size()2.3.2 empty()2.3.3 resize() 2.4 list 元素访问2.4.1 front()2.4.2 back() 2.5 list 修改操作2.5.1 push_front()2.5.2 pop_front()2.5.3 push_back()2.5.4 pop_back()2.5.5 inser…

Ansible:roles角色

文章目录 Roles角色Ansible Roles目录编排Roles各目录作用创建 roleplaybook调用角色调用角色方法1&#xff1a;调用角色方法2&#xff1a;调用角色方法3&#xff1a; roles 中 tags 使用实战案例 Roles角色 角色是ansible自1.2版本引入的新特性&#xff0c;用于层次性、结构化…

找不到导入的项目“xxx\QtMsBuild\Qt.props”。请确认 Import 声明“$(QtMsBuild)\Qt.props”中计算结果为

系列文章目录 文章目录 系列文章目录前言一、问题原因 前言 新建的项目visual studio2022 使用Qt vs tools 找不到导入的项目“E:\osgEarth\DigitalSimulationPlatform\DigitalSimulationPlatform\QtMsBuild\Qt.props”。 请确认 Import 声明“$(QtMsBuild)\Qt.props”中计算结…

2025 年福建交安安全员考试:结合本省交通特点备考​

福建地处东南沿海&#xff0c;交通建设具有独特特点&#xff0c;这对交安安全员考试备考意义重大。在桥梁建设方面&#xff0c;由于面临复杂的海洋环境&#xff0c;桥梁的防腐、防台风等安全措施成为重点。考生在学习桥梁施工安全知识时&#xff0c;要特别关注福建本地跨海大桥…