Ansible 变量

时间:2019-09-19
本文章向大家介绍Ansible 变量,主要包括Ansible 变量使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Ansible 变量

变量概述

变量提供了便捷的方式来管理Ansible playbook 的每一个项目中的动态值,比如nginx -1.6.3 这个软件包的版本,在其他地方或许会反复使用,那么如果将此值设置为变量,然后在其他的playbook 中调用,会方便很多,方便维护,减少维护的成本。

定义变量的方式

  1. 通过命令行进行变量定义
  2. playbook,在play文件中进行变量定义
  3. 主机清单,通过主机信息文件中进行变量定义

如何定义变量

1.在playbook中定义变量

#方法一:
- hosts: db02
  vars:
    pkg:
      - MySQL-python
      - mariadb-server
  tasks:
    - name: 
      yum:
        name: "{{ pkg }}"
        state: present
  
#方法二:
- hosts: db01
  vars:
     web_pkg: httpd
     db_pkg:
       - unzip
       - vsftpd
     php_pkg:
       - php-fpm
       - php
       - php-mysql

2.使用vars_file定义变量

#定义阶段
[root@m01 project]# vim vars_file.yml
web_pkg: httpd
db_pkg: mariadb-server
php_pkg: php

#调用阶段
[root@m01 project]# vim httpd.yml 
- hosts: web_group
  vars_files: ./vars_file.yml
  tasks:
    - name: Install httpd
      yum:
        name: "{{ db_pkg }}"
        state: present

3.使用Ansible内置变量

vim mkdri.yml
- hosts: web_group
  tasks:
    - name: MKDIR
      file:
        path: /backup/{{ ansible_fqdn }}_{{ ansible_default_ipv4['address'] }}_{{ ansible_date_time['date'] }}
        state: directory
        recurse: yes

4.使用主机清单定义变量 ,

注意: 主机的变量高于主机组的变量,所以该方法不推荐使用,容易将环境弄乱

#定义阶段
[web_group]
zls_web01 ansible_ssh_host=172.16.1.7
zls_web02 ansible_ssh_host=172.16.1.8

[web_group:vars]
web_pkg=nginx

[backup_group]
backup ansible_ssh_host=172.16.1.41

[db_group]
db01 ansible_ssh_host=172.16.1.51
db02 ansible_ssh_host=172.16.1.52

[nfs_group]
nfs ansible_ssh_host=172.16.1.31

[rsync_server:children]
web_group
backup_group

[rsync_server:vars]
web_pkg=httpd

[nfs_server:children]
web_group
nfs_group

#调用阶段
- hosts: zls_web01
  tasks:
    - name: Install web server
      yum:
        name: "{{ web_pkg }}"
        state: present

5.官方推荐变量定义方式

值钱的几种变量定义都不是很好用,比较好用的是在Ansible 项目目录下创建两个变量目录:

host_vars

group_hosts

切记,目录名字一定要一致,不能做任何修改。

1.主机组定义变量

#定义阶段
#创建主机组变量定义目录
mkdir group_vars
[root@m01 ~]# vim group_vars/webs
web_pkg: httpd

#定义阶段
[root@m01 ~]# cat group_vars/webs 
web_pkg: httpd
#定义阶段
[root@m01 ~]# cat host_vars/zls_web01 
web_pkg: nginx

[root@m01 ~]# vim web.yml 
- hosts: webs
  tasks:
    - name: Install web server
      yum:
        name: "{{ web_pkg }}"
        state: present

6.命令行定义变量

通过命令行覆盖变量,Inventory的变量会被playbook文件中覆盖,这两种方式的变量都会被命令行直接指定变量所覆盖,使用 --extra-vars 或者-e 设置变量

#调用阶段
[root@m01 ~]# !vim
vim web.yml 
- hosts: webs
  tasks:
  - name: Install httpd Server
    yum:
      name:
        - "{{ web_pkg }}"

  - name: Install mariadb Server
    yum:
      name:
        - "{{ db_pkg }}"


#定义阶段
[root@m01 ~]# ansible-playbook web.yml -e "web_pkg=vsftpd" -e "db_pkg=unzip"

Ansible变量优先级测试

定义阶段:

#定义playbook
[root@m01 ~]# vim test.yml
- hosts: webs
  vars:
    dir: playbook_vars
  vars_files: ./vars_file.yml
  tasks:
    - name: Create Dir
      file:
        path: /opt/{{ dir }}
        state: directory
#定义vars_files
[root@m01 ~]# vim vars_file.yml
dir: vars_file
#定义host_vars中的web01
[root@m01 ~]# vim host_vars/zls_web01
dir: host_vars
#定义group_vars
[root@m01 ~]# vim group_vars/webs
dir: group_vars

