当前位置: 首页 > 编程日记 > 正文

Ansible03-管理变量、加密、事实

目录

一、管理变量

1.1、变量的基本用法

1.2、使用已注册变量捕获命令输出

二、管理加密

2.1、ansible-vault常用场景

三、管理事实

3.1、事实基本用法

3.2、创建自定义事实

3.3、魔法变量hostvars、group_names、groups、inventory_hostname


一、管理变量

1.1、变量的基本用法

Ansible 支持利用变量来存储值,并在 Ansible 项目的所有文件中重复使用这些值。变量的名称必须以字母开头,并且只能含有字母、数字和下划线

定义变量范围:

  • 全局范围:从命令行或 Ansible 配置设置的变量
  • Play 范围:在 play 和相关结构中设置的变量
  • 主机范围:由清单、事实收集或注册的任务、在主机组和个别主机上设置的变量

变量优先级,如果在多个级别上定义了相同名称的变量,则采用优先级别最高的变量。常用的(需要我们记住的)优先级:命令行中定义的变量 > playbook 定义的变量 > 清单定义的变量

不需要我们记住的(用时候再查文档)优先级,从上到下优先级由高到低

1、ansible-playbook 命令中的变量,ansible-playbook -e var=value
2、task 变量
3、block 变量
4、role 中定义的变量 和 include 变量
5、set_fact
6、registered 变量
7、vars_files
8、var_prompt
9、play 变量
10、host facts
11、playbook 中设置的 host_vars
12、playbook 中设置的 group_vars
13、inventory 中设置的 host_vars
14、inventory 中设置的 group_vars
15、inventory 变量
16、role 中 defaults/main.yml 中定义的变量

常用的定义变量方法一:通过 vars 直接定义变量

- hosts: allvars:db_name: foo_dbdb_user: foo_user

常用的定义变量方法二:通过 vars_files 外部文件引入变量

- hosts: allvars_files: vars/dbs.yml# vars/dbs.yml 内容
db_name: foo_db
db_user: foo_user

通过 {{ 变量名 }} 引用变量。当变量用作开始一个值的第一元素时,必须使用引号。

vars:db_name: foo_dbtasks:- name: Create databasemysql_db:name: "{{ db_name }}"state: present

常用的定义变量方法三:主机变量、组变量是应用于特定主机、组的变量。使用目录填充主机和组变量的推荐做法:是在与清单文件或目录相同的工作目录中,创建 group_vars 和 host_vars 两个目录。这两个目录分别包含用于定义组变量和主机变量的文件。比如,

  • 为了定义用于 servera.lab.example.com 主机的主机变量,需要创建名为 host_vars/servera.lab.example.com 的YAML文件,然后设置变量
  • 为了定义用于 webservers 组的组变量,需要创建名为 group_vars/webservers 的 YAML文件,然后设置变量

1.2、使用已注册变量捕获命令输出

可以使用 register 语句捕获命令输出。输出保存在一个临时变量中,稍 后在 playbook中 可用于调试用途或者达成其他目的。比如,我们把访问网页的输出注册为web_content,把访问mysql数据库的输出注册为db_content。然后在debug的时候输出,注册变量的内容包括多个字段,我们只显示我们需要的内容。

[student@workstation ansible]$ cat web_test.yml ---
- name: Test web pagehosts: webserverstasks:- name: Access url get http200uri:url: http://serverc.lab.example.com/status_code: 200return_content: yesregister: web_content- name: Show web pagedebug:var: web_content.content- name: Test mariadbhosts: devtasks:- name: Show databasesshell: 'mysql -uroot -e "show databases;"'register: db_content- name: Show databases resultdebug:var: db_content.stdout_lines

二、管理加密

Ansible可能需要访问密码或API密钥等敏感数据,以便能配置受管主机。Ansible Vault可以加密和解密任何由Ansible使用的结构化数据文件。可通过一个名为 ansible-vault 的命令行工具创建、编辑、加密、解密和查看文件。Ansible Vault并不实施自有的加密函数,而是使用外部Python工具集。采用对称加密。

