自动化运维工具Ansible(4)变量

变量概述

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

定义变量的方式
1.通过命令行进行变量定义
2.在play文件中进行变量定义
3.通过Inventory主机信息文件中进行变量定义

变量的优先级
如果在定义变量时,变量冲突了

在上述的三个地方分别设置了:
1.命令行中:age=11
2.play文件中:age=12
3.Inventory中:age=13
那么,最终的age结果一定是11

变量的读取优先级为

命令行 > playbook文件 > Inventory文件

变量定义

playbook中vars定义变量
playbook变量可以通过多种方式进行定义,最简单的方式就是在playbook的开头通过vars进行定义。

方法一:一个变量名称对应多个值

- hosts: web_group
  vars:
    packages:
      - httpd
      - mariadb-server
      - php
      - php-mysql
      - php-pdo
  tasks:       
  - name: Install httpd  mariadb php Server
    yum:
      name: "{{ packages }}"

方法二:一个变量对应一个值

- hosts: web_group
  vars:
      - web_server: httpd
      - db_server: mariadb-server
      - php_server: php,php-mysql,php-pdo
   tasks:
  - name: Install httpd  mariadb php Server
    yum:
      name:
        - "{{ web_server }}"
        - "{{ db_server }}"
        - "{{ php_server }}"

方法三:使用变量创建文件或者目录

[root@m01 ~]# cat vars.yml 
- hosts: web01
  vars:
    - ngx_ver: 1.1
    - ngx_dir: web
  tasks:
    - name: touch
      file:
        path: /tmp/{{ ngx_dir }}_{{ ngx_ver }}
        state: touch

使用vars_file定义变量
刚才我们学到在playbook中使用vars定义变量,有一个缺陷,就是其他的playbook无法使用该变量。所以我们可以采取第二种定义变量的方式,在vars_file中定义变量。

#定义阶段
[root@m01 ~]# cat vars1.yml
web_server: httpd
[root@m01 ~]# cat vars2.yml
db_server: mariadb-server

#调用阶段
- hosts: web_group
  vars_files: ./vars1.yml
  tasks:
  - name: Install httpd  mariadb php Server
    yum:
      name: "{{ web_server }}"
#定义阶段
[root@m01 ~]# cat vars1.yml
web_server: httpd
[root@m01 ~]# cat vars2.yml
db_server: mariadb-server

#调用阶段
- hosts: web_group
  vars_file: 
    - ./vars1.yml
    - ./vars2.yml
  - name: Install httpd  mariadb php Server
    yum:
      name:
        - "{{ web_server }}"
        - "{{ db_server }}"

#获取Ansible内置变量
- hosts: web_group
  vars:
    - remote_ip: "{{ ansible_default_ipv4['address'] }}"
    - remote_hostname: "{{ ansible_fqdn }}"
  tasks:
    - name: Touch IP File
      file:
        path: /root/{{ remote_ip }}
        state: touch

    - name: Touch Hostname File
      file:
        path: /root/{{ remote_hostname }}
        state: touch

在Inventory中定义变量
注意:在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 

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

1.主机组定义变量

#定义阶段
[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.主机定义变量

#定义阶段
[root@m01 ~]# mkdir host_vars

#切记定义变量的文件必须以主机名为文件名
[root@m01 ~]# vim /root/host_vars/web01
web_server: nginx

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

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

[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"
[root@m01 ~]# vim test.yml
- hosts: web_group
  tasks:
  - name: Install httpd Server
    yum:
      name:
        - "{{ web_server }}"
        - "{{ db_server }}"

#定义阶段
[root@m01 ~]# ansible-playbook test.yml -e "web_server=vsftpd" -e "db_server=mariadb-server"

变量优先级测试

[root@m01 ~]# vim touch_file.yml
- hosts: web_group
  vars:
    filename: vars
  vars_files:
    - ./vars1.yml
  tasks:
    - name: Touch vars File
      file:
        path: /root/{{ filename }}
        state: directory

#定义vars_files
[root@m01 ~]# vim vars1.yml
filename: vars_files

#定义group_vars中的web_group
[root@m01 ~]# vim group_vars/web_group
filename: group_vars_web_group

#定义host_vars中的web01
[root@m01 ~]# vim host_vars/web01
[root@m01 ~]# vim host_vars/web01
filename: host_vars

#定义group_vars中的all
[root@m01 ~]# vim group_vars/all
filename: group_vars_all

#测试命令行
[root@m01 ~]# ansible-playbook touch_file.yml -e "filename=vars_command"

#测试所有
[root@m01 ~]# ansible-playbook touch_file.yml

变量定义方式总结:

1.通过paly中定义 一个变量名称对应多个值

- hosts: lnmp
  vars: 
    packages:
	  - wget
	  - lrzsz
	  - tree
 
#调用变量:
   tasks:
      - name: install packages
	    yum:
		  name: "{{ packages }}"

2.通过play中定义 一个变量对应一个值

- hosts: lnmp
  vars:
    - nginx_user: www
	- nginx_port: 81
	- nginx_dir: /code
	
调用变量:
  tasks:
    - name: 
	  copy:
	    content: '{{ nginx_user}} xxxx'

3.在文件中定义变量

vim vars1.yml
nginx_user: www
nginx_port: 80

#调用在play中引用文件
- hosts: lnmp
  vars_files: 
    - vars1.yml
	- vars2.yml

4.在执行playbook的目录下创建目录 目录下文件的名称一定和主机清单中一致
group_vars 定义组的变量
host_vars 定义单机的变量

5.使用ansible的内置变量 setup模块
ansible lnmp -m setup

6.Ansible变量注册

[root@m01 ansible]# cat register.yml
- hosts: web01
  tasks:
    - name: shell scripts
      shell: 'ls -l'
      register: ls_result

    - name: print ls -l
      debug:
        msg: "{{ ls_result.stdout_lines }}"

7.判断Nginx文件是否正常

[root@m01 ansible]# cat register.yml 
- hosts: web01
  tasks:
    - name: shell scripts
      shell: 'nginx -t'
      register: ls_result

    - name: print ls -l
      debug:
        msg: "{{ ls_result }}"

变量注意事项:

  1. 单独引用变量需要使用"{{ ENV }}"
  2. 变量带路径则不需要加双引号
    /root/{{ code_dir }}_{{ code_version }}
  3. 如果变量是文件中的内容需要用单引号 copy的content可以直接解析变量
    ‘{{ nfs_dir }} 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)’

变量注册

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

那么咋样将返回值注册到变量,如下一个playbook示例:使用debug模块

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

编辑剧本

[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\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

只输出自己想要的内容

[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

层级定义变量
编辑变量文件

[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

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 }}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值