VPS测评 VPS推荐 VPS优惠
Linux运维

Ansible Playbook变量的定义和使用

Ansible Playbook中也支持变量。

变量名:仅能由字母、数字和下划线组成,且只能以字母开头。


变量定义

variable=value
variable: value

范例

http_port=80
http_port: 80

变量调用方式

{{ variable_name }}

有时候需要加双引号生效

"{{ variable_name }}"

变量来源

1.ansible的setup facts远程主机的所有变量都可直接调用。

2.命令行指定变量(优先级最高)

ansible-playbook -e varname=value test.yml

3.在playbook文件中定义

vars: 
  var1: value1
  var2: value2

4.在独立的变量YAML文件中定义

- host: webservers
  vars_file:
    - vars.yml

5.在主机清单文件中定义

6.在项目中针对主机和主机组定义

在项目目录中创建host_vars和group_vars目录

7.在role中定义

定义变量的优先级从高到低

命令行-e选项定义的 > playbook中vars_file > playbook中vars变量 > 项目目录/host_vars/主机名文件 > 主机清单中的主机变量 > 项目目录/group_vars/主机组名文件 > group_vars/all文件 > 主机清单中的组变量

setup 模块变量

本模块自动在playbook调用,不要用ansible命令调用,生成系统状态信息,,并存放在facts变量中。

facts 包括的信息很多,如: 主机名、IP、CPU、内存、网卡等。

范例

在/tmp下创建名为主机名的log文件

---
- hosts: webservers
  tasks:
    - name: Create Log File
      file: path='/tmp/{{ ansible_nodename }}.log' state=touch owner=root mode=600

显示 eth0 网卡的IP地址

- hosts: webservers
  tasks:
    - name: Show Eth0 Ip Address
      debug:
        msg:
          - IP Address: "{{ ansible_eth0.ipv4.address }}"
          - Eth0 is active: "{{ ansible_eth0.active }}"

命令行变量

-e 选项指定变量

范例

安装指定的包

---
#创建文件var3.yml
- hosts: webservers
  tasks:
    - name: Install {{ pkname }}
      yum: name={{ pkname }} state=present      
ansible-playbook -e pkname=sl,cowsay var3.yml 

也可以把变量放在当前目录的vars文件,再用 -e 选项调用

---
#创建文件var4.yml
- hosts: webservers
  tasks:
    - name: Install {{ pkname }}
      yum: name={{ pkname }} state=present 
ansible-playbook -e '@vars' var4.yml

Playbook文件中变量

范例

创建nginx组和用户

---
- hosts: webservers
  vars:
    groupname: nginx
    username: nginx
  tasks:
    - name: Create group {{ groupname }}
      group: name={{ groupname }} state=present system=yes
    - name: Create user {{ username }}
      user: name={{ username }} state=present system=yes group={{ groupname }} create_home=no shell=/sbin/nologin

变量的相互调用

---
- hosts: webservers
  vars:
    var1: "/tmp/{{ ansible_default_ipv4.address }}"
  tasks:
    - name: Create Directory
      file: name={{ var1 }} state=directory     

安装多个包,多种写法

---
- hosts: webservers
  tasks:
    - name: Install 
      yum: 
        name:
          - nginx
          - redis
        state: present
---
- hosts: webservers
  vars: 
    web: nginx
    db: redis
  tasks:
    - name: Install {{ web }} {{ db }}
      yum: 
        name:
          - "{{ web }}"
          - "{{ db }}"
        state: present
---
- hosts: webservers
  tasks:
    - name: Install {{ pk }}
      vars: 
        pk:
          - nginx
          - redis
      yum: 
        name: "{{ pk }}"
        state: present

Playbook引用变量文件

可以在一个独立的playbook文件中定义变量,在另一个playbook文件中引用变量文件中的变量,比playbook中直接定义的变量优先级高。

范例

变量文件vars.yml和调用它的playbook文件需要在同一个目录

创建变量文件 vars.yml

---
#vars.yml
web: nginx
db: redis

在playbook文件中调用

---
#yum3.yml
- hosts: webservers
  vars_files:
    - vars.yml
  tasks:
    - name: install {{ web }} {{ db }}
      yum:
        name:
          - "{{ web }}"
          - "{{ db }}"
        state: present

主机清单变量

在inventory 主机清单文件中为指定的主机定义变量以便于在playbook中使用

主机清单默认路径:/etc/ansible/hosts

范例

