三:Ansible变量

Posted captain-jiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三:Ansible变量相关的知识,希望对你有一定的参考价值。

三:Ansible变量

一:变量概述

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

1. 定义变量的方式

1.1 通过命令行进行变量定义
[root@m01 ~]# vim test.yml
- hosts: web_group
  tasks:
  - name: Install httpd Server
    yum:
      name: "{{ web_server }}"

#定义阶段
[root@m01 ~]# ansible-playbook test.yml -e "web_server=vsftpd"
1.2 在play文件中进行变量定义
- name: ensure a list of packages installed
  yum:
    name: "{{ packages }}"
  vars:
    packages:
    - httpd
    - httpd-tools

#方法一
- hosts: web_group
  vars:
    packages:
      - samba
      - vsftpd
  tasks:
  - name: Install httpd  mariadb php Server
    yum:
      name: "{{ packages }}"

#方法二
- hosts: web_group
  vars:
      - web_server: lsof
      - db_server: htop
      - php_server: iftop,sysstat        #这边注意多个软件包的写法
  tasks:
  - name: Install httpd  mariadb php Server
    yum:
      name:
        - "{{ web_server }}"
        - "{{ db_server }}"
        - "{{ php_server }}"
1.3 通过Inventory主机信息文件中进行变量定义(不推荐使用,容易使环境混乱)
#定义阶段
[root@m01 ~]# vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8
[web_group:vars]
web_server=httpd
index_file=index.html

#调用阶段
- hosts: web_group
  tasks:
  - name: Install httpd Server
    yum:
      name: "{{ web_server }}"
  - name: Create Index File
    file:
      path: /tmp/{{ index_file }}
      state: touch 
1.4 在一个模板文件中定义变量
EX1:
#定义变量
[root@m01 ~]#vim vars_file.yml 
filename: vars_file

#调用变量
[root@m01 bianliang]# vim file.yml 
- hosts: web_group
  vars_files: ./vars_file.yml
  tasks:
    - name: Create {{ filename }} DIR
      file:
        path: /root/{{ filename }}
        state: directory
        
EX2:
#定义变量
[root@m01 ~]# vim vars_file.yml
mysql_ip: localhost
mysql_user: root
mysql_password: '123'

#调用变量
- hosts: db01
  vars_files: ./vars_file1.yml
  tasks:
    - name: Create a new database with name 'jiangwei'
      mysql_db:
            login_user: {{ mysql_user }}
            login_password: {{ mysql_password }}
            login_host: {{ mysql_ip }}
            name: jiangwei
            state: present  
此变量目的:以后创建用户只需要在vars_file1.yml文件中修改即可,无须修改配置文件


#获取Ansible内置变量(利用setup模块)
- hosts: web_group
  tasks:
    - name: Touch IP File
      file:
        path: /root/{{ ansible_default_ipv4['address'] }}
        state: touch

    - name: Touch Hostname File
      file:
        path: /root/{{ ansible_fqdn }}
        state: touch
#创建分别以地址和主机名命令的文件       
[root@web01 ~]# ll
total 48
-rw-r--r--  1 root root     0 Nov 19 21:03 10.0.0.7
-rw-r--r--  1 root root     0 Nov 19 21:03 web01
1.5 官方推荐变量定义

之前的几种变量定义都不是很好用,比较好用的是在Ansible项目目录下创建两个变量目录:
host_vars
group_vars
切记,目录名字一定要一致,不能做任何修改。

注意:playbook创建在哪里,这两个文件就创建在哪里。
EX1:
#创建出组变量目录和主机变量目录
[root@m01 bianliang]# mkdir host_vars

#想给哪个主机定义变量,就在host_vars目录下创建该主机的名字文件
例如:web01
[root@m01 bianliang]# vim host_vars/web01   #注意web01必须和主机名对应,
web_server: nginx

[root@m01 bianliang]# vim host_vars/web02
web_server: samba

- hosts: web_group
  tasks:
    - name: Install
      yum:
        name: "{{ web_server }}"
此变量目的:当需求为web01只安装nginx,web02只安装samba时。



EX2:
#定义阶段
[root@m01 ~]# mkdir group_vars

#切记定义变量的文件必须以组名为文件名
[root@m01 ~]# vim /root/group_vars/web_group
web_server: httpd

