Ansible Variables

1、什么是变量

变量提供了便捷的方式来管理 ansible 项目中的动态值。 比如 nginx-1.12 ,可能后期会反复的使用到这个版本的值,那么如果将此值设置为变量,后续使用和修改都将变得非常方便。这样可以简化项目的创建和维护;

2、变量定义的方式

2.1、通过命令行传递变量参数定义

2.2、在play文件中进行定义变量

1、通过vars定义变量
2、通过vars_files定义变量

2.3、通过inventory在主机组或单个主机中设置变量

1、通过host_vars对主机进行定义
2、通过group_vars对主机组进行定义

3、Playbook中定义变量

3.1、vars方式定义变量

3.1.1、定义方法

在 playbook 的文件中开头通过 vars 关键字进行变量定义

3.1.2、示例

cat << 'CAT_END' > vars_test.yml
- hosts: localhost
  vars:
    - web_packages: httpd
    - ftp_packages: vsftpd
  tasks:
    - name: Output Vaiables
      debug:
        msg:
        - "{{ web_packages }}"
        - "{{ ftp_packages }}"
CAT_END

3.2、vars_files方式定义变量

3.2.1、方法

在 playbook 中使用 vars_files 指定文件作为变量文件,好处就是其他的playbook 也可以调用;

3.2.2、示例

# 1、准备一个用于存储变量的文件,后缀为 .yml 文件内容: vars_name: value
cat << 'CAT_END' >vars.yaml
web_packages: httpd
ftp_packages: vsftpd
CAT_END

# 2、使用 Playbook 调用变量文件
cat << 'CAT_END' >var_file.yaml
- hosts: localhost
  vars_files: ./vars.yaml
  tasks:
    - name: Output Vaiables
      debug:
        msg:
          - "{{ web_packages }}"
          - "{{ ftp_packages }}"
CAT_END

3.3、在Inventory中定义变量

3.3.1、在inventory主机清单中定义变量

注意:主机变量优先级高于主机组变量。

]# vi /etc/ansible/hosts
[httpd]
192.168.10.17 web=nginx version=1.22 port=8080
192.168.10.18 web=nginx version=1.22 port=8080
[httpd:vars]
port=80
----------------------------------------------
cat << 'CAT_END' > host_var.yaml
- hosts: httpd
  tasks:
    - name: out put variable
      debug:
        msg:
          - "{{ web }} {{ version }} {{ port }}"
CAT_END
----------------------------------------------
# 输出结果
TASK [out put variable] ********************************************************
ok: [192.168.10.17] => {
    "msg": [
        "nginx 1.22 8080"
    ]
}
ok: [192.168.10.18] => {
    "msg": [
        "nginx 1.22 8080"
    ]
}

3.4、使用host_vars定义变量

3.4.1、方法

在项目目录中创建 host_vars 目录,然后在创建一个文件,文件的文件名称要与inventory 清单中的主机名称要保持完全一致,如果是ip地址,则创建相同ip地址的文件即可

3.4.2、示例

# 1、主机清单
]# cat /etc/ansible/hosts
[httpd]
192.168.10.17
192.168.10.18

# 创建存放变量的目录 mkdir host_vars # 2、在 host_vars 目录中创建文件,给 192.168.10.17 主机定义变量 cat << 'CAT_END' > host_vars/192.168.10.17 web: nginx version: 1.2 CAT_END # 3、准备一个 playbook 文件调用 host_vars 目录中定义的主机变量 cat << 'CAT_END' > host_var_ip.yaml - hosts: 192.168.10.17 tasks: - name: output variable debug: msg: - "{{ web }}" - "{{ version }}" - hosts: 192.168.10.18 tasks: - name: output variable debug: msg: - "{{ web }}" - "{{ version }}" CAT_END

3.5、使用group_vars定义变量

3.5.1、方法

在项目目录中创建 group_vars 目录,然后在创建一个文件,文件的文件名称要与 inventory 清单中的组名称保持完全一致

3.5.2、组的局部变量【示例】

# 1、主机清单
]# cat /etc/ansible/hosts
[httpd]
192.168.10.17
192.168.10.18


mkdir group_vars

# 2、在 group_vars 目录中创建 httpd 文件,为 httpd 主机组设定变量
cat << 'CAT_END' > group_vars/httpd
web: nginx_group
version: 1.2_group
CAT_END