测试阶段:

#1.命令行测试
[root@m01 ~]# ansible-playbook test.yml -e "dir=command_vars"
#查看到命令行定义的文件
[root@web01 ~]# ll /opt/
total 0
drwxr-xr-x 2 root root 6 Sep 19 16:48 command_vars

#2.正常执行playbook
[root@m01 ~]# ansible-playbook test.yml

#再次出现的是vars_files 定义的内容
[root@web01 ~]# ll /opt/
total 0
drwxr-xr-x 2 root root 6 Sep 19 16:48 command_vars
drwxr-xr-x 2 root root 6 Sep 19 16:50 vars_file

#3.取消调用vars_files
[root@m01 ~]# vim test.yml 
- hosts: webs
  vars:
    dir: playbook_vars
  tasks:
    - name: Create Dir
      file:
        path: /opt/{{ dir }}
        state: directory

[root@m01 ~]# ansible-playbook test.yml
#再次出现的是playbook调用的
[root@web01 ~]# ll /opt/
total 0
drwxr-xr-x 2 root root 6 Sep 19 16:48 command_vars
drwxr-xr-x 2 root root 6 Sep 19 16:52 playbook_vars
drwxr-xr-x 2 root root 6 Sep 19 16:50 vars_file

#4.取消playbook调用的
- hosts: webs
  tasks:
    - name: Create Dir
      file:
        path: /opt/{{ dir }}
        state: directory

[root@m01 ~]# ansible-playbook test.yml

结论:

命令行 > vars_file > playbook vars > host_vars > group_vars

变量注册

ansible 的模块在运行之后,其实都会返回一些result 结果,就像是执行脚本,我们有的时候需要脚本给我们一些return 返回值,我们才知道,上一步是否可以执行成功,但是,在默认情况下, ansibleresult并不会显示出来,所以,我们可以把这些返回值存储到变量中,这样就可以调用对应的变量名,从而得到这些result,这种将模块的返回值,写入到变量中的方法被称为变量注册。

debug模块常用参数:
msg : 调试输出的消息
var : 将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出

verbosity: debug的级别(默认是0级,全部显示)


示例:

变量注册"{{ list_dir }}"

#编写剧本
[root@m01 vars]# cat register.yml 
- hosts: gjy_web01
  tasks:
    - name: test vars
      shell: "ls -l /root"
      register: list_dir
 
    - name: return result
      debug:
        msg: "{{ list_dir }}"
            
#查看执行结果            
[root@m01 vars]# ansible-playbook register.yml 

PLAY [gjy_web01] ********************************************************************************************************************************************

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

TASK [test vars] ********************************************************************************************************************************************
changed: [gjy_web01]

TASK [return result] ****************************************************************************************************************************************
ok: [gjy_web01] => {
    "msg": {
        "changed": true, 
        "cmd": "ls -l /root", 
        "delta": "0:00:00.008826", 
        "end": "2019-09-20 03:36:38.313543", 
        "failed": false, 
        "rc": 0, 
        "start": "2019-09-20 03:36:38.304717", 
        "stderr": "", 
        "stderr_lines": [], 
        "stdout": "total 8\n-rw-------. 1 root root 1430 Aug  2 04:57 anaconda-ks.cfg\n-rwxr-xr-x. 1 root root  473 Aug  1 20:44 host_ip.sh\ndrwxr-xr-x  9 1001 1001  186 Sep 19 18:40 nginx-1.16.0", 
        "stdout_lines": [
            "total 8", 
            "-rw-------. 1 root root 1430 Aug  2 04:57 anaconda-ks.cfg", 
            "-rwxr-xr-x. 1 root root  473 Aug  1 20:44 host_ip.sh", 
            "drwxr-xr-x  9 1001 1001  186 Sep 19 18:40 nginx-1.16.0"
        ]
    }
}

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

    
    
###############################################################################################
注意:rc就想当于命令行执行完命令,echo $? 的返回值,返回值为0 的时候证明执行成功
##############################################################################################

优化版,只输出自己想要的内容 "{{ list_dir['stdout_lines'] }}"

#调用stdout_lines ,只显示想要的内容
[root@m01 vars]# cat register.yml 
- hosts: gjy_web01
  tasks:
    - name: test vars
      shell: "ls -l /root"
      register: list_dir
 
    - name: return result
      debug:
        msg: "{{ list_dir['stdout_lines'] }}"
#查看结果
[root@m01 vars]# ansible-playbook register.yml 

PLAY [gjy_web01] ********************************************************************************************************************************************

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

TASK [test vars] ********************************************************************************************************************************************
changed: [gjy_web01]

