首页 > 其他分享 >Ansible的变量

Ansible的变量

时间:2024-06-20 17:22:01浏览次数:25  
标签:变量 vars ansible 192.168 Ansible 200.210 定义

目录

Ansible的变量

ansible支持变量,用于存储会在整个项目中重复使用的一些值,以简化项目的创建和维护,灵活使用可以编写出不同场景下通用的剧本

ansible的变量的定义有好几种方式,分别是

  1. 在主机清单中定义
  2. 通过vars定义
  3. 通过vars_files定义
  4. 通过host_vars和group_vars定义
  5. 注册变量

变量的定义规则:

  • 变量名由字母,数字,下划线组成
  • 变量名必须以字母开头
  • ansible内置变量不能作为变量名

1. 在主机清单中定义

内置主机变量,所谓的内置变量就是ansible.cfg这个配置文件中的选项,在其前面加上ansible_ 使其变为内置变量,当然,他的优先级高于ansible.cfg,也就是说我们对不同的主机定义不同的值

我们设想这样一种场景,有10台服务器需要管理,但是这10台服务器的ssh用户名都不一样,密码也不一样,我们应该怎么做呢?用传统的做法,需要将每个公钥文件传到对应的节点,但是如果主机有100个呢?也这样传吗?这个时候我们就可以通过定义内置变量来搞定

1.1 定义内置变量

[ansible@master ansible]$ vim inventory 
192.168.200.210 ansible_ssh_user=root ansible_ssh_pass=123
192.168.200.220 ansible_ssh_user=ansible ansible_ssh_pass=openEule
r
192.168.200.230 ansible_ssh_user=devops ansible_ssh_pass=Redhat@12
3

这样写好之后,ansible就会以root的身份,并且密码是123去连接192.168.200.210这个主机

,以ansible用户去连接192.168.200.220 这个主机,因为我这里就只有一个节点,所以下面2个是我为了演示区别而添加的,后面会删掉

1.2 定义内置变量使用提权

我们之前只定义了连接信息,我们还可以还定义让他是否提权

[ansible@master ansible]$ vim inventory 
192.168.200.210 ansible_ssh_us192.168.200.210 ansible_ssh_user=ansible ansible_ssh_pass=123 ansible_become=yes
[ansible@master ansible]$ ansible all -m shell -a 'whoami'
192.168.200.210 | CHANGED | rc=0 >>
ansible

我们可以看到,在这里定义了ansible_become之后他并没有提权到root了,我们再将提权打开

[ansible@master ansible]$ vim inventory 
192.168.200.210 ansible_ssh_user=ansible ansible_ssh_pass=123 ansible_become=yes
[ansible@master ansible]$ ansible all -m shell -a 'whoami'
192.168.200.210 | CHANGED | rc=0 >>
root

看到了吧,我没有给他发送公钥,他会使用这个连接信息去连接,并且提权也是正常的

只要是ansible.cfg配置文件里面存在的配置项,我们都可以去到这里面定义

1.3 给主机组定义变量

刚刚演示的是给单个主机定义变量,现在我们来看如何给某个主机组去定义变量

[ansible@master ansible]$ vim inventory 
[test]
192.168.200.210

[test:vars]
ansible_user=ansible
ansible_ssh_pass=123
ansible_become=yes

首先,192.168.200.210这个主机属于test组,然后在下面定义了test组的变量,定义的都是内置变量

1.4 定义自定义变量

我们刚刚都是在inventory中定义的内置变量,那我们可以定义自己的变量吗?

也是可以的

[ansible@master ansible]$ vim inventory
[test]
192.168.200.210 os=euler

[test:vars]
ansible_user=ansible
ansible_ssh_pass=123
ansible_become=yes
websoft=nginx

在这个文件里,除了我们之前定义的内置变量,现在还存在我们自己定义的变量,如何去引用这些自定义变量呢?

[ansible@master ansible]$ vim use-vars.yaml
- name: use vars
  hosts: test
  tasks:
    - name: print os and websoft
      debug:
        msg: "websost is {{ websoft }} os is {{ os }}"

