Ansible的变量
Ansible的变量
ansible支持变量,用于存储会在整个项目中重复使用的一些值,以简化项目的创建和维护,灵活使用可以编写出不同场景下通用的剧本
ansible的变量的定义有好几种方式,分别是
- 在主机清单中定义
- 通过vars定义
- 通过vars_files定义
- 通过host_vars和group_vars定义
- 注册变量
变量的定义规则:
- 变量名由字母,数字,下划线组成
- 变量名必须以字母开头
- 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