2.1、ansible-vault常用场景

使用ansibl-vault命令创建、编辑、查看文件,分别用create、edit、view。修改密码使用rekey。

[student@workstation ansible]$ ansible-vault create users.yml
[student@workstation ansible]$ ansible-vault edit users.yml
[student@workstation ansible]$ ansible-vault view users.yml
[student@workstation ansible]$ ansible-vault rekey users.yml

使用ansible-vault对文件加解密,使用encrypt、decrypt。比如对明文temp.yml进行加密,再解密成明文temp2.yml。

[student@workstation ansible]$ ansible-vault encrypt temp.yml 
New Vault password: 
Confirm New Vault password: 
Encryption successful[student@workstation ansible]$ cat temp.yml 
$ANSIBLE_VAULT;1.1;AES256
34623033613639643331383834333939623633343261613865306666623662666266336362646365
3031376464323862386134616136326630613536666166630a666635633834336436636230323461
63633163653232623333333037356234333132386239653835383565343236663561303765323266
3161366338313930620a616364366236303065653632663031376665653832383230323164633835
63396133626334373339313264666531306335343538333264323166633562306662326465353563
6531613731306166303866653330623064373230643164363965[student@workstation ansible]$ ansible-vault decrypt temp.yml --output=temp2.yml
Vault password: 
Decryption successful[student@workstation ansible]$ cat temp2.yml 
---
- hosts: allvars_files:- users.yml

如果 playbook 使用 的所有 vault 加密文件都使用同一密码,则可以使用 --ask-vault-pass 选项以交互方式提供 vault 密码。也可使用 --vault-password-file 选项指定以纯文本存储加密密码的文件。比如,playbook里面引用了加密的变量文件users.yml,我们把密码放在vpass.txt文件里。

- hosts: all                                                                     vars_files:                                                                    - users.yml                                                                                                                                                                                
[student@workstation ansible]$ ansible-vault view users.yml --vault-password-file=vpass.txt
users:- name:joepassword:redhat- name:janepassword:centos[student@workstation ansible]$ ansible-playbook temp.yml --vault-password-file=vpass.txt

如果playbook使用的 vault 加密文件密码不同,那么可以使用 --vault-id @prompt 选项逐个交互输入密码。比如,playbook引用两个密码不一样的变量文件users.yml、databases.yml。

---
- hosts: allvars_files:- users.yml- databases.yml
[student@workstation ansible]$ ansible-playbook temp.yml --vault-id one@prompt --vault-id two@prompt
Vault password (one): 
Vault password (two): 

管理变量加密的推荐做法是:可将敏感变量和所有其他变量保存在相互独立的文件中。包含敏感变量的文件用 ansible-vault 命令进行加密。使用 group_vars 管理组变量,host_vars 管理主机变量。

三、管理事实

3.1、事实基本用法

Ansible 事实是 Ansible 在受管主机上自动检测到的变量。事实中含有与主机相关的信息。为受管主机收集的一些事实可能包括

  • 主机名称
  • 内核版本
  • 网络接口
  • IP地址
  • 操作系统版本
  • 各种环境变量
  • CPU数量
  • 提供的或可用的内存
  • 可用磁盘空间

通常,每个 play 在执行第一个任务之前会先自动运行 setup 模块来收集事实。 在 Ansible 中 报告为 Gathering Facts 任务。

查看事实,可以运行一个收集事实的task,并使用 debug 模块显示 ansible_facts 变量。运行这个 playbook 之后,playbook 将以 JSON 格式显示 ansible_facts 变量的内容。

[student@workstation ansible]$ vim print_facts.yml - name: Print factshosts: devtasks:- name: Print all facts of devdebug:var: ansible_facts

