• Ansible的debug模块和魔法变量介绍,fact变量采集和缓存相关操作演示


    目录

    一.debug模块的使用方法

    1.帮助文档给出的示例

    2.主要用到的参数

    (1)msg:主要用这个参数来指定要输出的信息

    (2)var:打印指定的变量,一般是通过register注册了的变量

    (3)verbosity:调试级别,默认是0表示全部显示

    3.输出信息详解

    4.在debug中使用when做条件判断

    (1)通过rc的结果做判断

    (2)通过是否failed做判断

    二.fact变量

    1.setup简单用法演示

    (1)命令行通过filter进行过滤

    (2)--tree将信息输出到指定目录

    2.手动设置fact

    3.使用set_fact模块定义变量

    4.手动采集变量

    三.fact缓存

    1.json方式

    2.redis方式

    3.memcached方式基本已弃用

    四.魔法变量

    1.hostvars

    2.inventory_hostname

    3.group_names

    4.groups

    5.play_hosts

    6.inventory_dir

    7.inventory_file


     

    一.debug模块的使用方法

    ansible上playbook的debug是一个常用的调试模块,主要用于在playbook执行(调试、引用变量)过程输出一些关键信息,并且可以对这些关键信息进行一定的格式化输出和条件判断

    1.帮助文档给出的示例

    1. EXAMPLES:
    2. # Example that prints the loopback address and gateway for each host
    3. - debug:
    4.   msg: System {{ inventory_hostname }} has uuid {{ ansible_product_uuid }}
    5. - debug:
    6.   msg: System {{ inventory_hostname }} has gateway {{ ansible_default_ipv4.gateway }}
    7. when: ansible_default_ipv4.gateway is defined
    8. # Example that prints return information from the previous task
    9. - shell: /usr/bin/uptime
    10. register: result
    11. - debug:
    12.   var: result
    13.   verbosity: 2
    14. - name: Display all variables/facts known for a host
    15. debug:
    16.   var: hostvars[inventory_hostname]
    17.   verbosity: 4
    18. # Example that prints two lines of messages, but only if there is an environment value set
    19. - debug:
    20.   msg:
    21.   - "Provisioning based on YOUR_KEY which is: {{ lookup('env', 'YOUR_KEY') }}"
    22.   - "These servers were built using the password of '{{ password_used }}'. Please retain this for later use."

    2.主要用到的参数

    (1)msg:主要用这个参数来指定要输出的信息

    演示效果

    1. [root@main ~]# cat iduser.yaml
    2. ---
    3. - name: is su exist
    4. hosts: webservers
    5. tasks:
    6.   - name: test su
    7.     shell: id su
    8.     register: su
    9.     ignore_errors: yes
    10.   - name: echo it
    11.     debug:
    12.       msg: "用户存在"
    13.  
    14. [root@main ~]# ansible-playbook iduser.yaml
    15. PLAY [is su exist] ******************************************************************************************************************************
    16. TASK [Gathering Facts] **************************************************************************************************************************
    17. ok: [servera]
    18. TASK [test su] **********************************************************************************************************************************
    19. changed: [servera]
    20. TASK [echo it] **********************************************************************************************************************************
    21. ok: [servera] => {
    22.   "msg": "用户存在"
    23. }
    24. PLAY RECAP **************************************************************************************************************************************
    25. servera                   : ok=3   changed=1   unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  

    (2)var:打印指定的变量,一般是通过register注册了的变量

    演示效果

    1. [root@main ~]# cat iduser.yaml
    2. ---
    3. - name: is su exist
    4. hosts: servera
    5. tasks:
    6.   - name: test su
    7.     shell: id su
    8.     register: su
    9.     ignore_errors: yes
    10.   - name: echo it
    11.     debug:
    12.       var: su     #打印前面已经注册了的“su”变量
    13. [root@main ~]# ansible-playbook iduser.yaml
    14. PLAY [is su exist] ******************************************************************************************************************************
    15. TASK [Gathering Facts] **************************************************************************************************************************
    16. ok: [servera]
    17. TASK [test su] **********************************************************************************************************************************
    18. changed: [servera]
    19. TASK [echo it] **********************************************************************************************************************************
    20. ok: [servera] => {
    21.   "su": {
    22.       "changed": true,
    23.       "cmd": "id su",
    24.       "delta": "0:00:00.002850",
    25.       "end": "2023-10-19 14:12:43.406662",
    26.       "failed": false,
    27.       "rc": 0,
    28.       "start": "2023-10-19 14:12:43.403812",
    29.       "stderr": "",
    30.       "stderr_lines": [],
    31.       "stdout": "uid=1000(su) gid=1000(su) groups=1000(su)",
    32.       "stdout_lines": [
    33.           "uid=1000(su) gid=1000(su) groups=1000(su)"
    34.       ]
    35.   }
    36. }
    37. PLAY RECAP **************************************************************************************************************************************
    38. servera                   : ok=3   changed=1   unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  

    (3)verbosity:调试级别,默认是0表示全部显示

    3.输出信息详解

    以下面代码段为例:

    "su":表示变量,在输出信息中它是一个字典类型

    changed:根据此值来判断是否发生了状态改变

    cmd:过程中调用的命令

    failed:是否运行失败

    rc:返回值,为0成功,非0失败或异常

    stderr:出现异常时会在这显示错误信息

    stderr_lines:以行分割的格式输出错误信息

    stdout:运行成功会在此处输出返回结果

    stdout_lines:以行分割的格式输出结果

    1. ok: [servera] => {
    2.   "su": {
    3.       "changed": true,
    4.       "cmd": "id su",
    5.       "delta": "0:00:00.002850",
    6.       "end": "2023-10-19 14:12:43.406662",
    7.       "failed": false,
    8.       "rc": 0,
    9.       "start": "2023-10-19 14:12:43.403812",
    10.       "stderr": "",
    11.       "stderr_lines": [],
    12.       "stdout": "uid=1000(su) gid=1000(su) groups=1000(su)",
    13.       "stdout_lines": [
    14.           "uid=1000(su) gid=1000(su) groups=1000(su)"
    15.       ]
    16.   }
    17. }

    4.在debug中使用when做条件判断

    (1)通过rc的结果做判断

    1. [root@main ~]# cat iduser.yaml
    2. ---
    3. - name: is su exist
    4. hosts: servera
    5. tasks:
    6.   - name: test su
    7.     shell: id su
    8.     register: su
    9.     ignore_errors: yes
    10.   - name: echo it
    11.     debug:
    12.       msg: "用户存在"
    13.     when: su.rc==0       #当返回值为0时才输出msg

    (2)通过是否failed做判断

    1. [root@main ~]# cat iduser.yaml
    2. ---
    3. - name: is su exist
    4. hosts: servera
    5. tasks:
    6.   - name: test su
    7.     shell: id su
    8.     register: su
    9.     ignore_errors: yes
    10.   - name: echo it
    11.     debug:
    12.       msg: "用户存在"
    13.     #when: su.rc==0
    14.     when: su is not failed     #当su变量的结果不失败时才输出
    15. [root@main ~]# ansible-playbook iduser.yaml
    16. PLAY [is su exist] ******************************************************************************************************************************
    17. TASK [Gathering Facts] **************************************************************************************************************************
    18. ok: [servera]
    19. TASK [test su] **********************************************************************************************************************************
    20. changed: [servera]
    21. TASK [echo it] **********************************************************************************************************************************
    22. ok: [servera] => {
    23.   "msg": "用户存在"
    24. }
    25. PLAY RECAP **************************************************************************************************************************************
    26. servera                   : ok=3   changed=1   unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  

    二.fact变量

    setup用于获取受管节点的详细信息(硬盘、IP、cpu等信息),可以将信息作为变量在playbook中引用,setup依赖fact进行获取信息

    1. EXAMPLES:
    2. # Display facts from all hosts and store them indexed by I(hostname) at C(/tmp/facts).
    3. # ansible all -m setup --tree /tmp/facts
    4. # Display only facts regarding memory found by ansible on all hosts and output them.
    5. # ansible all -m setup -a 'filter=ansible_*_mb'
    6. # Display only facts returned by facter.
    7. # ansible all -m setup -a 'filter=facter_*'
    8. # Collect only facts returned by facter.
    9. # ansible all -m setup -a 'gather_subset=!all,!any,facter'
    10. - name: Collect only facts returned by facter
    11. setup:
    12.   gather_subset:
    13.     - '!all'
    14.     - '!any'
    15.     - facter

    1.setup简单用法演示

    (1)命令行通过filter进行过滤

    1. [root@main ~]# ansible servera -m setup -a 'filter=ansible_*_ipv4'
    2. servera | SUCCESS => {
    3.   "ansible_facts": {
    4.       "ansible_default_ipv4": {
    5.           "address": "192.168.2.131",
    6.           "alias": "ens33",
    7.           "broadcast": "192.168.2.255",
    8.           "gateway": "192.168.2.1",
    9.           "interface": "ens33",
    10.           "macaddress": "00:0c:29:bc:03:89",
    11.           "mtu": 1500,
    12.           "netmask": "255.255.255.0",
    13.           "network": "192.168.2.0",
    14.           "type": "ether"
    15.       },
    16.       "discovered_interpreter_python": "/usr/bin/python"
    17.   },
    18.   "changed": false
    19. }

    (2)--tree将信息输出到指定目录

    1. [root@main ~]# ansible servera -m setup -a 'filter=ansible_*_mb' --tree /root/facts
    2. [root@main ~]# cat facts/servera
    3. {"ansible_facts": {"ansible_memfree_mb": 5327, "ansible_memory_mb": {"nocache": {"free": 5510, "used": 338}, "real": {"free": 5327, "total": 5848, "used": 521}, "swap": {"cached": 0, "free": 2047, "total": 2047, "used": 0}}, "ansible_memtotal_mb": 5848, "ansible_swapfree_mb": 2047, "ansible_swaptotal_mb": 2047, "discovered_interpreter_python": "/usr/bin/python"}, "changed": false}

    2.手动设置fact

    可以为某写主机手动定制fact,称其为本地fact,将管理节点定义好的fact文件传输给需要定制fact的节点,定制的fact默认存放在受管节点的/etc/ansible/facts.d目录下,

    示例:为server节点自定义一个fact,使用这个fact启动servera上的httpd服务,此示例主要用到三个文件(cus.fact、afact.yaml、useafact.yaml),都放在同一目录下

    1. [root@main ~]# cat cus.fact     #在管理节点定义好fact文件
    2. [su]
    3. mypkg=httpd
    4. myser=httpd
    5. state=started
    6. [root@main ~]# cat afact.yaml  
    7. #定义yaml文件,在受管节点创建/etc/ansible/facts.d目录,将fact文件拷贝至这个目录
    8. ---
    9. - hosts: servera
    10. vars:
    11.   remote_dir: /etc/ansible/facts.d
    12.   facts_file: cus.fact
    13. tasks:
    14.   - name: create remote_dir in servera
    15.     file:
    16.       state: directory
    17.       recurse: yes
    18.       path: "{{ remote_dir }}"
    19.   - name: copy local cus.fact
    20.     copy:
    21.       src: "{{ facts_file }}"
    22.       dest: "{{ remote_dir }}"
    23. [root@main ~]# ansible servera -m setup -a 'filter="ansible_local"'
    24. #成功在servera上过滤出本地fact
    25. servera | SUCCESS => {
    26.   "ansible_facts": {
    27.       "ansible_local": {
    28.           "cus": {
    29.               "su": {
    30.                   "mypkg": "httpd",
    31.                   "myser": "httpd",
    32.                   "state": "started"
    33.               }
    34.           }
    35.       },
    36.       "discovered_interpreter_python": "/usr/bin/python"
    37.   },
    38.   "changed": false
    39. }
    40. [root@main ~]# cat useafact.yaml   #为servera定义yaml文件引用其下的fact进行启动httpd
    41. ---
    42. - hosts: servera
    43. tasks:
    44.   - name: using servera local fact to start httpd
    45.     service:
    46.       name: "{{ ansible_facts.ansible_local.cus.su.myser }}"
    47.       #引用方式较长(ansible的facts.本地的.fact文件.fact内的字段名)
    48.       state: "{{ ansible_facts.ansible_local.cus.su.state }}"
    49. [root@main ~]# ansible-playbook useafact.yaml
    50. PLAY [servera] **********************************************************************************************************************************
    51. TASK [Gathering Facts] **************************************************************************************************************************
    52. ok: [servera]
    53. TASK [using servera local fact to start httpd] **************************************************************************************************
    54. changed: [servera]
    55. PLAY RECAP **************************************************************************************************************************************
    56. servera                   : ok=2   changed=1   unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  
    57. [root@main ~]# ansible servera -m shell -a 'systemctl status httpd | grep Active'
    58. #启动成功
    59. servera | CHANGED | rc=0 >>
    60.   Active: active (running) since Thu 2023-10-19 15:15:09 CST; 5s ago

    3.使用set_fact模块定义变量

    set_fact用于自定义facts,从而通过template或作为变量在playbook中被引用,set_fact定义的变量只能在此playbook中使用有效

    1. EXAMPLES:
    2. # Example setting host facts using key=value pairs, note that this always creates strings or booleans
    3. - set_fact: one_fact="something" other_fact="{{ local_var }}"
    4. # Example setting host facts using complex arguments
    5. - set_fact:
    6.     one_fact: something
    7.     other_fact: "{{ local_var * 2 }}"
    8.     another_fact: "{{ some_registered_var.results | map(attribute='ansible_facts.some_fact') | list }}"
    9. # Example setting facts so that they will be persisted in the fact cache
    10. - set_fact:
    11.   one_fact: something
    12.   other_fact: "{{ local_var * 2 }}"
    13.   cacheable: yes
    14. # As of Ansible 1.8, Ansible will convert boolean strings ('true', 'false', 'yes', 'no')
    15. # to proper boolean values when using the key=value syntax, however it is still
    16. # recommended that booleans be set using the complex argument style:
    17. - set_fact:
    18.   one_fact: yes
    19.   other_fact: no

    示例:通过set_fact计算进程使用内存的情况,这个计算结果也可以在playbook中引用

    1. [root@main ~]# ansible servera -m setup -a 'filter="ansible_memtotal_mb"'
    2. servera | SUCCESS => {
    3.   "ansible_facts": {
    4.       "ansible_memtotal_mb": 5848,     #先过滤一下看参数是否存在
    5.       "discovered_interpreter_python": "/usr/bin/python"
    6.   },
    7.   "changed": false
    8. }
    9. [root@main ~]# cat initfree.yaml
    10. ---
    11. - hosts: servera
    12. tasks:
    13.   - name: cal pool size
    14.     set_fact:     #定义一个变量为这个计算结果
    15.       pool_size: "{{ ansible_memtotal_mb / 2 | int}}"
    16.   - debug:
    17.       var: pool_size #输出这个变量
    18. [root@main ~]# ansible-playbook initfree.yaml
    19. PLAY [servera] **********************************************************************************************************************************
    20. TASK [Gathering Facts] **************************************************************************************************************************
    21. ok: [servera]
    22. TASK [cal pool size] ****************************************************************************************************************************
    23. ok: [servera]
    24. TASK [debug] ************************************************************************************************************************************
    25. ok: [servera] => {
    26.   "pool_size": "2924.0"
    27. }
    28. PLAY RECAP **************************************************************************************************************************************
    29. servera                   : ok=3   changed=0   unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  

    4.手动采集变量

    运行playbook时,ansible会先ssh到受管节点去采集fact,如果收集信息过多过大会影响执行速度和效率,可以选择关闭采集或先关闭采集完成任务再重新采集

    1. #显式采集行为
    2. TASK [Gathering Facts] **************************************************************************************************************************
    3. ok: [servera]

    示例:上述情况下,我们可以使用gather_facts显式关闭fact采集,然后执行完任务再重新采集facts

    1. [root@main ~]# cat nogather.yaml
    2. ---
    3. - hosts: servera
    4. gather_facts: false
    5. tasks:
    6.   - name: debug this
    7.     debug: msg="hello"
    8.   - name: wait for 10
    9.     wait_for:
    10.       timeout: 6
    11.   - name: regather facts
    12.     setup:
    13.       gather_subset: all #参考EXAMPLES
    14. [root@main ~]# ansible-playbook nogather.yaml
    15. PLAY [servera] **********************************************************************************************************************************
    16. TASK [debug this] *******************************************************************************************************************************
    17. ok: [servera] => {
    18.   "msg": "hello"
    19. }
    20. TASK [wait for 10] ******************************************************************************************************************************
    21. ok: [servera]
    22. TASK [regather facts] ***************************************************************************************************************************
    23. ok: [servera]
    24. PLAY RECAP **************************************************************************************************************************************
    25. servera                   : ok=3   changed=0   unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  

    三.fact缓存

    在playbook中引入fact时可以设置fact缓存,目前以是json、redis、memcached三种方式,以下是需要修改的ansible.cfg的defaults部分参数

    • gathering

    是否开启fact支持三个选项:smart(默认采集facts,facts已存在时不采集,即缓存),implicit(默认采集facts,可以使用"gather_facts: false"来禁止采集),explicit(默认不采集,可以使用"gather_facts: true"来假期采集)

    • fact_caching_timeout

    缓存时间,秒为单位

    • fact_caching

    缓存方式,jsonfile,redis,memcached

    • fact_caching_connection

    指定fact缓存的json文件位置,若没有会自动创建

    1.json方式

    此方式下,ansible会将fact写入控制主机的文件中

    1. #在ansible.cfg配置文件的defaults模块加这些参数
    2. gathering=smart
    3. fact_caching_timeout=86400
    4. fact_caching=jsonfile
    5. fact_caching_connection=/root/ansible_fact_cache

    示例:

    执行一个会采集fact的playbook,查看是否将fact缓存到指定的位置

    1. [root@main ~]# cat ansible.cfg
    2. [defaults]
    3. ......
    4. gathering=smart
    5. fact_caching_timeout=86400
    6. fact_caching=jsonfile
    7. fact_caching_connection=/root/ansible_fact_cache
    8. ......
    9. [root@main ~]# ansible-playbook myhttpd.yaml
    10. PLAY [stop servera httpd] ***********************************************************************************************************************
    11. TASK [Gathering Facts] **************************************************************************************************************************
    12. ok: [servera]
    13. TASK [stop it] **********************************************************************************************************************************
    14. ok: [servera]
    15. PLAY [install serverb mod_ssl] ******************************************************************************************************************
    16. TASK [Gathering Facts] **************************************************************************************************************************
    17. ok: [serverb]
    18. TASK [install it] *******************************************************************************************************************************
    19. ok: [serverb]
    20. PLAY RECAP **************************************************************************************************************************************
    21. servera                   : ok=2   changed=0   unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  
    22. serverb                   : ok=2   changed=0   unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  
    23. [root@main ~]# ll /root/ansible_fact_cache/     #查看
    24. total 56
    25. -rw-r--r-- 1 root root 25052 Oct 19 18:00 servera
    26. -rw-r--r-- 1 root root 25071 Oct 19 18:00 serverb

    2.redis方式

    需要安装redis服务且保持运行,还需要安装python支持redis的相关包,更改ansible.cfg

    1. fact_caching=redis   #指定redis方式
    2. fact_caching_connection=127.0.0.1:6379:0     #指定redis服务设备的IP和端口,使用0号数据库
    3. [root@main ~]# yum install -y redis #安装redis
    4. [root@main ~]# systemctl start redis
    5. [root@main ~]# ps -ef | grep redis
    6. redis     4278     1 0 17:50 ?       00:00:00 /usr/bin/redis-server 127.0.0.1:6379
    7. root       4286   1485 0 17:51 pts/0   00:00:00 grep --color=auto redis
    8. [root@main ~]# systemctl enable redis
    9. Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service.
    10. [root@main ~]# python --version
    11. Python 2.7.5
    12. [root@main ~]# yum list | grep python2-redis
    13. python2-redis.noarch                     2.10.6-2.el7                 epel  
    14. [root@main ~]# yum install -y python2-redis.noarch   #安装对应python版本对应的redis支持包
    15. [root@main ~]# ansible-playbook myhttpd.yaml   #再执行一次
    16. [root@main ~]# redis-cli   #进入查看
    17. 127.0.0.1:6379> keys *
    18. 1) "ansible_factsservera"
    19. 2) "ansible_factsserverb"
    20. 3) "ansible_cache_keys"
    21. 127.0.0.1:6379> type "ansible_cache_keys"
    22. zset
    23. 127.0.0.1:6379> type "ansible_factsservera"   #前两个就是采集的facts
    24. string
    25. 127.0.0.1:6379>

    3.memcached方式基本已弃用

    四.魔法变量

    1.hostvars

    (1)作用

    用于获取某台受管节点的相关变量,通过hostvars来指定受管节点和需要获取的信息,并将这整个语句作为一个变量

    (2)基本格式

    1. "{{ hostvars['受管节点'].ansible_该节点网卡名称.ipv4.address }}"
    2. 示例:获取servera的IPV4地址,需要用到servera的网卡连接名称
    3. [root@main ~]# cat getserveraip.yaml
    4. ---
    5. - hosts: servera
    6. tasks:
    7.   - name: get serveraip
    8.     debug:
    9.       var: "{{ hostvars['servera'].ansible_ens33.ipv4.address }}"
    10. [root@main ~]# ansible-playbook getserveraip.yaml
    11. PLAY [servera] **********************************************************************************************************************************
    12. TASK [get serveraip] ****************************************************************************************************************************
    13. ok: [servera] => {
    14.   "192.168.2.131": "VARIABLE IS NOT DEFINED!"
    15. }
    16. PLAY RECAP **************************************************************************************************************************************
    17. servera                   : ok=1   changed=0   unreachable=0   failed=0   skipped=0   rescued=0   ignored=0  

    2.inventory_hostname

    (1)作用

    用来识别正在运行的管理节点的主机名,若在inventory中定义过别名那么会识别别名,若是IP就会识别IP,其中若是别名较长,使用inventory_hostname_short可以只获取最前一个域

    (2)示例

    1. [root@main ~]# cat myhosts
    2. 192.168.2.131
    3. serverb
    4. serverc.ex.com ansible_host=192.168.2.133
    5. [root@main ~]# ansible all -m debug -a 'msg="{{inventory_hostname}}"'
    6. 192.168.2.131 | SUCCESS => {
    7.   "msg": "192.168.2.131"
    8. }
    9. serverb | SUCCESS => {
    10.   "msg": "serverb"
    11. }
    12. serverc.ex.com | SUCCESS => {
    13.   "msg": "serverc.ex.com"
    14. }
    15. [root@main ~]# ansible all -m debug -a 'msg="{{inventory_hostname_short}}"' #短获取
    16. 192.168.2.131 | SUCCESS => {
    17.   "msg": "192"
    18. }
    19. serverb | SUCCESS => {
    20.   "msg": "serverb"
    21. }
    22. serverc.ex.com | SUCCESS => {
    23.   "msg": "serverc"
    24. }
    25. [root@main ~]# cat getserveraip.yaml #识别成功
    26. ---
    27. - hosts: all
    28. tasks:
    29.   - name: get server
    30.     debug:
    31.       var: "{{ hostvars[inventory_hostname].ansible_ens33.ipv4.address }}"
    32. TASK [get server] *******************************************************************************************************************************
    33. ok: [192.168.2.131] => {
    34.   "192.168.2.131": "VARIABLE IS NOT DEFINED!"
    35. }
    36. ok: [serverb] => {
    37.   "192.168.2.132": "VARIABLE IS NOT DEFINED!"
    38. }
    39. ok: [serverc.ex.com] => {
    40.   "192.168.2.133": "VARIABLE IS NOT DEFINED!"
    41. }

    3.group_names

    识别正在运行的管理节点的主机组

    1. [root@main ~]# cat myhosts
    2. [webservers]
    3. servera
    4. serverb
    5. [dbserver]
    6. serverc
    7. [webgroup:children]
    8. webservers
    9. [root@main ~]# ansible all -m debug -a 'msg="{{group_names}}"'
    10. serverc | SUCCESS => {
    11.   "msg": [
    12.       "dbserver"
    13.   ]
    14. }
    15. servera | SUCCESS => {
    16.   "msg": [
    17.       "webgroup",
    18.       "webservers"
    19.   ]
    20. }
    21. serverb | SUCCESS => {
    22.   "msg": [
    23.       "webgroup",
    24.       "webservers"
    25.   ]
    26. }

    4.groups

    识别inventory文件中所有主机组,并且可以枚举出其中的所有主机。

    1. [root@main ~]# cat myhosts
    2. [webservers]
    3. servera
    4. serverb
    5. [dbserver]
    6. serverc
    7. [webgroup:children]
    8. webservers
    9. [root@main ~]# ansible all -m debug -a 'msg="{{groups}}"'
    10. serverc | SUCCESS => {
    11.   "msg": {
    12.       "all": [
    13.           "serverc",
    14.           "servera",
    15.           "serverb"
    16.       ],
    17.       "dbserver": [
    18.           "serverc"
    19.       ],
    20.       "ungrouped": [],
    21.       "webgroup": [
    22.           "servera",
    23.           "serverb"
    24.       ],
    25.       "webservers": [
    26.           "servera",
    27.           "serverb"
    28.       ]
    29.   }
    30. }
    31. servera | SUCCESS => {
    32.   "msg": {
    33.       "all": [
    34.           "serverc",
    35.           "servera",
    36.           "serverb"
    37.       ],
    38.       "dbserver": [
    39.           "serverc"
    40.       ],
    41.       "ungrouped": [],
    42.       "webgroup": [
    43.           "servera",
    44.           "serverb"
    45.       ],
    46.       "webservers": [
    47.           "servera",
    48.           "serverb"
    49.       ]
    50.   }
    51. }
    52. serverb | SUCCESS => {
    53.   "msg": {
    54.       "all": [
    55.           "serverc",
    56.           "servera",
    57.           "serverb"
    58.       ],
    59.       "dbserver": [
    60.           "serverc"
    61.       ],
    62.       "ungrouped": [],
    63.       "webgroup": [
    64.           "servera",
    65.           "serverb"
    66.       ],
    67.       "webservers": [
    68.           "servera",
    69.           "serverb"
    70.       ]
    71.   }
    72. }

    5.play_hosts

    当前的playbook将在哪些节点上运行

    6.inventory_dir

    主机清单所在的目录

    1. [root@main ~]# ansible all -m debug -a 'msg="{{inventory_dir}}"'
    2. serverc | SUCCESS => {
    3.   "msg": "/root"
    4. }
    5. servera | SUCCESS => {
    6.   "msg": "/root"
    7. }
    8. serverb | SUCCESS => {
    9.   "msg": "/root"
    10. }

    7.inventory_file

    哪个是主机清单文件

    1. [root@main ~]# ansible all -m debug -a 'msg="{{inventory_file}}"'
    2. serverc | SUCCESS => {
    3.   "msg": "/root/myhosts"
    4. }
    5. servera | SUCCESS => {
    6.   "msg": "/root/myhosts"
    7. }
    8. serverb | SUCCESS => {
    9.   "msg": "/root/myhosts"
    10. }

     

  • 相关阅读:
    烟花爆竹厂如何做到0风险0爆炸事故?AI+视频监控平台给出答案
    如何衡量个人成长?超越数字:探寻个人成长的三个维度
    WPF入门教程系列二十五——DataGrid使用示例(2)
    【Arduino24】8*8点阵实验
    国产etl 与 ODI
    一键合并多个TXT文本,将保存在TXT的快递单号进行一键合并
    Windows系统配置高精度时间服务
    使用C语言实现查找
    算力免费,还奖钱,OpenI日常激励活动“我为开源打榜狂”来袭
    【方向盘】认为:开发者已无理由再用Java EE
  • 原文地址:https://blog.csdn.net/weixin_64334766/article/details/133932511