zoukankan      html  css  js  c++  java
  • 自动化运维工具-Ansible之4-变量

    自动化运维工具-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文件


    变量的定义和调用

    1. 在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 }}"
    
    # 调用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
    
    # 使用with_items迭代循环,仅在当前name中生效
    - name: add several users
      user:
        name: "{{ item.name }}"
        state: present
        groups: "{{ item.groups }}"
      with_items:
        - { name: 'testuser1', groups: 'wheel' }
        - { name: 'testuser2', groups: 'root' }
    

    1. 在其他文件中定义变量,在playbook中使用vars_file调用定义文件,使用"{{ }}"调用变量

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

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

    1. 在Inventory中定义变量,在playbook中使用"{{ }}"调用变量

    注意:在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
    
    # 调用阶段
    [root@m01 ~]# cat > /etc/ansible/httpd/vars.yml << EOF
    - hosts: web_group
      tasks:
      - name: Install httpd Server
        yum:
          name: "{{ web_server }}"
      - name: Touch File
        file:
          path: /tmp/{{ index_file }}
          state: touch
    EOF
    

    1. 官方推荐变量定义方法

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

    在Ansible项目目录下创建两个变量目录``host_varsgroup_vars`

    • host_vars目录下创建以主机名为文件名的配置文件
    #定义阶段
    [root@m01 ~]# mkdir /etc/ansible/httpd/host_vars
    
    # 切记定义变量的文件必须以主机名为文件名
    [root@m01 ~]# cat > /etc/ansible/httpd/host_vars/web01 << EOF
    web_server: nginx
    EOF
    
    #调用阶段
    [root@m01 ~]# cat > /etc/ansible/httpd/vars.yml << EOF
    - hosts: web_group
      tasks:
      - name: Touch Hostname File
        file:
          path: /root/{{ web_server }}
          state: touch
    EOF
    
    • group_vars目录下创建以主机组名为文件名的配置文件
    # 定义阶段
    [root@m01 ~]# mkdir /etc/ansible/httpd/group_vars
    
    # 切记定义变量的文件必须以组名为文件名
    [root@m01 ~]# cat > /etc/ansible/httpd/group_vars/web_group << EOF
    web_server: httpd
    EOF
    
    # 调用阶段
    [root@m01 ~]# cat > /etc/ansible/httpd/vars.yml << EOF
    - hosts: web_group
      tasks:
      - name: Touch Hostname File
        file:
          path: /root/{{ web_server }}
          state: touch
    EOF
    

    1. 命令行定义变量

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

    [root@m01 ~]# cat > /etc/ansible/httpd/vars.yml <<EOF
    - hosts: web_group
      tasks:
      - name: Install httpd Server
        yum:
          name: "{{ web_server }}"
    EOF
    # 定义阶段
    [root@m01 ~]# ansible-playbook /etc/ansible/httpd/vars.yml -e "web_server=vsftpd"
    
    [root@m01 ~]# cat > /etc/ansible/httpd/vars.yml <<EOF
    - hosts: web_group
      tasks:
      - name: Install httpd Server
        yum:
          name:
            - "{{ web_server }}"
            - "{{ db_server }}"
    EOF
    # 定义阶段
    [root@m01 ~]# ansible-playbook /etc/ansible/httpd/vars.yml -e "web_server=vsftpd" -e "db_server=mariadb-server"
    

    1. 层级定义变量
    # 编辑变量文件
    [root@m01 ~]# cat > /etc/ansible/httpd/vars_file.yml <<EOF
    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
    EOF
    
    # 编辑playbook文件
    [root@m01 ~]# cat > /etc/ansible/httpd/vars.yml <<EOF
    - 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 }}"
    EOF
    
    # 官方推荐写法
    [root@m01 ~]# cat > /etc/ansible/httpd/vars.yml <<EOF
    - 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'] }}"
    EOF
    
    # 执行playbook
    [root@m01 ~]# ansible-playbook /etc/ansible/httpd/vars.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
    

    变量优先级测试

    主机清单:

    [root@m01 ~]# cat > /etc/ansible/hosts <<EOF
    [web_group]
    web01 ansible_ssh_host=10.0.0.7
    [web_group:vars]
    filenamen=inventory
    EOF
    

    定义阶段:

    # 定义playbook
    [root@m01 ~]# cat > /etc/ansible/httpd/vars.yml <<EOF
    - hosts: web_group
      vars:
        filename: vars
      vars_files:
        - ./vars1.yml
      tasks:
        - name: Touch vars File
          file:
            path: /tmp/{{ filename }}
            state: touch
    EOF
    
    # 定义vars_files
    [root@m01 ~]# cat > /etc/ansible/httpd/vars1.yml <<EOF
    filename: vars_files
    EOF
    
    #定义group_vars中的web_group
    [root@m01 ~]# cat > /etc/ansible/httpd/group_vars/web_group <<EOF
    filename: group_vars_web_group
    EOF
    
    #定义host_vars中的web01
    [root@m01 ~]# cat > /etc/ansible/httpd/host_vars/web01 <<EOF
    filename: host_vars_web01
    EOF
    
    #定义group_vars中的all
    [root@m01 ~]# cat > /etc/ansible/httpd/group_vars/all <<EOF
    filename: group_vars_all
    EOF
    

    测试阶段:

    # 1.命令行测试
    [root@m01 ~]# ansible-playbook /etc/ansible/httpd/vars.yml -e "filename=vars_command"
    
    # 查看到命令行定义的文件名
    [root@web01 ~]# ll /opt/
    total 0
    -rw-r--r-- 1 root root 0 Sep 28 20:03 vars_command
    
    # 2.正常执行playbook测试
    [root@m01 ~]# ansible-playbook /etc/ansible/httpd/vars.yml
    
    # 再次出现的是vars_files定义的内容
    [root@web01 ~]# ll /opt/
    total 0
    -rw-r--r-- 1 root root 0 Sep 28 20:03 vars_command
    -rw-r--r-- 1 root root 0 Sep 28 20:04 vars_files
    
    # 3.取消调用vars_files
    [root@m01 ~]# cat > /etc/ansible/httpd/vars.yml <<EOF
    - hosts: web_group
      vars:
        filename: vars
      tasks:
        - name: Touch vars File
          file:
            path: /tmp/{{ filename }}
            state: touch
    EOF
    
    # 正常执行playbook测试
    [root@m01 ~]# ansible-playbook /etc/ansible/httpd/vars.yml
    
    # 再次出现的是playbook定义的vars
    [root@web01 ~]# ll /opt/
    total 0
    -rw-r--r-- 1 root root 0 Sep 28 20:07 vars
    -rw-r--r-- 1 root root 0 Sep 28 20:03 vars_command
    -rw-r--r-- 1 root root 0 Sep 28 20:04 vars_files
    
    # 4.取消playbook定义的vars
    [root@m01 ~]# cat > /etc/ansible/httpd/vars.yml <<EOF
    - hosts: web_group
      tasks:
        - name: Touch vars File
          file:
            path: /tmp/{{ filename }}
            state: touch
    EOF
    
    # 正常执行playbook测试
    [root@m01 ~]# ansible-playbook /etc/ansible/httpd/vars.yml
    
    # 再次出现的是host_vars目录下定义的内容
    [root@web01 ~]# ll /tmp/
    total 0
    -rw-r--r-- 1 root root 0 Sep 28 20:08 host_vars_web01
    -rw-r--r-- 1 root root 0 Sep 28 20:07 vars
    -rw-r--r-- 1 root root 0 Sep 28 20:03 vars_command
    -rw-r--r-- 1 root root 0 Sep 28 20:04 vars_files
    
    # 5.清空host_vars目录
    [root@m01 ~]# rm -rf /etc/ansible/httpd/host_vars/*
    
    # 正常执行playbook测试
    [root@m01 ~]# ansible-playbook /etc/ansible/httpd/vars.yml
    
    # 再次出现的是group_vars目录中的web_group下定义的内容
    [root@web01 ~]# ll /tmp/
    total 0
    -rw-r--r-- 1 root root 0 Sep 28 20:10 group_vars_web_group
    -rw-r--r-- 1 root root 0 Sep 28 20:08 host_vars_web01
    -rw-r--r-- 1 root root 0 Sep 28 20:07 vars
    -rw-r--r-- 1 root root 0 Sep 28 20:03 vars_command
    -rw-r--r-- 1 root root 0 Sep 28 20:04 vars_files
    
    # 6.移除group_vars目录中的web_group
    [root@m01 ~]# rm -rf /etc/ansible/httpd/group_vars/web_group
    
    # 正常执行playbook测试
    [root@m01 ~]# ansible-playbook /etc/ansible/httpd/vars.yml
    
    # 最后出现的是group_vars目录中的all下定义的内容
    [root@web01 ~]# ll /tmp/
    total 0
    -rw-r--r-- 1 root root 0 Sep 28 20:12 group_vars_all
    -rw-r--r-- 1 root root 0 Sep 28 20:10 group_vars_web_group
    -rw-r--r-- 1 root root 0 Sep 28 20:08 host_vars_web01
    -rw-r--r-- 1 root root 0 Sep 28 20:07 vars
    -rw-r--r-- 1 root root 0 Sep 28 20:03 vars_command
    -rw-r--r-- 1 root root 0 Sep 28 20:04 vars_files
    

    **结论: **

    命令行 > vars_files > playbook vars > host_vars > group_vars/web_group>group_vars/all


    变量优先级测试二

    1. 配置主机清单
    [root@m01 ~]# cat > /etc/ansible/hosts <<EOF
    [web_group]
    web01 ansible_ssh_host=10.0.0.7
    web02 ansible_ssh_host=10.0.0.8
    
    [lb_group]
    lb01 ansible_ssh_host=10.0.0.5
    
    [lnmp_group:children]
    web_group
    lb_group
    EOF
    
    1. 配置变量
    [root@m01 ~]# cat > /etc/ansible/httpd/host_vars/web01 <<EOF
    web: web01_host_vars
    EOF
    [root@m01 ~]# cat > /etc/ansible/httpd/group_vars/web_group <<EOF
    web: web_group
    EOF
    [root@m01 ~]# cat > /etc/ansible/httpd/group_vars/lnmp_group <<EOF
    web: lnmp_group
    EOF
    
    1. 配置剧本调用变量
    [root@m01 ~]# cat > /etc/ansible/httpd/host_vars/vars.yml <<EOF
    - hosts: nginx_group
      tasks:
      - name: Mkdir dir
        file:
          path: /tmp/{{web}}
          state: directory
    EOF
    
    1. 执行并查看结果
    [root@m01 ~]# ansible-playbook /etc/ansible/httpd/vars.yml
    [root@web01 ~]# ll /tmp
    total 0
    drwxr-xr-x 2 root root 6 Sep 28 19:00 web01_host_vars
    [root@web02 ~]# ll /tmp
    total 0
    drwxr-xr-x 2 root root 6 Sep 28 19:00 web_group
    [root@lb01 ~]# ll /tmp/
    drwxr-xr-x 2 root root 6 Sep 28 19:00 lnmp_group
    
    1. 结论:

    定义的变量优先级:host_vars>group_vars/web_group>group_vars/lnmp_group:children

    变量注册

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

    示例:

    # 编辑剧本
    [root@m01 ~]# cat > /etc/ansible/httpd/register.yml <<EOF
    - hosts: web_group
      tasks:
        - name: Test Register Vars
          shell: "ls -l /"
    EOF
    
    # 执行查看结果
    [root@m01 ~]# ansible-playbook /etc/ansible/httpd/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。

    我们无法看到执行之后的结果,所以此时我们需要使用到变量注册

    - hosts: 主机
      tasks:
        - name: Vars
          shell: 动作
          register: 变量名
    
        - name: DeBug OUT
          debug:
            msg: 调用变量
    

    修改剧本:

    # 编辑剧本 变量注册 "{{ list_dir }}"
    [root@m01 ~]# cat > /etc/ansible/httpd/register.yml <<EOF
    - hosts: web_group
      tasks:
        - name: Test Register Vars
          shell: "ls -l /"
          register: list_dir
    
        - name: Return Result
          debug:
            msg: "{{ list_dir }}"
    EOF
    
    # 执行查看结果
    [root@m01 ~]# ansible-playbook /etc/ansible/httpd/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
    
    # 只输出自己想要的内容 "{{ list_dir.stdout_lines }}"
    [root@m01 ~]# cat > /etc/ansible/httpd/register.yml <<EOF
    - hosts: web_group
      tasks:
        - name: Test Register Vars
          shell: "ls -l /"
          register: list_dir
    
        - name: Return Result
          debug:
            msg: "{{ list_dir.stdout_lines }}"
    EOF
    
    # 执行查看结果
    [root@m01 ~]# ansible-playbook /etc/ansible/httpd/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级,全部显示)


    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
    
    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"
    "
    }
    ok: [web02] => {
        "msg": "Hostname "web02" and IP "10.0.0.8"
    "
    }
    
    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
    

    template在拷贝时能够传递Ansible定义的变量到文件中,copy不能


    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 }}
    
  • 相关阅读:
    样式超出设定宽度显示显示省略号
    客户端存在潜在危险request.from
    MenuStrip如何设置快捷键
    SVN的使用方法
    长串英文字符不换行的解决办法
    thickbox使用
    System.Web.UI.UserControl”,因此此处不允许
    C#中实现拖动无边框Form窗体和窗体的起始位置
    (转)Altera Forum精彩问答汇总
    (转)如何以32 bit的方式存取SDRAM?
  • 原文地址:https://www.cnblogs.com/backups/p/ansible_4.html
Copyright © 2011-2022 走看看