Ansible定义各类变量,引用变量方式介绍及注册变量和vars_prompt的用法示例

本文主要是介绍Ansible定义各类变量,引用变量方式介绍及注册变量和vars_prompt的用法示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一.Ansible定义变量

1.用途

2.定义规则

3.变量优先级

二.命令行定义变量

三.定义主机和主机组变量

1.主机变量

(1)内置主机变量

(2)简单示例

2.主机组变量

四.定义playbook变量

1.通过vars表示定义变量,通过' "{{变量名}}" '来引用变量

2.通过vars_file指定变量文件

五.定义host_vars和group_vars目录变量

1.主机组变量使用group_vars

2.主机变量只用host_vars

3.以主机变量简单为例演示

六.注册变量

七.vars_prompt交互变量

1.参数解析

2.简单交互案例

3.创建用户和密码示例

(1)encrypt

(2)confirm

八.引用变量

1.引用简单定义的变量

2.引用较为复杂定义的变量


一.Ansible定义变量

1.用途

ansible的变量主要用于存储在整个项目中重复使用的一些值,来提高创建任务和维护节点的效率

2.定义规则

变量名由字母、数字、下划线组成,由字母开头

内置关键字不能作为变量名

3.变量优先级

全局范围内命令行设置的变量>playbook及其相关配置的变量>主机和组清单的变量>ansible.cfg配置文件设置的变量

二.命令行定义变量

如上文所述,命令行使用"-e '变量名=值' "设置的变量优先级最高,下面举例演示命令行变量覆盖playbook中的变量

[root@main ~]# cat abc.yaml 
---
- hosts: webserversvars:myservice: httpd   #原本playbook内容为停掉httpdtasks:- name: test1service:name: "{{ myservice }}"state: stopped
[root@main ~]# ansible-playbook abc.yaml -e 'myservice=chronyd'
#运行时指定变量更改为关掉chronyd
[root@main ~]# ansible webservers -m shell -a 'systemctl status httpd | grep Active'
serverb | CHANGED | rc=0 >>Active: active (running) since Tue 2023-10-17 14:06:57 CST; 5h 22min ago
servera | CHANGED | rc=0 >>Active: active (running) since Tue 2023-10-17 19:25:46 CST; 3min 12s ago
[root@main ~]# ansible webservers -m shell -a 'systemctl status chronyd | grep Active'
serverb | CHANGED | rc=0 >>Active: inactive (dead) since Tue 2023-10-17 19:28:30 CST; 35s ago
servera | CHANGED | rc=0 >>Active: inactive (dead) since Tue 2023-10-17 19:28:30 CST; 35s ago
#运行结果可以看出,停掉httpd未生效,停chonyd生效,命令行给定变量优先级高于playbook给定变量优先级

三.定义主机和主机组变量

1.主机变量

(1)内置主机变量

在变量前加上"ansible_"即成为内置变量

部分内置主机关于ssh和提权的变量举例

ansible_ssh_host:指定受管节点主机真实IP地址
ansible_ssh_port:指定通过哪个端口连接受管节点
ansible_ssh_user:指定连接时使用的用户名称
ansibe_connection:指定ssh连接类型,local、ssh、paramiko
ansible_ssh_pass:ssh连接时使用的密码
ansible_ssh_executable:指定ssh指定的路径
​
ansible_become:允许特权升级,等同于ansible_sudo,ansible_su
ansible_become_user:提权到哪个用户,等同于ansible_sudo_user,ansible_su_user
ansbile_become_pass:需要密码时指定密码,等同于ansible_sudo_pass
ansible_sudo_exec:指定sudo命令路径

(2)简单示例

[student@workstation ~]$ vim user.yml
#不属于任何组的用户
192.168.2.190 ansible_ssh_user=root ansible_user_pass='redhat'
192.168.2.191 ansible_ssh_user=root ansible_user_pass='su123'

2.主机组变量

如上例,将两台受管节点相等的部分定义为一个变量

[student@workstation ~]$ vim user.yml
192.168.2.190 ansible_ssh_user=root ansible_user_pass='redhat'
192.168.2.191 ansible_ssh_user=root ansible_user_pass='su123'
#更改为
192.168.2.190  ansible_user_pass='redhat'
192.168.2.191  ansible_user_pass='su123'
[webservers:vars]
ansible_ssh_user=root

四.定义playbook变量

1.通过vars表示定义变量,通过' "{{变量名}}" '来引用变量