ansible_facts 可以见名知意,常用的有:

  • ansible_facts.hostname  主机名
  • ansible_facts.fqdn  FQDN
  • ansible_facts.default_ipv4.address  IP地址
  • ansible_facts.devices  /dev目录下的块设备/dev/sda、/dev/sda1、lvm等
  • ansible_facts.kernel 内核

收集事实可能耗费时间。在不需要收集事实的 playbook 中可以通过 gather_facts 关闭事实收集。在需要的时候,通过一个 setup 模块的任务即可手动收集。

[student@workstation ansible]$ vim facts.yml ---
- name: Facts hosts: devgather_facts: notasks:- name: Here no factsdebug:msg: "Here no facts"- name: Gather facts mannuallysetup:- name: Here is factsdebug:msg: " {{ ansible_facts.kernel }}"[student@workstation ansible]$ ansible-playbook facts.yml PLAY [Facts] ***********************************************************************************TASK [Here no facts] ***************************************************************************
ok: [servera.lab.example.com] => {"msg": "Here no facts"
}TASK [Gather facts mannually] ******************************************************************
ok: [servera.lab.example.com]TASK [Here is facts] ***************************************************************************
ok: [servera.lab.example.com] => {"msg": " 4.18.0-240.el8.x86_64"
}

3.2、创建自定义事实

自定义事实采用JSON格式编写,一般命名为 xxxx.fact ,使用时将自定义事实文件放在受管主机的 /etc/ansible/facts.d/ 目录。执行 setup 模块时,自定义事实放在 ansible_facts.ansible_local.xxxx 变量中,用法和默认事实一样。

举例,在控制节点上编辑 myfact.fact 自定义事实,受管主机上创建 /etc/ansible/facts.d/ 目录并安装自定义事实 myfact.fact ,使其具有自定义事实ansible_facts.ansible_local.myfact。

[student@workstation ansible]$ vim myfact.json {"users": {"user1": "tom","user2": "jerry",},"packages": {"db_pkg": "mariadb-server","web_pkg": "httpd",},
}
[student@workstation ansible]$ vim myfact.yml---
- name: Custom factshosts: webserversvars:remote_dir: /etc/ansible/facts.d/facts_file: myfact.jsontasks:- name: Create directoryfile:path: "{{ remote_dir }}"state: directoryrecurse: yes- name: Install custom factscopy:src: "{{ facts_file }}"dest: "{{ remote_dir }}"
[student@workstation ansible]$ ansible webservers -m setup | less
......
...skipping..."ansible_local": {"myfact": {"packages": {"db_pkg": "mariadb-server","web_pkg": "httpd"},"users": {"user1": "tom","user2": "jerry"}}},
.......

3.3、魔法变量hostvars、group_names、groups、inventory_hostname

有些变量并不通过 setup 模块来获取,由ansible自动配置,可以获取特定受管主机信息。

hostvars 包含受管主机的变量,可以在一个受管主机上获取另一个受管主机的变量。比如,在test组上获取servera的事实。或者为 webservers 组主机生成 /etc/hosts 文件,里面包含所有受管主机的 IP地址、主机名、FQDN。

[student@workstation ansible]$ ansible test -m debug -a 'var=hostvars["servera.lab.example.com"]'

group_names 当前受管主机所属的所有组。比如,servera属于dev组,serverc属于prod、webservers这两个组。

[student@workstation ansible]$ ansible servera.lab.example.com -m debug -a "var=group_names" 
servera.lab.example.com | SUCCESS => {"group_names": ["dev"]
}[student@workstation ansible]$ ansible serverc.lab.example.com -m debug -a "var=group_names" 
serverc.lab.example.com | SUCCESS => {"group_names": ["prod","webservers"]
}

groups 列出清单中所有组和主机。比如,使用 groups.all 可以遍历所有主机。