#调用阶段
- hosts: web_group
  tasks:
  - name: Install httpd Server
    yum:
      name: "{{ web_server }}" 

2. 变量的优先级

1.命令行

2.vars_files

3.vars

4.host_vars

5.group_vars

#官方推荐
host_vars
group_vars

二:变量注册

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

如下一个playbook示例:

#编辑剧本
[root@m01 ~]# vim register.yml
- hosts: web_group
  tasks:
    - name: Test Register Vars
      shell: "ls -l /"

#查看执行结果
[root@m01 ~]# ansible-playbook register.yml

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

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

TASK [Test Register Vars] ********************************************************************************************************************************************************************************************************************
changed: [web01]
changed: [web02]

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

如上执行结果可见,当我们使用shell模块执行ls -l /时,ansible给我们返回的只有changed我们无法看到执行之后的结果,所以此时我们需要使用到变量注册

playbook如下:

#编辑playbook
[root@m01 ~]# vim register.yml
- hosts: web_group
  tasks:
    - name: Test Register Vars
      shell: "ls -l /"
      register: list_dir     ####

    - name: Return Result
      debug:
        msg: "{{ list_dir }}"

#查看执行结果
[root@m01 ~]# ansible-playbook register.yml

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

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

TASK [Test Register Vars] ********************************************************************************************************************************************************************************************************************
changed: [web01]
changed: [web02]

