Ansible管理变量

1、Ansible变量简介

Ansible支持利用变量来存储值,并在Ansible项目的所有文件中重复使用这些值。这可以简化项目的创建和维护,并减少错误的数量。

通过变量,可以轻松地在Ansible项目中管理给定环境的动态值。例如,变量可能包含下面这些值:

  • 要创建的用户
  • 要安装的软件包
  • 要重新启动的服务
  • 要删除的文件
  • 要从互联网检索的存档

2、命名变量

变量的名称必须以字母开头,并且只能包含字母、数字和下划线

无效的变量名称有效的变量名称
web serverweb_server
remote.fileremote_file
1st filefile_1
remoteserver$1remote_server_1

3、定义变量

可以在Ansible项目中的多个位置定义变量。不过,这些变量大致可简化为三个范围级别:

  • 全局范围:从命令行或Ansible配置设置的变量
  • Play范围:在play和相关结构中设置的变量
  • 主机范围:由清单、事实收集或注册的任务,在主机组和个别主机上设置的变量

如果在多个xeklh定义了相同名称的变量,则采用优先级别最高的变量。窄范围优先于更广泛的范围:由清单定义的变量将被playbook定义的变量覆盖,后者将被命令行中定义的变量覆盖。

4、playbook中的变量

编写playbook时,可以定义自己的变量,然后在任务中调用这些值。例如,名为web_package的变量可以使用值httpd来定义。然后,任务可以使用yum模块调用该变量来安装httpd软件包。

Playbook变量可以通过多种方式定义。一种常见的方式是将变量放在playbook开头的vars块中:

[root@master playbook]# vim test.yml
---
- hosts: apache
  gather_facts: no
  vars:
    name: t
    uid: 2000
  tasks:
    - name:
      user:
        name: "{{ name }}"
        uid: "{{ uid }}"
        state: present
[root@master playbook]# ansible-playbook test.yml 
[WARNING]: Found variable using reserved name: name

PLAY [apache] ******************************************************************

TASK [user] ********************************************************************
changed: [192.168.47.159]

PLAY RECAP *********************************************************************
192.168.47.159            : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
[root@localhost ~]# id t
uid=2000(t) gid=2000(t)=2000(t)

也可以在外部文件中定义playbook变量。此时不使用playbook中的vars块,可以改为使用vars_files指令,后面跟上相对于playbook位置的外部变量文件名称列表:

[root@master playbook]# cat lly.yml 
---
- hosts: apache
  gather_facts: on
  vars:
   - vars/yy.yml
  tsaks:
  - name: tom
    shell: echo {{ cc }} > /opt/ll
[root@master vars]# cat yy.yml 
cc: helo word 
[root@ansible playbook]# ansible-playbook lly.yml

PLAY [apache] ******************************************************************

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

TASK [tom] *********************************************************************
changed: [192.168.47.159]

PLAY RECAP *********************************************************************
192.168.47.159            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
[root@localhost ~]# cd /opt/
[root@localhost opt]# cat ll
helo word

在playbook中使用变量
声明了变量后,可以在任务中使用这些变量。若要引用变量,可以将变量名放在双大括号内。在任务执行时,Ansible会将变量替换为其值。

例:
vars:
  user: joe
  
tasks:
  # This line will read: Creates the user joe
  - name: Creates the user {{ user }}
    user:
      # This line will create the user named joe
      name: "{{ user }}"

注意:当变量用作开始一个值的第一元素时,必须使用引号。这可以防止Ansible将变量引用视为YAML字典的开头

5、主机变量和组变量

直接应用于主机的清单变量分为两在类:

  • 主机变量,应用于特定主机
  • 组管理,应用于一个主机组或一组主机组中的所有主机

主机变量优先于组变量,但playbook中定义的变量的优先级比这两者更高。

若要定义主机变量和组变量,一种方法是直接在清单文件中定义。这是较旧的做法,不建议采用,但你可能会在未来的工作当中遇到。

定义192.168.47.159 ansible_user主机变量:

[servers]
192.168.47.159 ansible_user=root ansible_passwd=1

定义servers主机组的user组变量:

192.168.47.159
192.168.47.157

[servers:vars]
user=root

定义servers组的user组变量,该组由两个主机组成,每个主机组有两个服务器:

[servers1]
node1
node2

[servers2]
node3
node4

[servers:children]
servers1
servers2

[servers:vars]
user=test

6、命令行覆盖变量

清单变量可被playbook中设置的变量覆盖,这两种变量又可通过在命令行中传递参数到ansible或ansible-playbook命令来覆盖。在命令行上设置的变量称为额外变量。

当需要覆盖一次性运行的playbook的变量的已定义值时,额外变量非常有用。例如:

[root@master playbook]# vim user.yml
---
- name: 
  gather_facts: no
  hosts: apache
  tasks:
    - name: 创建用户 {{ user }}
      user:
        name: "{{ user }}"
        state: present
[root@master playbook]# ansible-playbook -e "user=tom" user.yml 

PLAY [192.168.47.159] *********************************************************

TASK [创建用户 tom] **************************************************************
changed: [192.168.47.159]

PLAY RECAP *********************************************************************
192.168.47.159            : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
[root@localhost opt]# id tom 
uid=9990(tom) gid=9990(tom)=9990(tom)

7、使用已注册变量捕获命令输出

可以使用register语句捕获命令输出。输出保存在一个临时变量中,然后在playbook中可用于调试用途或者达成其他目的,例如基于命令输出的特定配置

[root@master playbook]# vim xx.yml 
[root@master playbook]# cat xx.yml 
---
- hosts: apache
  gather_facts: no
  tasks:
    - name: register variables
      command: "df -h"
      register: result
   
    - debug: var=result

[root@master playbook]# ansible-playbook xx.yml 

PLAY [apache] ******************************************************************

TASK [register variables] ******************************************************
changed: [192.168.47.159]

TASK [debug] *******************************************************************
ok: [192.168.47.159] => {
    "result": {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/libexec/platform-python"
        }, 
        "changed": true, 
        "cmd": [
            "df", 
            "-h"
        ], 
        "delta": "0:00:00.002627", 
        "end": "2021-07-23 18:41:12.697724", 
        "failed": false, 
        "rc": 0, 
        "start": "2021-07-23 18:41:12.695097", 
        "stderr": "", 
        "stderr_lines": [], 
        "stdout": "文件系统               容量  已用  可用 已用% 挂载点\ndevtmpfs               1.9G     0  1.9G    0% /dev\ntmpfs                  1.9G     0  1.9G    0% /dev/shm\ntmpfs                  1.9G  9.7M  1.9G    1% /run\ntmpfs                  1.9G     0  1.9G    0% /sys/fs/cgroup\n/dev/mapper/rhel-root   50G  4.6G   46G   10% /\n/dev/mapper/rhel-home   46G  354M   45G    1% /home\n/dev/nvme0n1p1        1014M  229M  786M   23% /boot\ntmpfs                  376M  1.2M  375M    1% /run/user/42\ntmpfs                  376M  4.0K  376M    1% /run/user/0", 
        "stdout_lines": [
            "文件系统               容量  已用  可用 已用% 挂载点", 
            "devtmpfs               1.9G     0  1.9G    0% /dev", 
            "tmpfs                  1.9G     0  1.9G    0% /dev/shm", 
            "tmpfs                  1.9G  9.7M  1.9G    1% /run", 
            "tmpfs                  1.9G     0  1.9G    0% /sys/fs/cgroup", 
            "/dev/mapper/rhel-root   50G  4.6G   46G   10% /", 
            "/dev/mapper/rhel-home   46G  354M   45G    1% /home", 
            "/dev/nvme0n1p1        1014M  229M  786M   23% /boot", 
            "tmpfs                  376M  1.2M  375M    1% /run/user/42", 
            "tmpfs                  376M  4.0K  376M    1% /run/user/0"
        ]
    }
}

PLAY RECAP *********************************************************************
192.168.47.159            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@master playbook]# cat xx.yml 
---
- hosts: apache
  gather_facts: no
  tasks:
    - name: register variables
      command: "df -h"
      register: result
   
    - debug: var=result["stdout_lines"]
[root@master playbook]# ansible-playbook xx.yml 

PLAY [apache] ******************************************************************

TASK [register variables] ******************************************************
changed: [192.168.47.159]

TASK [debug] *******************************************************************
ok: [192.168.47.159] => {
    "result[\"stdout_lines\"]": [
        "文件系统               容量  已用  可用 已用% 挂载点", 
        "devtmpfs               1.9G     0  1.9G    0% /dev", 
        "tmpfs                  1.9G     0  1.9G    0% /dev/shm", 
        "tmpfs                  1.9G  9.7M  1.9G    1% /run", 
        "tmpfs                  1.9G     0  1.9G    0% /sys/fs/cgroup", 
        "/dev/mapper/rhel-root   50G  4.6G   46G   10% /", 
        "/dev/mapper/rhel-home   46G  354M   45G    1% /home", 
        "/dev/nvme0n1p1        1014M  229M  786M   23% /boot", 
        "tmpfs                  376M  1.2M  375M    1% /run/user/42", 
        "tmpfs                  376M  4.0K  376M    1% /run/user/0"
    ]
}

PLAY RECAP *********************************************************************
192.168.47.159            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值