17.RedHat认证-Ansible自动化运维(下)

news2024/11/17 7:17:01

17.RedHat认证-Ansible自动化运维(下)

这个章节讲ansible的变量,包括变量的定义、变量的规则、变量范围、变量优先级、变量练习等。

以及对于tasks的控制,主要有loop循环作业、条件判断等

变量

介绍

Ansible支持变量功能,能将value存储到变量中,这样就能在Ansible项目中重复使用,这样就可以简化项目的创建和维护,减少错误率。

变量提供了一个变量提供了一种方便的方法来管理ansible项目中给定环境的动态值。 变量可以是要创建的用户,要安装的包,要启动的服务,要删除的文件,要从互联网下载的文件等等

规则

变量由必须以字母开头的字符串组成,并且只能包含字母,数字和下划线组成。

无效变量有效变量
web serverweb_server
remote.fileremote_file
1st filefile_1或file1
remoteserver$1remote_server_1或remote_server1

定义变量

变量几乎可以定义在ansible项目中的任意位置。然而这有三种基本的范围级别:
1.Globe scope:从命令行设置变量或Ansible配置文件中设置变量
2.play scope: 在play和相关结构中设置变量
3.host scope: 通过inventory在主机组或单个主机中设置变量,fact采集变量或者register

如果在一个级别上定义了名字相同的两个变量,会选择先定义的那个。 在inventory中定义的变量会被
playbook中定义的覆盖,playbook中定义的变量会被命令行定义的变量覆盖。
http://docs.ansible.com/ansible/playbooks_variables.html 变量说明详细文档

playbook中定义变量

当写playbook时,管理员可以在task中使用它们自己定义的变量。例如一个叫做web_package的变量可以
被被定义为httpd,然后使用yum模块来调用这个变量,进而安装httpd包

声明定义

playbook变量可以通过多种方式进行定义。一个最简单的方式就是在playbook的开头通过vars定义,例如

在这里插入图片描述

文件定义

也可以在playbook中通过指定外部文件作为变量文件

在这里插入图片描述

主机变量和组变量

inventory变量直接应用到被管理主机有两种方式:
1.应用到特定主机
2.应用到特定组
主机变量优先级高于组变量,但是在playbook中定义的主机变量优于这两种方式

变量定义

在这里插入图片描述

这种定义变量的方式让inventory的管理更复杂了。因为在同一个文件中包含了主机和变量,并且使用了不同的语法。

将变量的定义放在一个文件中,例如放在当前的目录下的var目录下的vars.yml

[student@workstation playbook-review]$ vim test.yml 
- name: this is a var test
  hosts: all
  vars_files:
    - var/vars.yml  # 相对路径,推荐写相对路径
  tasks:
    - name: debug module test
      debug:
        msg: "{{ user  }} is very handsome ,but {{ user  }} is very pool"
        
# 在var目录下定义了user变量
[student@workstation playbook-review]$ cd var/
[student@workstation var]$ cat vars.yml 
 user: ztf

# 执行playbook 
[student@workstation playbook-review]$ ansible-playbook test.yml  

上面这种定义变量的方式让inventory的管理更复杂了。因为在同一个文件中包含了主机和变量,并且使用了不同的语法。

使用group_vars和host_vars目录

其实大多数生产环境里,尽最大可能将变量和inventory文件以及playbook文件分开来写,看着清爽。

不要混在一起,非常不利于维护和阅读

使用这两个目录就可以解决上面的问题,解耦文件,生产环境中用的多。

很简单,在你的playbook目录下创建两个这样的目录,分别是 group_varshost_vars目录

记住,文件名强制必须一样,不能改变。

然后就很简单了,如果你是针对主机组设置变量,就在group_vars目录下创建一个主机组名称相同的文件。

举个例子,假设你的inventory文件里有一个主机组 production,里面有两个主机 servera serverb

[production]

servera

serverb

然后你就在group_vars目录下创建同名的主机组的文件 就叫 production,然后在这个文件里定义的变量都会应用在这个production主机组里