TASK [Return Result] *************************************************************************************************************************************************************************************************************************
ok: [web01] => {
    "msg": {
        "changed": true,
        "cmd": "ls -l /",
        "delta": "0:00:00.005536",
        "end": "2019-09-16 11:52:16.492946",
        "failed": false,
        "rc": 0,
        "start": "2019-09-16 11:52:16.487410",
        "stderr": "",
        "stderr_lines": [],
        "stdout": "总用量 28
lrwxrwxrwx.   1 root root    7 3月   9 2019 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 3月   9 2019 boot
drwxr-xr-x.  20 root root 3280 9月   8 12:25 dev
drwxr-xr-x.  80 root root 8192 9月  10 20:52 etc
drwxr-xr-x.   5 root root   41 9月   8 16:22 home
lrwxrwxrwx.   1 root root    7 3月   9 2019 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 3月   9 2019 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6 4月  11 2018 media
drwxr-xr-x.   2 root root    6 4月  11 2018 mnt
drwxr-xr-x.   2 www  www     6 9月  10 15:31 opt
dr-xr-xr-x. 128 root root    0 9月   8 12:25 proc
dr-xr-x---.   9 root root 4096 9月  10 21:16 root
drwxr-xr-x.  25 root root  740 9月  10 20:52 run
lrwxrwxrwx.   1 root root    8 3月   9 2019 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 4月  11 2018 srv
dr-xr-xr-x.  13 root root    0 9月   8 12:25 sys
drwxrwxrwt.  15 root root 4096 9月  16 11:52 tmp
drwxr-xr-x.  13 root root  155 3月   9 2019 usr
drwxr-xr-x.  21 root root 4096 9月  10 20:52 var",
        "stdout_lines": [
            "总用量 28",
            "lrwxrwxrwx.   1 root root    7 3月   9 2019 bin -> usr/bin",
            "dr-xr-xr-x.   5 root root 4096 3月   9 2019 boot",
            "drwxr-xr-x.  20 root root 3280 9月   8 12:25 dev",
            "drwxr-xr-x.  80 root root 8192 9月  10 20:52 etc",
            "drwxr-xr-x.   5 root root   41 9月   8 16:22 home",
            "lrwxrwxrwx.   1 root root    7 3月   9 2019 lib -> usr/lib",
            "lrwxrwxrwx.   1 root root    9 3月   9 2019 lib64 -> usr/lib64",
            "drwxr-xr-x.   2 root root    6 4月  11 2018 media",
            "drwxr-xr-x.   2 root root    6 4月  11 2018 mnt",
            "drwxr-xr-x.   2 www  www     6 9月  10 15:31 opt",
            "dr-xr-xr-x. 128 root root    0 9月   8 12:25 proc",
            "dr-xr-x---.   9 root root 4096 9月  10 21:16 root",
            "drwxr-xr-x.  25 root root  740 9月  10 20:52 run",
            "lrwxrwxrwx.   1 root root    8 3月   9 2019 sbin -> usr/sbin",
            "drwxr-xr-x.   2 root root    6 4月  11 2018 srv",
            "dr-xr-xr-x.  13 root root    0 9月   8 12:25 sys",
            "drwxrwxrwt.  15 root root 4096 9月  16 11:52 tmp",
            "drwxr-xr-x.  13 root root  155 3月   9 2019 usr",
            "drwxr-xr-x.  21 root root 4096 9月  10 20:52 var"
        ]
    }
}
ok: [web02] => {
    "msg": {
        "changed": true,
        "cmd": "ls -l /",
        "delta": "0:00:00.005813",
        "end": "2019-09-16 11:52:16.495422",
        "failed": false,
        "rc": 0,
        "start": "2019-09-16 11:52:16.489609",
        "stderr": "",
        "stderr_lines": [],
        "stdout": "总用量 24
lrwxrwxrwx.   1 root root    7 3月   9 2019 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 3月   9 2019 boot
drwxr-xr-x.  20 root root 3260 9月  10 09:47 dev
drwxr-xr-x.  80 root root 8192 9月  10 20:52 etc
drwxr-xr-x.   5 root root   41 9月   8 16:22 home
lrwxrwxrwx.   1 root root    7 3月   9 2019 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 3月   9 2019 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6 4月  11 2018 media
drwxr-xr-x.   2 root root    6 4月  11 2018 mnt
drwxr-xr-x.   2 www  www     6 9月  10 15:31 opt
dr-xr-xr-x. 128 root root    0 8月  15 15:10 proc
dr-xr-x---.   6 root root  180 9月  10 21:16 root
drwxr-xr-x.  25 root root  740 9月  10 20:52 run
lrwxrwxrwx.   1 root root    8 3月   9 2019 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 4月  11 2018 srv
dr-xr-xr-x.  13 root root    0 8月  15 15:10 sys
drwxrwxrwt.  14 root root 4096 9月  16 11:52 tmp
drwxr-xr-x.  13 root root  155 3月   9 2019 usr
drwxr-xr-x.  21 root root 4096 9月  10 20:52 var",
        "stdout_lines": [
            "总用量 24",
            "lrwxrwxrwx.   1 root root    7 3月   9 2019 bin -> usr/bin",
            "dr-xr-xr-x.   5 root root 4096 3月   9 2019 boot",
            "drwxr-xr-x.  20 root root 3260 9月  10 09:47 dev",
            "drwxr-xr-x.  80 root root 8192 9月  10 20:52 etc",
            "drwxr-xr-x.   5 root root   41 9月   8 16:22 home",
            "lrwxrwxrwx.   1 root root    7 3月   9 2019 lib -> usr/lib",
            "lrwxrwxrwx.   1 root root    9 3月   9 2019 lib64 -> usr/lib64",
            "drwxr-xr-x.   2 root root    6 4月  11 2018 media",
            "drwxr-xr-x.   2 root root    6 4月  11 2018 mnt",
            "drwxr-xr-x.   2 www  www     6 9月  10 15:31 opt",
            "dr-xr-xr-x. 128 root root    0 8月  15 15:10 proc",
            "dr-xr-x---.   6 root root  180 9月  10 21:16 root",
            "drwxr-xr-x.  25 root root  740 9月  10 20:52 run",
            "lrwxrwxrwx.   1 root root    8 3月   9 2019 sbin -> usr/sbin",
            "drwxr-xr-x.   2 root root    6 4月  11 2018 srv",
            "dr-xr-xr-x.  13 root root    0 8月  15 15:10 sys",
            "drwxrwxrwt.  14 root root 4096 9月  16 11:52 tmp",
            "drwxr-xr-x.  13 root root  155 3月   9 2019 usr",
            "drwxr-xr-x.  21 root root 4096 9月  10 20:52 var"
        ]
    }
}

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

#只输出自己想要的内容
[root@m01 ~]# vim register.yml
- hosts: web_group
  tasks:
    - name: Test Register Vars
      shell: "ls -l /"
      register: list_dir

    - name: Return Result
      debug:
        msg: "{{ list_dir.stdout_lines }}"