[student@workstation ansible]$ ansible dev -m debug -a "var=groups"
servera.lab.example.com | SUCCESS => {"groups": {"all": ["servera.lab.example.com","serverb.lab.example.com","serverc.lab.example.com","serverd.lab.example.com"],"dev": ["servera.lab.example.com"],"prod": ["serverc.lab.example.com","serverd.lab.example.com"],"test": ["serverb.lab.example.com"],"ungrouped": [],"webservers": ["serverc.lab.example.com","serverd.lab.example.com"]}
}

inventory_hostname 当前受管主机在 inventory 中的主机名。这个名字可能和主机的hostname不一样。

[student@workstation ansible]$ ansible dev -m debug -a "var=inventory_hostname"
servera.lab.example.com | SUCCESS => {"inventory_hostname": "servera.lab.example.com"
}

相关文章:

HashSet中的add()方法( 零 )(详尽版)

我们知道在使用HashSet集合时&#xff0c;也就是在用HashMap集合&#xff0c;这是因为HashSet的底层是HashMap&#xff0c; public HashSet() {map new HashMap<>(); }在详述HashSet中的add()方法之前&#xff0c;我们要知道HashMap中的hash&#xff0c;因为在add()的底…

layui上传图片接口

mvc中 前台调用接口 url&#xff1a;"../upload/uploadfiles/" 然后开始接口 代码&#xff1a; string a ""; try { HttpFileCollection file context.Request.Files;//获取选中的文件 for (int i 0; i < file.Count; i) { string cFileName Path.G…

shell与 .sh文件与 .bash文件

一、shell和bash shell是LInux系统下的解释器&#xff0c;类似于windows下的cmd。shell对用户输入到窗口中的命令行进行解释&#xff0c;输入到内核。 bash同样是Linux系统下的解释器&#xff0c;是bash的改进版。 二、.sh文件与.bash文件 .sh文件和.bash文件都是脚本文件&a…

php session存入redis

一、 安装phpredis扩展php连接redis需要安装phpredis扩展。下载地址&#xff1a;https://github.com/phpredis/phpredis/releases&#xff0c;选用相应版本。笔者用的是php5.6.29&#xff0c;下载了phpredis-3.0.0安装出了问题&#xff0c;于是换成phpredis-2.2.8&#xff0c;正…

Ansible04-任务控制

目录 一、循环 二、条件 三、handlers 四、失败的处理 一、循环 使用 loop 关键字对一组项目迭代任务&#xff0c;循环变量 item 保存每个迭代过程中使用的值。 [studentworkstation ansible]$ vim loop.yml --- - name: Test loophosts: devgather_facts: novars:num:- …

HashSet中的add()方法( 三 )(详尽版)

上接HashSet中的add()方法( 二 )&#xff08;详尽版&#xff09; &#xff0c;前两篇说的是泛型为String类的add()方法的具体执行过程&#xff0c;此后三篇说说泛型为自定义类的add()方法的具体执行过程&#xff1a; 首先让我们来自定义一个学生类&#xff1a; public class …

mono修改配置

当前mono安装目录为:/home/mono&#xff0c;安装成功后修改配置需进入这个路径&#xff1a; cd /home/mono 1.修改TcpBinaryFrameManager.cs文件 cd /home/mono/mono-2.10.8 vim mcs/class/System.ServiceModel/System.ServiceModel.Channels.NetTcp/TcpBinaryFrameManager.cs …

[Java in NetBeans] Lesson 01. Java Programming Basics

这个课程的参考视频在youtube。 主要学到的知识点有&#xff1a; Create new project, choose Java Application.one .jar file/ package(.jar name with the same as package), one package can contains mutiple .java files.Comment mutiple lines by using "/* */&quo…

ubuntu中常用指令

常用指令 清空命令行 CtrlL Conda 创建虚拟环境 conda create -n 虚拟环境名称 python3.7.10 查看虚拟环境列表 conda info --envs 激活虚拟环境 conda activate 虚拟环境名 退出虚拟环境 conda deactivate 虚拟环境名称 安装功能包 conda install 功能包名称 卸载功能包 con…

Ansible05-部署文件