[webservers]
10.0.0.1 hname=www1 domain=frogvps.com
10.0.0.2 hname=www2 

#webservers组的公共变量
[webservers:vars]
http_port=80

#所有组的公共变量
[all:vars]
CONTAINER_RUNTIME="docker"
CLUSTER_NETWORK="calico"
PROXY_MODE="ipvs"
SERVICE_CIDR="192.168.0.0/16"
CLUSTER_CIDR="172.16.0.0/16"
NODE_PORT_RANGE="20000-60000"
CLUSTER_DNS_DOMAIN="frogvps.local."
bin_dir="/usr/bin"
ca_dir="/etc/kubernetes/ssl"
base_dir="/etc/ansible"

项目文件变量

生产建议在项目目录中创建额外的两个变量目录,分别是host_vars和group_vars

host_vars下面的文件名和主机清单主机名一致,针对单个主机进行变量定义,格式: host_vars/hostname

group_vars下面的文件名和主机清单中组名一致,针对单个组进行变量定义,格式: gorup_vars/groupname

group_vars/all文件内定义的变量对所有组都有效

范例

这是实验用的hosts文件,一台腾讯云,一台dmit

[webservers]
175.24.227.179

[dmit]
154.17.22.52

首先,在/data文件夹新建一个项目

mkdir -p /data/ansible

然后,创建变量目录

cd /data/ansible
mkdir host_vars
mkdir group_vars

在目录下设置不同的变量

[root@VM-4-13-ubuntu /data/ansible]#cat host_vars/175.24.227.179 
vps: txyun
[root@VM-4-13-ubuntu /data/ansible]#cat host_vars/154.17.22.52
vps: dmit
[root@VM-4-13-ubuntu /data/ansible]#cat group_vars/webservers 
name: web1
[root@VM-4-13-ubuntu /data/ansible]#cat group_vars/dmit 
name: web2
[root@VM-4-13-ubuntu /data/ansible]#cat group_vars/all 
domain: frogvps.com

目录结构

[root@VM-4-13-ubuntu /data/ansible]#tree /data/ansible/
/data/ansible/
├── group_vars
│   ├── all
│   ├── dmit
│   └── webservers
├── host_vars
│   ├── 154.17.22.52
│   └── 175.24.227.179
└── test.yml

在playbook中调用变量,test.yml、host_vars、group_vars在相同目录下

---
#test.yml
- hosts: all
  tasks:
    - name: Print Variable
      debug:
        msg: "{{ vps }}{{ name }}.{{domain}}"

运行结果

[root@VM-4-13-ubuntu /data/ansible]#ansible-playbook test.yml 

PLAY [all] ************************************************************************************************************

TASK [Gathering Facts] ************************************************************************************************
ok: [175.24.227.179]
ok: [154.17.22.52]

TASK [Print Variable] *************************************************************************************************
ok: [175.24.227.179] => {
    "msg": "txyunweb.frogvps.com"
}
ok: [154.17.22.52] => {
    "msg": "dmitweb2.frogvps.com"
}

PLAY RECAP ************************************************************************************************************
154.17.22.52               : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
175.24.227.179             : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

register 注册变量

在playbook中可以使用register将捕获命令的输出保存在临时变量中,然后使用debug模块进行显示输出。

范例

利用debug 模块输出变量

---
- hosts: all
  tasks:
    - name: Get variable
      shell: hostname
      register: name
    - name: Print variable
      debug:
        msg: 
          - "{{ name }}"

控制命令的输出结果

---
- hosts: all
  tasks:
    - name: Get variable
      shell: hostname
      register: name
    - name: Print variable
      debug:
        msg: 
          - "{{ name.stdout}}"
          - "{{ name.cmd }}"
          - "{{ name.stdout_lines }}"

使用 register 注册变量创建文件

---
- hosts: webservers
  tasks:
    - name: Get variable
      shell: hostname
      register: name
    - name: Create file
      file: path=/tmp/{{ name.stdout }}.log state=touch    

debug自定义输出变量代替msg

---
- hosts: webservers
  tasks:
    - name: Print hello
      shell: echo hello
      register: hi
    - name: Print user
      shell: "awk -F: 'NR==1{print $1}' /etc/passwd"
      register: user
    - debug:
        var=hi.stdout
    - debug:
        var=user.stdout
未经允许不得转载:青蛙主机 » Ansible Playbook变量的定义和使用

VPS相关常用工具

PING测试工具自用毛子接码站