三:Ansible变量

三:Ansible变量

一:变量概述

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

1. 定义变量的方式

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

#定义阶段
[[email protected] ~]# 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主机信息文件中进行变量定义(不推荐使用,容易使环境混乱)
#定义阶段
[[email protected] ~]# 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:
#定义变量
[[email protected] ~]#vim vars_file.yml
filename: vars_file

#调用变量
[[email protected] bianliang]# vim file.yml
- hosts: web_group
  vars_files: ./vars_file.yml
  tasks:
    - name: Create {{ filename }} DIR
      file:
        path: /root/{{ filename }}
        state: directory

EX2:
#定义变量
[[email protected] ~]# 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
#创建分别以地址和主机名命令的文件
[[email protected] ~]# 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:
#创建出组变量目录和主机变量目录
[[email protected] bianliang]# mkdir host_vars

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

[[email protected] bianliang]# vim host_vars/web02
web_server: samba

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

EX2:
#定义阶段
[[email protected] ~]# mkdir group_vars

#切记定义变量的文件必须以组名为文件名
[[email protected] ~]# 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示例:

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

#查看执行结果
[[email protected] ~]# 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
[[email protected] ~]# vim register.yml
- hosts: web_group
  tasks:
    - name: Test Register Vars
      shell: "ls -l /"
      register: list_dir     ####

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

#查看执行结果
[[email protected] ~]# 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\nlrwxrwxrwx.   1 root root    7 3月   9 2019 bin -> usr/bin\ndr-xr-xr-x.   5 root root 4096 3月   9 2019 boot\ndrwxr-xr-x.  20 root root 3280 9月   8 12:25 dev\ndrwxr-xr-x.  80 root root 8192 9月  10 20:52 etc\ndrwxr-xr-x.   5 root root   41 9月   8 16:22 home\nlrwxrwxrwx.   1 root root    7 3月   9 2019 lib -> usr/lib\nlrwxrwxrwx.   1 root root    9 3月   9 2019 lib64 -> usr/lib64\ndrwxr-xr-x.   2 root root    6 4月  11 2018 media\ndrwxr-xr-x.   2 root root    6 4月  11 2018 mnt\ndrwxr-xr-x.   2 www  www     6 9月  10 15:31 opt\ndr-xr-xr-x. 128 root root    0 9月   8 12:25 proc\ndr-xr-x---.   9 root root 4096 9月  10 21:16 root\ndrwxr-xr-x.  25 root root  740 9月  10 20:52 run\nlrwxrwxrwx.   1 root root    8 3月   9 2019 sbin -> usr/sbin\ndrwxr-xr-x.   2 root root    6 4月  11 2018 srv\ndr-xr-xr-x.  13 root root    0 9月   8 12:25 sys\ndrwxrwxrwt.  15 root root 4096 9月  16 11:52 tmp\ndrwxr-xr-x.  13 root root  155 3月   9 2019 usr\ndrwxr-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\nlrwxrwxrwx.   1 root root    7 3月   9 2019 bin -> usr/bin\ndr-xr-xr-x.   5 root root 4096 3月   9 2019 boot\ndrwxr-xr-x.  20 root root 3260 9月  10 09:47 dev\ndrwxr-xr-x.  80 root root 8192 9月  10 20:52 etc\ndrwxr-xr-x.   5 root root   41 9月   8 16:22 home\nlrwxrwxrwx.   1 root root    7 3月   9 2019 lib -> usr/lib\nlrwxrwxrwx.   1 root root    9 3月   9 2019 lib64 -> usr/lib64\ndrwxr-xr-x.   2 root root    6 4月  11 2018 media\ndrwxr-xr-x.   2 root root    6 4月  11 2018 mnt\ndrwxr-xr-x.   2 www  www     6 9月  10 15:31 opt\ndr-xr-xr-x. 128 root root    0 8月  15 15:10 proc\ndr-xr-x---.   6 root root  180 9月  10 21:16 root\ndrwxr-xr-x.  25 root root  740 9月  10 20:52 run\nlrwxrwxrwx.   1 root root    8 3月   9 2019 sbin -> usr/sbin\ndrwxr-xr-x.   2 root root    6 4月  11 2018 srv\ndr-xr-xr-x.  13 root root    0 8月  15 15:10 sys\ndrwxrwxrwt.  14 root root 4096 9月  16 11:52 tmp\ndrwxr-xr-x.  13 root root  155 3月   9 2019 usr\ndrwxr-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

#只输出自己想要的内容
[[email protected] ~]# 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 }}"

#查看结果
[[email protected] ~]# 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级,全部显示)       

原文地址:https://www.cnblogs.com/captain-jiang/p/12078552.html