目录 一、部署文件的常用模块 二、使用jinja2文件部署自定义文件 一、部署文件的常用模块 部署文件常用模块有 file 创建、删除文件或目录&#xff0c;修改selinux上下文。copy 复制文件到受控节点上&#xff0c;也可以直接在受控结点上创建文件。fetch 从受控结点获取文件…

HashSet中的add()方法( 四 )(详尽版)

上接 HashSet中的add()方法( 三 )&#xff08;详尽版&#xff09; &#xff0c;我们重写一下Student类中的hashCode()方法来看看是否还能不能添加重复的学号了&#xff0c; 在学生类中重写hashCode()方法&#xff1a; public class Student {private String id;public Studen…

Laravel框架中的event事件操作

有时候当我们单纯的看 Laravel 手册的时候会有一些疑惑&#xff0c;比如说系统服务下的授权和事件&#xff0c;这些功能服务的应用场景是什么&#xff0c;其实如果没有经历过一定的开发经验有这些疑惑是很正常的事情&#xff0c;但是当我们在工作中多加思考会发现有时候这些服务…

yolact_ros出坑记录

教程&#xff1a;https://github.com/Eruvae/yolact_ros 下载通信中的话题msg 创建虚拟环境 conda create -n yolact python3.7.10 conda activate yolact 配置yolact环境 https://github.com/dbolya/yolact 运行效果如下所示&#xff1a; 在虚拟环境中安装需要的包 conda …

堡垒机高危命令正则表达式

堡垒机可以设置高危命令阻断&#xff0c;防止操作人员误操作造成删库跑路。但是什么是高危命令&#xff0c;需要管理员通过配置正则表达式&#xff0c;进行命令匹配。 今天2021年8月6日先匹配最常见的删库跑路命令 rm -rf / &#xff0c;以下几种表达式联合起来就可以阻断这类…

实验吧 速度爆破

题目链接&#xff1a;http://ctf5.shiyanbar.com/ppc/sd.php 这道题很简单呀&#xff0c;一点斜的歪的都没有&#xff0c;只是我一个小菜鸟在完成时会遇到一些小麻烦&#xff0c;几度想去看wp&#xff0c;最后还是忍住了。。。 思路很简单 1、 先抓取页面里生成的hash值 2、 循…

返回一个二维整数数组中的最大的子数组和

一。题目&#xff1a; 1、输入一个二维整形数组&#xff0c;数组里有正数有负数。 2、二维数组中连续的一个子矩阵组成一个子数组。 3、求所有子数组的和的最大值。 二.设计思想&#xff1a; .定义一个二维数组&#xff0c;使用二重循环对其进行赋值&#xff0c;对其进行遍历&a…

HashSet中的add()方法( 五 )(详尽版)

上接 HashSet中的add()方法( 四 )&#xff08;详尽版&#xff09; &#xff0c;我们再重写一下equals()方法来看看是否可以不能存入相同的id&#xff1a; 在学生类中再重写equals()方法&#xff1a; public class Student {private String id;public Student(String id) {thi…

ROS话题通信中创建自定义数据类型的两种方式

一、在同一个功能包下创建.msg文件 1、在功能包目录下创建msg文件夹 2、在文件夹中创建.msg文件 3、在该功能包的package.xml文件中加入&#xff1a; <build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend>4、在…

2542513 - AS Java fails to start - Initialization of destination UMEBackendConnection failed

今天发现SAP As Java 开发机无法启动&#xff0c;根据 Note 2542513 处理该问题并记录。 今天发现SAP EPBPM服务器不能正常启动&#xff0c;jstart.exe进程显示 some process running 的黄灯状态。重启也不管用。到SAP官网 https://wiki.scn.sap.com/wiki/display/ASJAVA/%28J…

WordCount扩展与优化