变量的引用是需要"{{var_name}}"这样写的,一对双引号里面可以写多个变量,但是一对花括号里面只能写一个变量名,因为我们只给test主机组定义了变量,所以我们需要在test组上执行

[ansible@master ansible]$ ansible-playbook use-vars.yaml 

PLAY [use vars] ****************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.200.210]

TASK [print os and websoft] ****************************************************
ok: [192.168.200.210] => {
    "msg": "websost is nginx os is euler"
}

我们可以看到,他将变量都替换了

2. 通过vars定义变量

这种方式是直接在playbook里面去定义

[ansible@master ansible]$ vim define-vars-in-playbook.yaml 
- name: define vars in playbook
  hosts: all
  vars:
    http_port: 80
    http_address: 127.0.0.1
    conf: /etc/nginx/nginx.conf
  tasks:
    - name: print playbook vars
      debug:
        msg: " http port is {{ http_port }} address is {{ http_address }} conf in {{ conf }}"

执行剧本查看输出

[ansible@master ansible]$ ansible-playbook define-vars-in-playbook.yaml 

PLAY [define vars in playbook] *************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.200.210]

TASK [print playbook vars] *****************************************************
ok: [192.168.200.210] => {
    "msg": " http port is 80 address is 127.0.0.1 conf in /etc/nginx/nginx.conf"
}

3. 通过vars_files定义变量

需要先在文件里面将变量写好,并且是以键值对的方式

[ansible@master ansible]$ mkdir vars
[ansible@master ansible]$ vim vars/users.yaml
users:
  zhangsan:
    id: 1888
    home: /home/zhangsan
  lisi:
    id: 2888
    home: /tmp/lisi

使用这个变量文件

[ansible@master ansible]$ vim test-vars-files.yaml 
[ansible@master ansible]$ ansible-playbook test-vars-files.yaml 

PLAY [vars files] **************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.200.210]

TASK [print vars in files] *****************************************************
ok: [192.168.200.210] => {
    "msg": "zhangsan id is 1888 lisi id is 2888"
}

通过回显我们得知定义在文件内的变量也被引用到了

4. 通过host_vars和group_vars定义变量

使用这种方式我们需要先将host_vars或者group_vars这个目录先创建出来,如果2个都需要使用那么2个都要创建,然后这些目录下存放与你主机名/主机组名对应的文件名,里面写上变量

比如我的组是test,那我就需要在group_vars下编写一个文件,名为test,然后在这里面写入变量,host也是一样

[ansible@master ansible]$ mkdir host_vars group_vars
[ansible@master ansible]$ cd group_vars
[ansible@master ansible]$ vim test
ip: 192.168.200.210

使用group_vars

[ansible@master ansible]$ vim host-and-group-vars.yaml 
- name: hostvars and groupvars
  hosts: test
  tasks:
    - name: print group vars
      debug:
        msg: "{{ ip }}"
        
[ansible@master ansible]$ ansible-playbook host-and-group-vars.yaml 

PLAY [hostvars and groupvars] **************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.200.210]

TASK [print group vars] ********************************************************
ok: [192.168.200.210] => {
    "msg": "192.168.200.210"
}

他正确的输出了主机的IP地址

5. 注册变量

有些时候需要将一些任务执行的结果保存下来变成一个变量,然后以这个为依据来决定后续的任务该怎么执行

- name: registry vars
  hosts: all
  tasks:
    - name: First task
      shell: whoami
      registry: who
    - name: print registry
      debug:
        msg: "{{ who }}"

先看结果