[root@localhost ~]# cat httpd.yaml 
---
- name: install httpd chronyhosts: webserversvars:   #声明在此处定义变量mypackages:     #变量名- httpd- chronymyhttpd: httpd mychronyd: chronydtasks:- name: install themyum:name: "{{ mypackages }}"   #使用变量state: present- name: start httpdservice:name: "{{ myhttpd }}"state: started- name: start chronydservice:name: "{{ mychronyd }}"state: started
​
[root@localhost ~]# ansible webservers -m shell -a 'systemctl status httpd | grep Active'
serverb | CHANGED | rc=0 >>Active: active (running) since Tue 2023-10-17 14:06:57 CST; 3min 45s ago
servera | CHANGED | rc=0 >>Active: active (running) since Tue 2023-10-17 14:06:57 CST; 3min 45s ago
[root@localhost ~]# ansible webservers -m shell -a 'systemctl status chronyd | grep Active'
servera | CHANGED | rc=0 >>Active: active (running) since Tue 2023-10-17 13:29:27 CST; 41min ago
serverb | CHANGED | rc=0 >>Active: active (running) since Tue 2023-10-17 13:31:57 CST; 38min ago

2.通过vars_file指定变量文件

[root@main ~]# cat myvar1.yaml   #vars文件也使用yaml格式
packages:- rpcbind- openssl[root@main ~]# cat httpd1.yaml 
---
- name: install rpcbind opensslhosts: webserverstasks:- name: install themyum:name: "{{ packages }}"   #同样这样使用变量state: presentvars_files:   #指定vars文件- myvar1.yaml   #指定你自己的vars问文件位置,这里是当前路径下的myvars1.yaml文件
​
[root@main ~]# ansible-playbook httpd1.yaml --syntax-check
​
playbook: httpd1.yaml
[root@main ~]# ansible-playbook httpd1.yaml 
​
[root@main ~]# ansible webservers -m shell -a 'yum list installed | grep rpcbind'
servera | CHANGED | rc=0 >>
rpcbind.x86_64                        0.2.0-49.el7                     @base    
serverb | CHANGED | rc=0 >>
rpcbind.x86_64                        0.2.0-49.el7                     @base    
[root@main ~]# ansible webservers -m shell -a 'yum list installed | grep openssl'
servera | CHANGED | rc=0 >>
openssl.x86_64                        1:1.0.2k-19.el7                  @anaconda
openssl-libs.x86_64                   1:1.0.2k-19.el7                  @anaconda
xmlsec1-openssl.x86_64                1.2.20-7.el7_4                   @anaconda
serverb | CHANGED | rc=0 >>
openssl.x86_64                        1:1.0.2k-19.el7                  @anaconda
openssl-libs.x86_64                   1:1.0.2k-19.el7                  @anaconda
xmlsec1-openssl.x86_64                1.2.20-7.el7_4                   @anaconda

五.定义host_vars和group_vars目录变量

1.主机组变量使用group_vars

group_vars是一个目录,这个名称固定,必须是和你的inventory文件和ansible.cfg文件位于同一级目录,其下创建的文件需要和你主机清单中的组名称一致,在这个文件中写入变量和值

2.主机变量只用host_vars

host_vars和group_vars相同,也是一个目录,名称固定,必须和inventory文件和ansible.cfg文件位于同一级目录,其下创建的文件需要和你主机清单中的主机名称一致(清单文件中写的是主机名就写=用主机名,是IP地址就用IP地址),在这个文件中写入变量和值

3.以主机变量简单为例演示

[root@main ~]# tree /root
/root
├── anaconda-ks.cfg
├── ansible.cfg
├── group_vars
│   ├── dbservers
│   └── webservers
├── host_vars
│   ├── servera
│   └── serverb
├── httpd1.yaml
├── httpd.yaml
├── myhosts
├── myhttpd.yaml
└── myvar1.yaml
​
[root@main ~]# cat host_vars/servera
aname: httpd
[root@main ~]# cat host_vars/serverb
bname: mod_ssl
​
[root@main ~]# cat myhttpd.yaml 
---
- name: stop servera httpdhosts: serveratasks:- name: stop itservice:name: "{{ aname }}"     #在剧本中就可以直接用用定义好的主机变量state: stopped
- name: install serverb mod_sslhosts: serverbtasks:- name: install ityum:name: "{{ bname }}"state: present
​
[root@main ~]# ansible-playbook myhttpd.yaml --syntax-check
​
playbook: myhttpd.yaml
[root@main ~]# ansible-playbook myhttpd.yaml
​
[root@main ~]# ansible servera -m shell -a 'systemctl status httpd | grep Active'
servera | CHANGED | rc=0 >>Active: inactive (dead)
[root@main ~]# ansible serverb -m shell -a 'yum list installed | grep mod_ssl'
serverb | CHANGED | rc=0 >>
mod_ssl.x86_64                        1:2.4.6-99.el7.centos.1          @updates 