TASK [return result] ****************************************************************************************************************************************
ok: [gjy_web01] => {
    "msg": [
        "total 8", 
        "-rw-------. 1 root root 1430 Aug  2 04:57 anaconda-ks.cfg", 
        "-rwxr-xr-x. 1 root root  473 Aug  1 20:44 host_ip.sh", 
        "drwxr-xr-x  9 1001 1001  186 Sep 19 18:40 nginx-1.16.0"
    ]
}

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

ansibl e层级定义变量

#编辑变量文件
[root@m01 ~]# vim vars_file.yml
lamp:
  framework:
    web_package: httpd
    db_package: mariadb-server
    php_package: php

lnmp:
  framework:
    web_package: nginx
    db_package: mysql
    php_package: php

lnmt:
  framework:
    web_package: nginx
    db_package: mysql
    java_package: tomcat

#编辑playbook文件
[root@m01 ~]# vim test.yml
- hosts: web_group
  vars_files: ./vars_file.yml
  tasks:
    - name: Install LAMP httpd
      yum:
        name: "{{ lamp.framework.web_package }}"

    - name: Install LAMP mariadb-server
      yum:
        name: "{{ lamp.framework.db_package }}"

    - name: Install LAMP php
      yum:
        name: "{{ lamp.framework.php_package }}"
        
#官方推荐写法
[root@m01 ~]# vim test.yml
- hosts: web_group
  vars_files: ./vars_file.yml
  tasks:
    - name: Install LAMP httpd
      yum:
        name: "{{ lamp['framework']['web_package'] }}"

    - name: Install LAMP mariadb-server
      yum:
        name: "{{ lamp['framework']['db_package'] }}"

    - name: Install LAMP php
      yum:
        name: "{{ lamp['framework']['php_package'] }}"

#执行playbook
[root@m01 ~]# ansible-playbook test.yml

PLAY [web_group] *****************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [web01]
ok: [web02]

TASK [Install LAMP httpd] ********************************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01]

TASK [Install LAMP mariadb-server] ***********************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01]

TASK [Install LAMP php] **********************************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01]

PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
web01                      : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
web02                      : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
- hosts: webs
  tasks:
    - name: mem
      file:
        path: /opt/{{ ansible_facts['fqdn'] }}
        #path: /root/{{ ansible_fqdn }}
        state: directory

facts缓存

Ansible facts是在被管理追击上通过Ansible 自动采集发现的变量, facts 包含每台特定的主机信息。

比如:被控端的主机名,IP 地址,系统版本,CPU数量,内存状态,次盘状态等等。

facts使用场景 :

1.通过 facts 缓存检查CPU,来省城对应的nginx配置文件

2.通过 facts 缓存主机名,生成不同的zabbix 配置文件

3. 通过 facts 缓存检查物理机的内存大小来生成不同的mysql配置文件

综上所述的Ansible facts 类似于saltstack 中的 grains 对于做自动化非常有用的

facts 基本用法

#编辑
[root@m01 ~]# vim facts.yml
- hosts: web_group
  tasks:
    - name: Get Host Info
      debug:
        msg: >
          Hostname "{{ ansible_fqdn }}" and IP "{{ ansible_default_ipv4.address }}"

#执行
[root@m01 ~]# ansible-playbook facts.yml
[root@m01 ~]# ansible-playbook facts.yml

PLAY [web_group] *****************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01]

TASK [Get Host Info] *************************************************************************************************************************************************************************************************************************
ok: [web01] => {
    "msg": "Hostname \"web01\" and IP \"10.0.0.7\"\n"
}
ok: [web02] => {
    "msg": "Hostname \"web02\" and IP \"10.0.0.8\"\n"
}

PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
web01                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
web02                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

关闭facts

[root@m01 ~]# vim facts.yml
- hosts: web_group
  gather_facts: no #关闭信息采集
  tasks:

facts 生成zabbix配置文件

- hosts: web_group
  vars:
    - zabbix_server: 172.16.1.71
  tasks:
    - name: copy zabbix agent conf
      template:
        src: ./zabbix_agentd.conf
        dest: /tmp/zabbix_agentd.conf

facts 生成mysqld 配置文件

- hosts: db_group
  tasks:
    - name: Install mysql server
      yum:
        name: mariadb-server
        state: present

    - name: copy mysql  conf
      template:
        src: ./my.cnf
        dest: /etc/my.cnf


[root@m01 ~]# vim /etc/my.cnf
[mysqld]
basedir=/usr
datadir=/var/lib/mysql/
socket=/var/lib/mysql/mysql.sock
log_error=/var/log/mariadb/mariadb.log
innodb_buffer_pool_size={{ ansible_memtotal_mb * 0.8 }}

原文地址:https://www.cnblogs.com/gongjingyun123--/p/11552302.html