目录
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
分类: Ansible