ansible学习之旅(初识变量)

简介: ansible学习之旅(初识变量)

ansible variables

变量介绍

ansible中变量可以提供便捷的方式来管理动态值,如果需要反复用到一些值,且后续可能进行修改,我们就可以定义变量。


变量定义方式介绍

变量定义方式有三种

通过命令行传递变量参数(一般临时测试时候使用)


在playbook中定义变量

通过vars定义变量

通过vars_files定义变量


通过inventory文件对主机组或单个主机定义变量

通过host_vars对主机进行定义

通过group_vars对主机组进行定义(有一个特殊的组all包含全员)


这几种方式定义变量的优先级

命令行传参 > playbook中vars_files方式传参 > playbook中vars方式传参 > inventoy主机变量 > host_vars > group_vars > group_vars(all组情况下) > inventory组变量  


在playbook中定义变量

vars方式定义

在playbook文件中开头通过vars关键字定义  

[root@k81 an]# cat > v1.yaml<<EOF
- hosts: localhost
  vars:
  - web_pkg: nginx
  - ftp_pkg: vsftpd
  tasks:
  - name: Test output vars
    debug:
      msg: ["{{ web_pkg }}", "{{ ftp_pkg }}"]
EOF
## 开始测试
[root@k81 an]# ansible-playbook v1.yaml
TASK [Test output vars] *******************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": [
        "nginx", 
        "vsftpd"
    ]
}
PLAY RECAP *******************************************************************************************************************************************************************************  


vars_files方式定义

定义一个单独的变量文件

[root@k81 an]# cat > vars_file.yaml <<EOF
---
nfs: nfs-server1
smb: smb-server1
EOF
## 写一个playbook调用
[root@k81 an]# cat  > v2.yaml <<EOF
---
- hosts: localhost
  vars_files: 
  - ./vars_file.yaml  # 声明变量文件路径
  tasks: 
  - name: Test output vars
    debug: 
      msg: 
      - "{{ nfs }}"
      - "{{ smb }}"
EOF
## 测试
[root@k81 an]# ansible-playbook v2.yaml 
TASK [Test output vars] *******************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": [
        "nfs-server1", 
        "smb-server1"
    ]
}
PLAY RECAP ********************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
## 可以看到结果如预期所料  


通过inventory文件定义变量

设置主机变量和组变量

[root@k81 an]# cat > hosts <<EOF  # 记得需要配置ansible.cfg指定inventory文件为该hosts文件
[centos]
c1 id=1 role=master  
c2 id=2 role=slave
c3 id=3 role=lb
[centos:vars]
port=6535
EOF
[root@k81 an]# cat > v3.yaml <<EOF
---
- hosts: centos
  tasks:
  - name: Test vars
    debug:
      msg: "{{ id }}-{{ role }}:{{ port }}"
EOF
## 测试
[root@k81 an]# ansible-playbook v3.yaml 
TASK [Test vars] **************************************************************************************************************************************************************************
ok: [c1] => {
    "msg": "1-master:6535"
}
ok: [c2] => {
    "msg": "2-slave:6535"
}
ok: [c3] => {
    "msg": "3-lb:6535"
}
PLAY RECAP ********************************************************************************************************************************************************************************
c1                         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
c2                         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
c3                         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   


使用host_vars方式定义变量

[root@k81 an]# cat >hosts <<EOF
[centos]
c1
c2
EOF
##定义变量
[root@k81 an]# mkdir host_var  # 文件夹名字不能错,必须叫这个
[root@k81 an]# cat > host_var/c1 <<EOF # 这里文件名字需要对应资产中主机名字
state: MASTER
priority: 200
EOF 
[root@k81 an]# cat > host_var/c2 <<EOF # 这里文件名字需要对应资产中主机名字
state: SLAVE 
priority: 100
EOF
[root@k81 an]# cat > v4.yaml <<EOF
---
- hosts: centos
  tasks:
  - name: Test vars
    debug:
      msg: "{{ state }}-{{ priority }}"
EOF
## 测试
[root@k81 an]# ansible-playbook v4.yaml 
TASK [Test vars] **************************************************************************************************************************************************************************
ok: [c1] => {
    "msg": "MASTER-200"
}
ok: [c2] => {
    "msg": "SLAVE-100"
}
PLAY RECAP ***************************************************************************************************************************************************************************  


使用guoup_vars方式定义变量

[root@k81 an]# mkdir group_vars  # 文件夹名字不能错,必须叫这个
[root@k81 an]# cat > guoup_vars/centos <<EOF # 这里对应的是资产中的组名,如果设置为all的话那就是所有组共用
servers: WEB
port: 80
EOF
[root@k81 an]# cat > hosts <<EOF
[centos]
c1
c2
EOF
[root@k81 an]# cat > v5.yaml <<EOF
---
- hosts: centos
  tasks:
  - name: Test vars
    debug:
      msg: "{{ servers }}:{{ port }}"
EOF
## 测试
[root@k81 an]# ansible-playbook v5.yaml 
TASK [Test vars] ****************************************************************************************************************************************************
ok: [c1] => {
    "msg": "WEB:80"
}
ok: [c2] => {
    "msg": "WEB:80"
}
PLAY RECAP **********************************************************************************************************************************************************
c1                         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
c2                         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  


通过命令参数传递变量

命令执行的时候使用 -e 参数传变量

# 使用上面的v5.yaml测试
[root@k81 an]# ansible-playbook v5.yaml -e "servers=DB port=3306"  # 变量名一定要和playbook中的一致
TASK [Test vars] ***************************************************************************************************************************************************
ok: [c1] => {
    "msg": "DB:3306"
}
ok: [c2] => {
    "msg": "DB:3306"
}
PLAY RECAP *********************************************************************************************************************************************************
c1                         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
c2                         : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  


目录
相关文章
|
4月前
|
JSON 数据格式 索引
Ansible fact变量与魔法变量
Ansible fact变量与魔法变量
65 6
|
4月前
|
存储 网络安全 数据安全/隐私保护
Ansible的变量
Ansible的变量
46 6
|
11月前
|
运维 关系型数据库 Shell
小白带你学习linux自动化运维ansible
小白带你学习linux自动化运维ansible
279 0
小白带你学习linux自动化运维ansible
|
Shell 网络安全 开发工具
|
缓存 运维 监控
【运维知识进阶篇】Ansible变量详解(变量定义+变量优先级+变量注册+层级定义变量+facts缓存变量)
【运维知识进阶篇】Ansible变量详解(变量定义+变量优先级+变量注册+层级定义变量+facts缓存变量)
371 0
|
存储 JSON 数据安全/隐私保护
ansible定义变量和管理事实
ansible定义变量和管理事实
153 0
|
存储 缓存 监控
【2023】ansible-variables变量详解
【2023】ansible-variables变量详解
134 0
|
应用服务中间件 网络安全 开发工具
学习ansible常用模块这篇就够了(剧本)(二)
学习ansible常用模块这篇就够了(剧本)
143 0
|
运维 应用服务中间件 Shell
学习ansible常用模块这篇就够了(剧本)(一)
学习ansible常用模块这篇就够了(剧本)
378 0
Ansible 自定义变量与 role 默认变量的合并方法
如果你遇到 failed to combine variables, expected dicts but got a &#39;NoneType&#39; and a &#39;dict&#39; 这样的报错,你可以看看本文。
323 0