#查看结果
[root@m01 ~]# ansible-playbook register.yml

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

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

TASK [Test Register Vars] ********************************************************************************************************************************************************************************************************************
changed: [web01]
changed: [web02]

TASK [Return Result] *************************************************************************************************************************************************************************************************************************
ok: [web01] => {
    "msg": [
        "总用量 28",
        "lrwxrwxrwx.   1 root root    7 3月   9 2019 bin -> usr/bin",
        "dr-xr-xr-x.   5 root root 4096 3月   9 2019 boot",
        "drwxr-xr-x.  20 root root 3280 9月   8 12:25 dev",
        "drwxr-xr-x.  80 root root 8192 9月  10 20:52 etc",
        "drwxr-xr-x.   5 root root   41 9月   8 16:22 home",
        "lrwxrwxrwx.   1 root root    7 3月   9 2019 lib -> usr/lib",
        "lrwxrwxrwx.   1 root root    9 3月   9 2019 lib64 -> usr/lib64",
        "drwxr-xr-x.   2 root root    6 4月  11 2018 media",
        "drwxr-xr-x.   2 root root    6 4月  11 2018 mnt",
        "drwxr-xr-x.   2 www  www     6 9月  10 15:31 opt",
        "dr-xr-xr-x. 128 root root    0 9月   8 12:25 proc",
        "dr-xr-x---.   9 root root 4096 9月  10 21:16 root",
        "drwxr-xr-x.  25 root root  740 9月  10 20:52 run",
        "lrwxrwxrwx.   1 root root    8 3月   9 2019 sbin -> usr/sbin",
        "drwxr-xr-x.   2 root root    6 4月  11 2018 srv",
        "dr-xr-xr-x.  13 root root    0 9月   8 12:25 sys",
        "drwxrwxrwt.  15 root root 4096 9月  16 11:54 tmp",
        "drwxr-xr-x.  13 root root  155 3月   9 2019 usr",
        "drwxr-xr-x.  21 root root 4096 9月  10 20:52 var"
    ]
}
ok: [web02] => {
    "msg": [
        "总用量 24",
        "lrwxrwxrwx.   1 root root    7 3月   9 2019 bin -> usr/bin",
        "dr-xr-xr-x.   5 root root 4096 3月   9 2019 boot",
        "drwxr-xr-x.  20 root root 3260 9月  10 09:47 dev",
        "drwxr-xr-x.  80 root root 8192 9月  10 20:52 etc",
        "drwxr-xr-x.   5 root root   41 9月   8 16:22 home",
        "lrwxrwxrwx.   1 root root    7 3月   9 2019 lib -> usr/lib",
        "lrwxrwxrwx.   1 root root    9 3月   9 2019 lib64 -> usr/lib64",
        "drwxr-xr-x.   2 root root    6 4月  11 2018 media",
        "drwxr-xr-x.   2 root root    6 4月  11 2018 mnt",
        "drwxr-xr-x.   2 www  www     6 9月  10 15:31 opt",
        "dr-xr-xr-x. 128 root root    0 8月  15 15:10 proc",
        "dr-xr-x---.   6 root root  180 9月  10 21:16 root",
        "drwxr-xr-x.  25 root root  740 9月  10 20:52 run",
        "lrwxrwxrwx.   1 root root    8 3月   9 2019 sbin -> usr/sbin",
        "drwxr-xr-x.   2 root root    6 4月  11 2018 srv",
        "dr-xr-xr-x.  13 root root    0 8月  15 15:10 sys",
        "drwxrwxrwt.  14 root root 4096 9月  16 11:54 tmp",
        "drwxr-xr-x.  13 root root  155 3月   9 2019 usr",
        "drwxr-xr-x.  21 root root 4096 9月  10 20:52 var"
    ]
}

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

#debug模块常用参数
msg:            #调试输出的消息
var:            #将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出
verbosity:      #debug的级别(默认是0级,全部显示)       

以上是关于三:Ansible变量的主要内容,如果未能解决你的问题,请参考以下文章

Ansible 三(公钥认证)

Ansible自动化运维Ansible变量之lookup生成变量方法

五ansible变量

Ansible三 角色

Ansible自动化运维工具Ansible变量之Facts变量

Ansible11:变量详解