Ansible的变量

简介: Ansible的变量

目录

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代表那个命令的输出是什么

本文来自博客园,作者:FuShudi,转载请注明原文链接:https://www.cnblogs.com/fsdstudy/p/18259065

分类: Ansible

目录
相关文章
|
5月前
|
JSON 数据格式 索引
Ansible fact变量与魔法变量
Ansible fact变量与魔法变量
77 6
|
缓存 运维 监控
【运维知识进阶篇】Ansible变量详解(变量定义+变量优先级+变量注册+层级定义变量+facts缓存变量)
【运维知识进阶篇】Ansible变量详解(变量定义+变量优先级+变量注册+层级定义变量+facts缓存变量)
420 0
|
存储 JSON 数据安全/隐私保护
ansible定义变量和管理事实
ansible定义变量和管理事实
161 0
|
存储 缓存 监控
【2023】ansible-variables变量详解
【2023】ansible-variables变量详解
141 0
Ansible 自定义变量与 role 默认变量的合并方法
如果你遇到 failed to combine variables, expected dicts but got a 'NoneType' and a 'dict' 这样的报错,你可以看看本文。
340 0
|
存储 JSON 缓存
ansible学习之旅(facts变量)
ansible学习之旅(facts变量)
190 0
ansible学习之旅(初识变量)
ansible学习之旅(初识变量)
89 0
|
关系型数据库 MySQL 应用服务中间件
|
Shell 网络安全 数据安全/隐私保护
ansible主机清单配置以及变量解释(二)
1.配置ansible主机清单 清单文件位于/etc/ansible/hosts
570 0
ansible主机清单配置以及变量解释(二)
Ansible-playbook 应用变量(学习笔记二十)
文件 [root@ansible-server ansible]# tree ./ ./ ├── hosts └── var.yaml hosts 文件 [web] 192.
1127 0