其次,如果你是针对主机设置变量,就在host_vars目录下创建一个主机名称相同的文件。方法如上。

练习playbook变量

[kiosk@foundation0 ~]$ ssh workstation

[student@workstation ~]$ lab data-variables start

[student@workstation ~]$ cd data-variables/

[student@workstation data-variables]$ cat inventory 
[webserver]
servera.lab.example.com

[student@workstation data-variables]$ cat ansible.cfg 
[defaults]
inventory   = inventory
remote_user = devops

[privilege_escalation]
become      = true


# 创建playbook 
[student@workstation data-variables]$ vim playbook.yml
[student@workstation data-variables]$ cat playbook.yml
--------------------------- 内容如下 ----------------------------------------------------------
---
- name: Deploy and start Apache HTTPD service
  hosts: webserver
  vars:
    web_pkg: httpd
    firewall_pkg: firewalld
    web_service: httpd
    firewall_service: firewalld
    python_pkg: python3-PyMySQL
    rule: http

  tasks:
    - name: Required packages are installed and up to date
      yum:
        name:
          - "{{ web_pkg }}"
          - "{{ firewall_pkg }}"
          - "{{ python_pkg }}"
        state: latest
   
    - name: The {{ firewall_service }} service is started and enabled
      service:
        name: "{{ firewall_service }}"
        enabled: true
        state: started

    - name: The {{ web_service }} service is started and enabled
      service:
        name: "{{ web_service }}"
        enabled: true
        state: started

    - name: Web content is in place
      copy:
        content: "Example web content"
        dest: /var/www/html/index.html

    - name: The firewall port for {{ rule }} is open
      firewalld:
        service: "{{ rule }}"
        permanent: true
        immediate: true
        state: enabled

- name: second play Verify the Apache service
  hosts: localhost
  become: false
  tasks:
    - name: Ensure the webserver is reachable
      uri:
        url: http://servera.lab.example.com
        status_code: 200
-------------------------------------------------------------------------------------
# 运行playbook,结果正确
[student@workstation data-variables]$ ansible-playbook playbook.yml


------------------------------ 【警戒线】 -------------------------------

#【注意】在这个例子中,定义的变量是在playbook文件里,我们运用之前所学知识,将变量定义在外部的单独文件里。
[student@workstation data-variables]$ mkdir variables
[student@workstation data-variables]$ cd variables/
[student@workstation variables]$ vim web.yml
-------------------------------------------------------
web_pkg: httpd
firewall_pkg: firewalld
web_service: httpd
firewall_service: firewalld
python_pkg: python3-PyMySQL
rule: http
-------------------------------------------------------
# 修改playbook.yml
[student@workstation data-variables]$ vim playbook.yml 
  vars_files:
    - variables/web.yml

# 运行效果正确。
[student@workstation data-variables]$ ansible-playbook playbook.yml 


------------------------------ 【警戒线】 -------------------------------
# 再运用group_vars和host_vars的知识再来修改
# 这里的inventroy文件里只有主机组,那么我们创建一个group_vars

[student@workstation data-variables]$ mkdir group_vars
[student@workstation data-variables]$ cd group_vars/
[student@workstation group_vars]$ vim webserver
[student@workstation group_vars]$ cd ..
[student@workstation data-variables]$ vim playbook.yml 
# 这一步修改playbook.yml文件,就是去掉 vars_files:- variables/web.yml 这个变量文件这两行。

# 然后再执行,执行效果正确。
[student@workstation data-variables]$ ansible-playbook playbook.yml 

# 练习完还原环境即可
[student@workstation data-variables]$ lab data-variables finish

加密敏感数据

通过 vault 来加密一些敏感数据,例如密码,令牌等

[student@workstation playbook-review]$ cd var
[student@workstation var]$ ls
vars.yml
[student@workstation var]$ ansible-vault create test.yml # 创建加密文件
New Vault password: 
Confirm New Vault password: 

# 查看加密文件内容(如果你直接使用cat去查看,就是一堆加密的字母)
[student@workstation var]$ ansible-vault view test.yml 
Vault password: 
user: ztf