[ansible@master ansible]$ ansible-playbook registry.yaml 
ok: [192.168.200.210] => {
    "msg": {
        "changed": true,
        "cmd": "whoami",
        "delta": "0:00:00.002256",
        "end": "2024-06-20 17:11:53.606146",
        "failed": false,
        "rc": 0,
        "start": "2024-06-20 17:11:53.603890",
        "stderr": "",
        "stderr_lines": [],
        "stdout": "root",
        "stdout_lines": [
            "root"
        ]
    }

这个变量他会有这么多输出,我们一般看rc(return code),如果rc为0的话就代表这个任务是正常执行的,stdout代表那个命令的输出是什么

标签:变量,vars,ansible,192.168,Ansible,200.210,定义
From: https://www.cnblogs.com/fsdstudy/p/18259065

相关文章

  • Ansible playbook
    目录Playbook(剧本)1.yaml1.1yaml的语法规则1.2yaml的数据类型1.3yaml的示例2.ansible-playbook2.1playbook入门2.2执行playbook2.3使用playbook安装软件3.更多示例Playbook(剧本)我们之前执行ansble是通过ad-hoc的方式来执行的,这样执行的好处就是我的任务只有1个的时......
  • Ansible的常用模块
    目录ansible常用模块1.file模块1.1file模块的选项1.2file模块的使用1.2.1使用file模块在远程主机创建文件1.2.2创建目录1.2.3删除文件/目录2.copy模块2.1copy模块的选项2.2copy模块的使用3.yum_repository模块3.1yum_repository的选项3.2yum_repository的使用4.yum......
  • Windows中在commond如何设置系统环境变量
    最近测试项目中需要配置一个python环境用来发workjob,配置过程中有一个步骤需要增加系统变量:addtwosystemenvvarsforthetestapplicationbydifferentenvironments(dev/stg/prod):FORGE_TEST_CLIENT_IDFORGE_TEST_CLIENT_SECRET处理方法:1、查看已经设置了哪......
  • Spring Environment 容器环境变量注入Spring属性不一致却能生效
    https://blog.csdn.net/fenglllle/article/details/126942480 前言最近使用容器部署应用,Spring应用,会注入一些环境变量,然而这些环境变量的大小写和真实的取值差异很大,而且也不是xxx.xxx,而是xxx_xxx,非常奇怪,代码里也没发现原因。通过分析Spring源码发现,原理就是Spring的特殊处理......
  • clion调试不显示qt变量值的问题
    用Clion做QT开发,调试时不能正常显示qt相关变量的值,只能显示地址,还要切换到qtcreator调试,很麻烦,就在网上找解决办法。搜了一圈,果然找到了,按照这篇文章中Clion调试QTQString看不到值问题处理_macosclion看不到qt变量内容-CSDN博客设置没用,又找到官方文档上一顿操作,还是不行。Q......
  • shell - 变量及数学计算
    变量声明#注意:以num=1为例,等号两边不能有空格#数字num=1#字符串str0=teststr1='test'str2="test"#字符串的三种声明方式是有区别的:#1.单引号中的内容回原样输出,不会转义,不会取值。#2.双引号中的内容输出,会转义,会取值。#3.没有引号和双引号效果一样。......
  • Bat中实现git和Maven环境变量检测,拉取git代码并打包maven项目,读取子目录差异性yml文件
    场景Docker+Jenkins+Pipline实现SpringBoot项目input选择不同差异性yml文件打包、执行sh打包压缩包、使用archiveArtifacts下载制品(jar包、压缩包):https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/139748758上面实现打包后台jar包并选择不同的差异性yml文件打包成......
  • 区间预测 | Matlab实现的集成双向长短期记忆网络自适应带宽核密度BiLSTM-Adaboost-ABK
    %设置参数numLSTM=3;%LSTM模型数量numBoost=5;%Adaboost迭代次数%加载数据load(‘data.mat’);%替换为您的数据文件%数据预处理%…%初始化LSTM模型lstmModels=cell(numLSTM,1);fori=1:numLSTMlstmModels{i}=trainLSTMModel(data);%使用......
  • Ansible笔记
    1、Ansible基本介绍Ansible是一个自动化的管理IT资源的工具。1)Ansible基本介绍Ansible功能Ansbile优点Ansible缺点系统环境配置无客户的效率低、易挂起安装仁济推送式持续集成丰富的module热回滚基于YAML的Playbook2)Ansible与其他软件的对比......
  • Postman 集合变量使用详解
    前言作为一名测试工程师,在API测试中,Postman是一款强大的工具。集合变量是Postman中的重要功能,能够让测试更加灵活、高效。本文将详细介绍Postman集合变量的定义、使用和管理方法,帮助您更好地掌握这项技能。什么是集合变量集合变量是定义在Postman集合(Collection)范围内......