# 3、准备一个 playbook 文件调用 group_vars 目录中定义的主机变量
cat << 'CAT_END' > group_var.yaml
- hosts: httpd
  tasks:
    - name: output variable
      debug:
        msg:
          - "{{ web }}"
          - "{{ version }}"
CAT_END

3.5.3、组的全局变量【示例】

cat << 'CAT_END' > group_vars/all
web: nginx_group
version: 1.2_group
CAT_END

3.6、通过执行Playbook命令传递变量

3.6.1、方法

在执行Playbook时,可以通过命令行 --extra-vars 或 -e 外置传参设定变量;

3.6.2、示例

# 创建调试playbook
cat << 'CAT_END' > cmd_var.yaml
- hosts: httpd
  tasks:
    - name: output variable
      debug:
        msg:
          - "{{ arg1 }}"
          - "{{ arg2 }}"
CAT_END


]# ansible-playbook cmd_var.yaml -e "arg1=test" -e "arg2=cyc"

3.7、变量优先级总结

3.7.1、变量方式的总结

1)在plabook中定义vars变量
2)在playbook中定义vars_files变量
3)在host_vars中定义变量
4)在group_vars中定义变量
5)通过执行命令传递变量

3.7.2、变量优先级

命令行变量--> play中的vars_files --> play中的vars --> inventory-hosts --> host_vars --> group_vars/group_name --> group_vars/all --> inventorygroup

4、变量注册Register

4.1、什么是Register

register 关键字可以将某个 task 任务结果存储至变量中,最后使用 debug 输出变量内容,可以用于后续排障;

4.2、示例1-【获取netstats的结果】

4.2.1、编写playbook

cat << 'CAT_END' > register_1.yaml
- hosts: localhost
  tasks:
    - name:
      shell: netstat -tunlp
      register: result
    - name: run netstat result
      debug: msg={{result.stdout_lines}}
CAT_END

4.2.2、查看运行结果

]# ansible-playbook register_1.yaml 

PLAY [localhost] *********************************************************************************************************************************************

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

TASK [shell] *************************************************************************************************************************************************
changed: [localhost]

TASK [run netstat result] ************************************************************************************************************************************
ok: [localhost] => {
    "msg": [
        "Active Internet connections (only servers)", 
        "Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    ", 
        "tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      658/rpcbind         ", 
        "tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      946/sshd            ", 
        "tcp        0      0 0.0.0.0:52936           0.0.0.0:*               LISTEN      1408/rpc.statd      ", 
        "tcp6       0      0 :::56303                :::*                    LISTEN      1408/rpc.statd      ", 
        "tcp6       0      0 :::111                  :::*                    LISTEN      658/rpcbind         ", 
        "tcp6       0      0 :::22                   :::*                    LISTEN      946/sshd            ", 
        "udp        0      0 127.0.0.1:736           0.0.0.0:*                           1408/rpc.statd      ", 
        "udp        0      0 0.0.0.0:830             0.0.0.0:*                           658/rpcbind         ", 
        "udp        0      0 0.0.0.0:52176           0.0.0.0:*                           1408/rpc.statd      ", 
        "udp        0      0 0.0.0.0:111             0.0.0.0:*                           658/rpcbind         ", 
        "udp        0      0 127.0.0.1:323           0.0.0.0:*                           687/chronyd         ", 
        "udp6       0      0 :::830                  :::*                                658/rpcbind         ", 
        "udp6       0      0 :::111                  :::*                                658/rpcbind         ", 
        "udp6       0      0 ::1:323                 :::*                                687/chronyd         ", 
        "udp6       0      0 :::48726                :::*                                1408/rpc.statd      "
    ]
}

PLAY RECAP ***************************************************************************************************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

4.3、示例2-【结果分割处理显示】

cat <<'CAT_END' > register_2.yaml
- hosts: httpd
  tasks:
    - name: run shell command
      shell:
        cmd: "SECRET_KEY=`cat /dev/urandom | tr -dc A-Za-z0-9 |head -c 50`;echo SECRET_KEY=${SECRET_KEY}"
      register: SECRET_KEY
    - name: output variable
      debug:
        msg={{SECRET_KEY.stdout.split('=')[1]}}
CAT_END

 

posted @ 2023-05-12 20:30  小粉优化大师  阅读(28)  评论(0编辑  收藏  举报