# 编辑加密文件
[student@workstation var]$ ansible-vault edit test.yml 
Vault password: 
 
 
 # 加密现有的文件
[student@workstation var]$ ansible-vault encrypt vars.yml 
New Vault password: 
Confirm New Vault password: 
Encryption successful

# 解密现有的文件
[student@workstation var]$ ansible-vault decrypt test.yml 
Vault password: 
Decryption successful
[student@workstation var]$ cat test.yml 
user: ztf

# 改密码
[student@workstation var]$ ansible-vault rekey vars.yml 
Vault password: 
New Vault password: 
Confirm New Vault password: 
Rekey successful

ansible vault 练习

[student@workstation ~]$ lab data-secret start

[student@workstation data-secret]$ ansible-vault edit secret.yml 
密码是redhat
去掉注释符号,保存退出

[student@workstation data-secret]$ vim create_user.yml

---
- name: Create user accounts for all our servers
  hosts: devservers
  become: True
  remote_user: devops
  vars_files:
    - secret.yml
  tasks:
    - name: Creating user from secret.yml
      user:
        name: {{ username }}
        password: {{ pwhash }}



[student@workstation data-secret]$ ansible-playbook --ask-vault-pass create_user.yml 

[student@workstation ~]$ lab data-secret finish

Facts变量(重要)

Ansible facts是在一个被管理主机上通过ansible自动被发现的变量。facts包含特定的主机信息,这些主机信息可以像正
plays,conditionals,loops或者其它场景下,不同的应用场景取决于从被管理主机上采集的value类型

常见的facts变量

从被管理主机上可以搜集到facts包含:
1.主机名
2.内核版本
3.网卡
4.地址
5.操作系统版本
6.环境变量
7.CPU的数量
8.可用内存或者空闲内容
9.可用磁盘空间

使用场景

使用facts来检索被管理主机的状态是非常方便的,而且还可以基于这些状态做不同的动作,例如:
1.一个主机可以通过条件task判断如果系统的内核版本不匹配则重启切换到最新的内核版本。
2.通过fact检索的内存情况来自定义mysql的配置文件
3.在配置文件中使用的IPv4地址可以基于fact来设置

运行原理

每个play都会在第一个task之前自动运行setup模块,以便搜集fact。在Ansible2.3版本,通常这个task会被报告成“
Facts”,在以前的版本通常会被报告执行setup。你不需要在你的play中运行setup,它会自动运行。
如果你想看到setup模块的内容,你可以通过ad hoc命令运行

[student@workstation data-secret]$ ansible servera.lab.example.com -m setup

关闭facts采集

有时候,你可能不想在你的paly中开启facts采集。为什么会有这样的情况有几点原因:
1.你不想在你的paly中使用facts
2.你想提升你的play速度
3.你想减少负载
可能被管理主机不能运行setup模块,比如需要在采集facts之前需要安装前置软件

在这里插入图片描述

Task控制

loop循环

在这里插入图片描述

这里的{{item}} 是固定的,固定写法就是这样。不能变

条件判断

语法

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

多条件判断

在这里插入图片描述

条件判断和循环结合

在这里插入图片描述

loop循环练习

[student@workstation ~]$ lab control-flow start
[student@workstation ~]$ cd control-flow/
[student@workstation control-flow]$ ls
ansible.cfg  inventory
[student@workstation control-flow]$ cat ansible.cfg inventory 
[defaults]
inventory=inventory
remote_user=devops