时间: 2024-10-13 09:00:13

三:Ansible变量的相关文章

ansible变量

    ansible变量的使用方法 1.主机变量:直接在/etc/ansible/hosts文件中,主机的后边设置key=value的格式 注:inventory_hostname是ansible自带的变量,代表组中的每个主机 #在配置文件中定义主机变量 [[email protected] playbook]# cat /etc/ansible/hosts [webservers] 192.168.2.101 key=101 192.168.2.111 key=111 #写playbook,

非计算机专业的码农C#学习笔记 三、变量 表达式 字符串

三.变量常量 说在前: 其实,写这个东西的时候,我也是在复习,因为这个都是一年前的笔记了.今天我看了几章,贴上来吧.我也是求高手指点,因为变量类型很多,我真的背不出来,只有用的时候记起来或者查查资料. 为什么会这样呢?短期项目用到access,sqlserver,oracle后我开始张冠李戴了.....所以,我在学习过程,真的是抄下来,放在办公室座位前.... 变量(int Int=0) 1.值类型 (1)整型 类型 说明(二进制) 范围 Sbyte 8位有符号 -128-127 Byte 8位

两个变量里的数字进行交换,不依赖第三个变量

import java.util.Scanner; public class Test1 { //1,两个变量里的数字进行交换,不依赖第三个变量 int a ; int b; public void swap(int a ,int b){ a = a + b; b = a - b; a = a - b; System.out.println("交换后"+"a:"+a+",b:"+b); } public static void main(Stri

Python文件常用的三个变量

1 '''Python文件常用的三个变量 2 __doc__.__name__.__file__ 3 4 __doc__——用来显示文件的注释,文件的注释都是写在文件的开头, 5 以""" doc """标注的内容.可以直接调用.也可以查看其他文件的注释, 6 如导入了一个Queue模块,可以用print Queue.__doc__来查看 7 8 __name__——用来检查是否是主文件的一个重要方法,比如是主动执行的此文件, 9 那么值就是'_

如何不使用第三个变量来交换两个数的值

最近在看<c++从入门到精通>自学c++,里面有一道课后题是如何做到不适用第三个变量来交换两个数的值,以下是我在网上查找到的资料,记录下并作为笔记. 题目:a=10,b=15,将a / b的值互换. 通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换.代码如下:      int a,b;      a=10; b=15;      int t;      t=a; a=b; b=t;      这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用

不借助第三个变量实现两个变量交换及原理分析

通常的交换两个变量a,b的过程为 var temp; temp=a; a=b; b=temp; 需借助上面的第3个临时变量temp. 无需借助第3个临时变量交换两个变量a,b d的方法: 逻辑运算(异或) 下面的异或运算可以实现a,b的交换,而无需借助第3个临时变量: a = a ^ b; b = a ^ b; a = a ^ b; 这个交换两个变量而无需借助第3个临时变量过程,其实现主要是基于异或运算的如下性质: 1.任意一个变量X与其自身进行异或运算,结果为0,即X^X=0 2.任意一个变量

不借助第三个变量实现两个变量交换的思考

1) 算术运算简单来说,就是通过+和-运算来实现.代码如下: int a,b; a=10;b=12; a=b-a;   //a=2;b=12 b=b-a;   //a=2;b=10 a=b+a;   //a=12;b=10 通过以上运算,a和b中的值就进行了交换.表面上看起来很简单,但是不容易想到,尤其是在习惯标准算法之后. 此算法与标准算法相比,多了三个计算的过程,但是没有借助临时变量.(以下称为算术算法) 2) 指针操作对指针的操作实际上进行的是整数运算.比如:两个int指针相减得到一个整数

PHP中不用第三个变量交换两个变量的值

相信大家在PHP面试或者学习中经常会遇到这个问题就是“不用第三个变量来交换两个变量的值”,今天正对这个问题来讨论一下: 第一种方法:首先会想到的 这种方法简单可行,顺利的交换了两个变量的值. 第二种方法呢,稍加思考我们就会用到PHP中的函数来实现 第三种方法呢,我们来采用PHP中提供各种字符串分割函数来实现. 简单的题目不同的思想就会有不同的解法,期待更多的答案.

Java基础知识强化05:不借助第三个变量实现两个变量互换

代码如下: package himi.hebao; /** * 不借助第三个变量实现,两个变量互换 * 这里利用^异或实现两个变量的互换 * @author Administrator * */ public class TestDemo08 { public static void main(String[] args) { int a= 120; int b= 34; a= a^b; //进行变量互换 b= b^a; //进行变量互换 a= a^b; //进行变量互换 System.out.