合作者&#xff1a;201631062327&#xff0c;201631062128码云地址&#xff1a;https://gitee.com/LIUJIA6/WordCount3 一&#xff1a;项目说明 本次项目是在上次作业WorldCount的基础上&#xff0c;利用结对编程的思想&#xff0c;完成对WorldCount项目的功能扩展 -s 递归处理…

进制转换 位运算(包括补码、原码、反码、~0等一些零碎东西一次说清)

我发现网上关于标题上的内容介绍的都很零碎&#xff0c;因此为了方便查找、也为了本人对这一部分的充分理解&#xff0c;就想着写一篇这样的博客&#xff08;我分成了几个部分&#xff0c;以便查找&#xff09;&#xff1a; 一、进制转换 让我们先来看看各个进制的定义&#…

第三方物流是什么

​​第三方物流是指生产经营企业为集中精力搞好主业&#xff0c;把原来属于自己处理的物流活动&#xff0c;以合同方式委托给专业物流服务企业&#xff0c;同时通过信息系统与物流企业保持密切联系&#xff0c;以达到对物流全程管理的控制的一种物流运作与管理方式。 第三方物流…

ROS中cv_bridge如何用python3进行编译

最近遇到了个问题&#xff0c;cv_bridge实现了opencv和ros中图像数据类型的转换&#xff0c;但ros-melodic默认python版本是python2。在配置yolact环境的时候&#xff0c;要求是python3。 这就导致在ros自带的cv_bridge是python2版本&#xff0c;想使用python3的话需要自己去编…

Ansible06-管理roles

目录 一、roles的结构 二、RHEL系统roles 三、创建角色 四、部署角色 随着 playbook 的增多&#xff0c;有很多代码重用的机会。ansible 提供了一种方式——roles&#xff0c;只需将 roles 从一个项目复制到另一个项目&#xff0c;然后用 play 调用即可实现代码重用。这里的…

用Java中的HashSet写一个学生管理系统(添加、删除、修改、查询学生信息)

不废话&#xff0c;上代码&#xff1a; 先创建一个Student类&#xff1a; public class Student {private String id;private String name;private String mobile;private String address;public String getId() {return id;}public void setId(String id) {this.id id;}pub…

[BZOJ 2054]疯狂的馒头(并查集)

Description CQF十分喜欢吃馒头。兴奋之下他一下子买了N 个馒头请所有认识他的人吃。 但是CQF不喜欢白色&#xff0c;喜欢红色、黄色、绿色等鲜艳的颜色。于是他把所有白色的馒头排成一列。然后进行M 次染色操作。每个染色操作都是用一个神奇的刷子把连续的多个馒头染成特定的某…

RealSenseD435与ORB-SLAM2实现稠密建图

一、RealSenseD435介绍 RealSenseD435是一款结构光相机&#xff0c;使用左右目相机和红外光实现测距。有效测距范围为0.2~10m 二、ORBSLAM2_with_pointcloud_map的安装 git clone https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map.gitclone代码&#xff0c;无法…

使用appium做自动化测试时,send_keyss只能输入字母数字,无法输入中文

解决方案&#xff1a; driver中增加以下2行配置&#xff1a; "unicodeKeyboard":True, #unicode编码输入 "resetKeyboard":True #隐藏软键盘 转载于:https://www.cnblogs.com/Inbreeze/p/9828568.html

centos8安装KVM/QEUM虚拟化

centos8安装KVM/QEUM。安装虚拟化主机组。启动libvirtd服务。 yum groupinstall "Virtualization Host" systemctl enable libvirtd systemctl start libvirtd 谁可以使用虚拟化呢&#xff1f;加入libvirt组即可。 usermod -aG libvirt <username> 安装Vir…

病毒的灵魂拷问(绝对原创)

哈哈哈&#xff0c;我敢说&#xff0c;这篇博客绝不会有重复的&#xff0c;因为它是我上课的走神之作&#xff0c;哈哈哈&#xff01; 不废话&#xff0c;上代码&#xff1a; import java.util.Scanner; import java.util.*; public class Test {public static void main(Str…