六.注册变量

注册变量主要是使用register来捕获命令的输出,将其保存在一个临时变量中,便于进行特定操作。

如下例,将"id su"的结果注册为"su",并使用debug模块输出su的内容,并在playbook执行后的debug结果中判断出该用户是否存在

[root@main ~]# cat iduser.yaml 
---
- name: is su existhosts: webserverstasks:- name: test sushell: id suregister: suignore_errors: yes   #便于测试,忽略错误- name: echo itdebug:msg: "{{ su }}"
​
[root@main ~]# ansible-playbook iduser.yaml
​
PLAY [is su exist] ******************************************************************************************************************************
​
TASK [Gathering Facts] **************************************************************************************************************************
ok: [servera]
ok: [serverb]
​
TASK [test su] **********************************************************************************************************************************
changed: [servera]
changed: [serverb]
​
TASK [echo it] **********************************************************************************************************************************
ok: [servera] => {"msg": {"changed": true, "cmd": "id su", "delta": "0:00:00.004109", "end": "2023-10-17 19:05:47.215481", "failed": false, "rc": 0,   #为0表示存在,非0不存在"start": "2023-10-17 19:05:47.211372", "stderr": "", "stderr_lines": [], "stdout": "uid=1000(su) gid=1000(su) groups=1000(su)",    #有会输出该用户的详细信息,没有会提示不存在此用户"stdout_lines": ["uid=1000(su) gid=1000(su) groups=1000(su)"]}
}
ok: [serverb] => {"msg": {"changed": true, "cmd": "id su", "delta": "0:00:00.004695", "end": "2023-10-17 19:05:47.220915", "failed": false, "rc": 0, "start": "2023-10-17 19:05:47.216220", "stderr": "", "stderr_lines": [], "stdout": "uid=1000(su) gid=1000(su) groups=1000(su)", "stdout_lines": ["uid=1000(su) gid=1000(su) groups=1000(su)"]}
}
​
PLAY RECAP **************************************************************************************************************************************
servera                    : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
serverb                    : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

七.vars_prompt交互变量

用于交互提示用户输入值

1.参数解析

prompt表示对用户的提示信息

private表示用户在输入时是否隐藏输入的信息

default表示如果用户没有输入,则此项的默认值

2.简单交互案例

[root@main ~]# cat register.yaml 
---
- hosts: webserversvars_prompt:- name: "one"prompt: "请输入第一个值"private: no- name: "two"prompt: "请输入第二个值"#default: 'hello'private: yestasks:- name: dis one valuedebug: msg="{{one}}"- name: dis two valuedebug: msg="{{two}}"
#测试结果
[root@main ~]# ansible-playbook register.yaml
请输入第一个值: nihao
请输入第二个值:             #private为yes,此处我输入时会隐藏信息
​
PLAY [webservers] *******************************************************************************************************************************
​
TASK [Gathering Facts] **************************************************************************************************************************
ok: [servera]
ok: [serverb]
​
TASK [dis one value] ****************************************************************************************************************************
ok: [servera] => {"msg": "nihao"
}
ok: [serverb] => {"msg": "nihao"
}
​
TASK [dis two value] ****************************************************************************************************************************
ok: [servera] => {        #显示输入的信息"msg": "hello"
}
ok: [serverb] => {"msg": "hello"
}
​
PLAY RECAP **************************************************************************************************************************************
servera                    : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
serverb                    : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

3.创建用户和密码示例

(1)encrypt

可以指定在密码处可以指定使用sha512对密码进行哈希加密

(2)confirm

可以设置重复确认密码,两次密码不符合会报“* VALUES ENTERED DO NOT MATCH ”

[root@main ~]# cat register1.yaml 
---
- hosts: webserversvars_prompt:- name: "name"prompt: "enter user_name"private: no- name: "passwd"prompt: "enter user_passwd"private: yes#encrypt: "sha512_crypt"   #confirm: yes           tasks:- name: create himuser:name: "{{ name }}"password: "{{ passwd }}"
​
[root@main ~]# ansible-playbook register1.yaml
enter user_name: sulibao
enter user_passwd: 
[WARNING]: Found variable using reserved name: name
​
PLAY [webservers] *******************************************************************************************************************************
​
TASK [Gathering Facts] **************************************************************************************************************************
ok: [serverb]
ok: [servera]
​
TASK [create him] *******************************************************************************************************************************
[WARNING]: The input password appears not to have been hashed. The 'password' argument must be encrypted for this module to work properly.
changed: [serverb]
changed: [servera]
​
PLAY RECAP **************************************************************************************************************************************
servera                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
serverb                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
​
[root@main ~]# ansible webservers -a 'id sulibao'
serverb | CHANGED | rc=0 >>
uid=1001(sulibao) gid=1001(sulibao) groups=1001(sulibao)
servera | CHANGED | rc=0 >>
uid=1001(sulibao) gid=1001(sulibao) groups=1001(sulibao)
​
#未加密的密码
[root@main ~]# ansible webservers -m shell -a 'cat /etc/shadow | grep sulibao'
serverb | CHANGED | rc=0 >>
sulibao:ansible:19647:0:99999:7:::
servera | CHANGED | rc=0 >>
sulibao:ansible:19647:0:99999:7:::
#加密后
[root@main ~]# ansible webservers -m shell -a 'cat /etc/shadow | grep li'
serverb | CHANGED | rc=0 >>
sulibao:ansible:19647:0:99999:7:::
li:$6$U0qiY4DnzK8AWcBe$rIFmtpCr.1qU3sxtv90U2bRaZbxgqj1PK9UV4wp6W8zWXigHTfcfuFjJ0AvCZMb0Xe75juLlarm94xNZUnoCX.:19647:0:99999:7:::
servera | CHANGED | rc=0 >>
sulibao:ansible:19647:0:99999:7:::
li:$6$U0qiY4DnzK8AWcBe$rIFmtpCr.1qU3sxtv90U2bRaZbxgqj1PK9UV4wp6W8zWXigHTfcfuFjJ0AvCZMb0Xe75juLlarm94xNZUnoCX.:19647:0:99999:7:::

八.引用变量

1.引用简单定义的变量

[root@main ~]# cat myvar1.yaml 
packages:               #类似于定义了一个列表形式的变量- rpcbind- openssl
[root@main ~]# cat httpd1.yaml 
---
- name: install rpcbind opensslhosts: webserverstasks:- name: install themyum:name: "{{ packages }}"    #就直接通过“ "{{变量名}}" ”来引用state: presentvars_files:- myvar1.yaml

2.引用较为复杂定义的变量

[root@main ~]# cat myvar2.yaml 
su:           #定义了一个层层嵌套的变量name:tname: sulibaofname: libaosu
[root@main ~]# cat echo.yaml 
---
- hosts: webserverstasks:- name: echo somethingdebug:msg: "{{ su.name.fname }}"          #需要使用嵌套定义的变量时,需要使用"."或者"[]"来表示一层一层地引用#msg: "{{ su['name']['fname'] }}"vars_files:- myvar2.yaml
#运行查看结果
[root@main ~]# ansible-playbook echo.yaml 
​
PLAY [webservers] *******************************************************************************************************************************
​
TASK [Gathering Facts] **************************************************************************************************************************
ok: [serverb]
ok: [servera]
​
TASK [echo something] ***************************************************************************************************************************
ok: [servera] => {"msg": "libaosu"
}
ok: [serverb] => {"msg": "libaosu"
}
​
PLAY RECAP **************************************************************************************************************************************
servera                    : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
serverb                    : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
​

这篇关于Ansible定义各类变量,引用变量方式介绍及注册变量和vars_prompt的用法示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/242196

相关文章

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

菲律宾诈骗,请各位华人朋友警惕各类诈骗。

骗子招聘类型:程序开发、客服、财务、销售总管、打字员等 如果有人用高薪、好的工作环境来你出国工作。要小心注意!因为这些骗子是成群结伴的! 只要你进入一个菲律宾的群,不管什么类型的群都有这些骗子团伙。基本上是他们控制的! 天天在群里有工作的信息,工作信息都是非常诱惑人的。例如招“打字员”、“客服”、“程序员”……各种信息都有。只要你提交简历了,他会根据你的简历判断你这个人如何。所谓的心理战嘛!

变量与命名

引言         在前两个课时中,我们已经了解了 Python 程序的基本结构,学习了如何正确地使用缩进来组织代码,并且知道了注释的重要性。现在我们将进一步深入到 Python 编程的核心——变量与命名。变量是我们存储数据的主要方式,而合理的命名则有助于提高代码的可读性和可维护性。 变量的概念与使用         在 Python 中,变量是一种用来存储数据值的标识符。创建变量很简单,

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现