[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
[database_dev]
servera.lab.example.com

[database_prod]
serverb.lab.example.com

[student@workstation control-flow]$ cat playbook.yml 
---
- name: this is a first play
  hosts: database_dev
  vars:
    mariadb_packages:
            - mariadb-server
            - python3-PyMySQL
  tasks:      
    - name: install pkg
      yum:
        name: "{{ item  }}"
        state: present
      loop: "{{ mariadb_packages }}"
      
    - name: start db service
      service:
        name: mariadb
        state: started
        enabled: true


[student@workstation control-flow]$ ansible-playbook playbook.yml 


[student@workstation control-flow]$ ansible database_prod -m command -a 'cat /etc/redhat-release' -u devops --become
serverb.lab.example.com | CHANGED | rc=0 >>
Red Hat Enterprise Linux release 8.0 (Ootpa)


[student@workstation ~]$ lab control-flow finish

handlers练习

[student@workstation ~]$ lab control-handlers start
[student@workstation ~]$ cd control-handlers/
[student@workstation control-handlers]$ ls
ansible.cfg  configure_db.yml  inventory

[student@workstation control-handlers]$ vim configure_db.yml 

[student@workstation control-handlers]$ cat configure_db.yml 
---
- name: Installing MariaDB server
  hosts: databases
  vars:
    db_packages:
      - mariadb-server
      - python3-PyMySQL
    db_service: mariadb
    resources_url: http://materials.example.com/labs/control-handlers
    config_file_url: "{{ resources_url }}/my.cnf.standard"
    config_file_dst: /etc/my.cnf
  tasks:
    - name: install pkg
      yum:
        name: "{{ db_packages }}"
        state: present
      notify:
        - set db password

    - name: start service
      service:
        name: "{{ db_service }}"
        state: started
        enabled: true
    
    - name: download db cfg
      get_url:
        url: "{{ config_file_url }}"
        dest: "{{ config_file_dst  }}"
        owner: mysql
        group: mysql
        force: yes
      notify:
        - restart db service

  handlers:
       - name: restart db service
         service:
           name: "{{ db_service }}"
           state: restarted
       - name: set db password
         mysql_user:
           name: root
           password: redhat
           
           
           
[student@workstation control-handlers]$ ansible-playbook configure_db.yml 

假设如果你的tasks运行错误,就不会通知handlers,那么此时你在写之前,就应该加上,force_handlers: yes
即使错了,也会通知handlers,不会影响运行。
---
- hosts: all
force_handlers: yes


但是,如果你忘记加了,但是已经运行过playbook了,那么你就要在要被通知的tasks手动加上changed_when: true

  tasks:
    - name: install pkg
      yum:
        name: "{{ db_packages }}"
        state: present
        changed_when: true  # 让changed的状态改变就行
      notify:
        - set db password


[student@workstation ~]$ lab control-handlers finish

错误控制的练习

[student@workstation ~]$ lab control-errors start
[student@workstation control-errors]$ cat playbook.yml 
---
- name: test
  hosts: databases
  vars:
    web_package: http
    db_package: mariadb-server
    db_service: mariadb

  tasks:
    - name: install httpd pkg
      yum:
        name: "{{ web_package  }}"
        state: present
    
    - name: install mariadb-server
      yum:
        name: "{{ db_package }}"
        state: present
        
[student@workstation control-errors]$ ansible-playbook playbook.yml # 运行后会报错

# 加一个忽略错误的命令
[student@workstation control-errors]$ cat playbook.yml 
---
- name: test
  hosts: databases
  vars:
    web_package: http
    db_package: mariadb-server
    db_service: mariadb

  tasks:
    - name: install httpd pkg
      yum:
        name: "{{ web_package  }}"
        state: present
      ignore_errors: yes # 忽略错误
    - name: install mariadb-server
      yum:
        name: "{{ db_package }}"
        state: present
         
[student@workstation control-errors]$ ansible-playbook playbook.yml  # 错误被跳过


# 添加一个block
---
- name: test
  hosts: databases
  vars:
    web_package: http
    db_package: mariadb-server
    db_service: mariadb

  tasks:
    - name: add block
      block:
        - name: install httpd pkg
          yum:
            name: "{{ web_package  }}"
            state: present
      rescue:
         - name: install mariadb-server
           yum:
             name: "{{ db_package }}"
             state: present
             
             
[student@workstation control-errors]$ ansible-playbook playbook.yml 

当block里的东西运行失败了,他还是会运行rescue的代码


# 加了always,如果block是对的,那么rescue是不会运行的,就直接运行always了
---
- name: test
  hosts: databases
  vars:
    web_package: httpd
    db_package: mariadb-server
    db_service: mariadb

  tasks:
    - name: add block
      block:
        - name: install httpd pkg
          yum:
            name: "{{ web_package  }}"
            state: present
      rescue:
         - name: install mariadb-server
           yum:
             name: "{{ db_package }}"
             state: present
      always:
        - name: add a always
          service:
            name: "{{ db_service }}"
            state: started
            
[student@workstation ~]$ lab control-errors finish

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

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

相关文章

快速排序的实现(3种)

目录 0.快速排序1.Hoare版本1.1基本思想1.2算法描述1.3画图解释1.4问题?1.5代码实现 2.挖坑法2.1算法描述2.2画图解释2.3代码实现 3.先后指针法3.1算法描述3.2画图解释3.3代码实现 4.优化4.1优化方法4.2优化代码 5.非递归实现快排5.1算法描述 0.快速排序 1.时间复杂…

计算机系统基础知识(上)

目录 计算机系统的概述 计算机的硬件 处理器 存储器 总线 接口 外部设备 计算机的软件 操作系统 数据库 文件系统 计算机系统的概述 如图所示计算机系统分为软件和硬件:硬件包括:输入输出设备、存储器,处理器 软件则包括系统软件和…

代码随想录算法训练营第四十一天| 416. 分割等和子集

416. 分割等和子集 - 力扣&#xff08;LeetCode&#xff09; class Solution {public boolean canPartition(int[] nums) {int sum 0;for (int i0;i<nums.length;i){sum nums[i];}if(sum%2!0){return false;}int weight sum /2;// int[][] dp new int[nums.length][weig…

与亚马逊云科技深度合作,再获WAPP、ISV认证

上半年&#xff0c;VERYCLOUD睿鸿股份加入亚马逊云科技的WAPP&#xff08;Well-Architected Partner Programs&#xff09;和ISV加速计划&#xff08;ISV Accelerate Program&#xff09;&#xff0c;为客户带来更坚实优质的海外云服务。 Well-Architected 获得WAPP这项认证代表…

高考志愿填报:选好专业还是选好学校?

目录 引言 专业解析 工科类专业 文科类专业 医药类专业 商科类专业 名校效应分析 名校声誉的影响 教育资源和研究机会 学术氛围和创新能力 就业优势 好专业和好学校的权衡 职业目标的判断 行业需求的考量 教育质量的比较 结论 引言 2024年高考帷幕落下&#xff…

编程哲学——抽象

主要参考资料: App Image Format: https://docs.espressif.com/projects/esp-idf/zh_CN/release-v4.4/esp32s3/api-reference/system/app_image_format.html# 目录 简介抽象&#xff1a;从现实到模型类和对象&#xff1a;现实与模型的映射封装&#xff1a;隐藏复杂性继承&#…

▶《强化学习的数学原理》(2024春)_西湖大学赵世钰 Ch2 贝尔曼公式 【状态值、动作值】

PPT 截取有用信息。 课程网站做习题。总体 MOOC 过一遍 1、学堂在线 视频 习题 2、相应章节 过电子书 复习 GitHub界面链接 3、总体 MOOC 过一遍 还是跳过了一些 P38 学堂在线 课程页面链接 中国大学MOOC 课程页面链接 B 站 视频链接 PPT和书籍下载网址&#xff1a; 【github…

EDU学校漏洞sql注入挖掘记录

某搜索框 biaoti参数单引号报错 双引号正常 经过我的不断测试&#xff0c;’||exp(710)||’报错&#xff0c;exp函数就是执行e的多少次方&#xff0c;709不会报错&#xff0c;710会导致这个数太大报错 709正常,这里说明一下&#xff0c;因为这个数是小数所以返回200&#xff0c…

自学C语言-10

第10章 指针 指针是C语言的一个重要组成部分&#xff0c;是C语言的核心、精髓所在。用好指针&#xff0c;可以在C语言开发中起到事半功倍的效果。一方面&#xff0c;可以提高程序的编译效率、执行速度&#xff0c;以及动态存储分配&#xff1b;另一方面&#xff0c;可使程序更加…

MoonBit 周报 Vol.46:支持32位无符号整数!

MoonBit 更新 支持了 32 位无符号整数 let num 100U // 32位无符号整数的字面量需要后缀U在 wasm 后端导出返回值类型为 Unit 的函数时&#xff0c;之前导出函数的类型中会有 (result i32)&#xff0c;现在 MoonBit 编译器会自动生成一个没有返回值 wrapper 函数&#xff0c…

[leetcode]add-strings 字符串相加

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string addStrings(string num1, string num2) {int i num1.length() - 1, j num2.length() - 1, add 0;string ans "";while (i > 0 || j > 0 || add ! 0) {int x i > 0 ? num1[i…

win10改远程桌面端口,Windows 10 修改远程桌面端口号的专业指南

在Windows 10系统中&#xff0c;远程桌面&#xff08;Remote Desktop&#xff09;功能允许用户从一台计算机远程访问和控制另一台计算机。为了增加远程连接的安全性&#xff0c;减少潜在的安全风险&#xff0c;修改默认的远程桌面端口号是一个常见的安全措施。以下是在Windows …

名侦探李先生第一话:谁是真正的凶手(只出现一次的数字相关题解(力扣)+位操作符回忆)

引子&#xff1a;我们在之前的案子中破解过基础的单身狗问题&#xff0c;那面对更有挑战的案子&#xff0c;且看李先生如何破局&#xff0c;那下凶手&#xff01; 复习&#xff1a; 1&#xff0c;位操作符&#xff1a; 正整数原&#xff0c;反&#xff0c;补码都相同 首位是…

长城与华为签署《HUAWEI HiCar 集成开发合作协议》,共创开发生态

近日&#xff0c;在2024年华为开发者大会上&#xff0c;长城汽车与华为签署《HUAWEI HiCar 集成开发合作协议》&#xff08;下称《协议》&#xff09;。这不仅标志着双方相关团队在技术方面的深度合作&#xff0c;更体现了两家公司共同提升未来智能出行体验的共同愿景。 而凭借…

SAPUI5基础知识8 - 模块(Module)的使用

1. 背景 在SAPUI5中&#xff0c;几乎所有东西都是一个模块&#xff08;例如&#xff1a;控件&#xff0c;控制器&#xff0c;组件等等&#xff09;&#xff0c;通过依赖管理&#xff0c;模块间可以相互调用。这样做的好处是&#xff0c;可以仅在需要时才去加载必需的模块&…

基于Openmv的追小球的云台

介绍 在这篇文章&#xff0c;我会先介绍需要用到且需要注意的函数&#xff0c;之后再给出整体代码 在追小球的云台中&#xff0c;比较重要的部分就是云台&#xff08;实质上就是舵机&#xff09;的控制以及对识别的色块位置进行处理得到相应信息后控制云台进行运动 1、舵机模…

基于 RGB的热成像无人机树冠数据集(目标检测)

亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 摘要&a…

Hightec编译器系列之高级调试技巧精华总结

Hightec编译器系列之高级调试技巧精华总结 小T为了便于大家理解&#xff0c;本文的思维导图大纲如下&#xff1a; 之前可能很多小伙伴没有使用过Hightec编译器&#xff0c;大家可以参考小T之前的文章《Hightec编译器系列之白嫖就是爽》可以下载一年试用版本。 小T使用过适配英…

vue中图谱关系插件relation-graph

vue中图谱关系插件relation-graph 一、效果图二、安装下载&#xff08;vue2.0版本的&#xff09;三、直接上代码 一、效果图 二、安装下载&#xff08;vue2.0版本的&#xff09; npm install --save relation-graph var foo bar;三、直接上代码 <template><div cla…

Notepad++插件 Hex-Edit

Nptepad有个Hex文件查看器&#xff0c;苦于每次打开文件需要手动开插件显示Hex&#xff0c;配置一下插件便可实现打开即调用 关联多个二进制文件&#xff0c;一打开就使用插件的方法&#xff0c;原来是使用空格分割&#xff01;&#xff01;&#xff01;