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

posted @ 2024-06-20 17:14  FuShudi  阅读(66)  评论(0编辑  收藏  举报