Ansible playbook之变量引用

1.Ansible facts

facts是一个用于采集被管理机器设备信息的一个组件,我们可以使用setup模块查机器的所有facts信息,可以使用filter来查看指定信息。

复制代码
[root@ansible01 ~]# ansible 11.0.1.19 -m setup
11.0.1.19 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "11.0.1.19"
        ], 
        "ansible_all_ipv6_addresses": [
            "fe80::20c:29ff:feaf:86c8"
        ], 
        "ansible_apparmor": {
            "status": "disabled"
        }, 
        "ansible_architecture": "x86_64", 
        "ansible_bios_date": "11/12/2020", 
        "ansible_bios_version": "6.00", 
        "ansible_cmdline": {
            "BOOT_IMAGE": "/vmlinuz-3.10.0-327.el7.x86_64", 
            "LANG": "en_US.UTF-8", 
            "crashkernel": "auto", 
            "quiet": true, 
            "rhgb": true, 
            "ro": true, 
            "root": "UUID=c058400b-3be7-4902-ba95-8c08abf428ba"
        }, 
        "ansible_date_time": {
            "date": "2024-04-21", 
            "day": "21", 
            "epoch": "1713751417", 
            "hour": "19", 
            "iso8601": "2024-04-22T02:03:37Z", 
            "iso8601_basic": "20240421T190337661048", 
            "iso8601_basic_short": "20240421T190337", 
            "iso8601_micro": "2024-04-22T02:03:37.661048Z", 
            "minute": "03", 
            "month": "04", 
            "second": "37", 
            "time": "19:03:37", 
            "tz": "PDT", 
            "tz_offset": "-0700", 
            "weekday": "星期日", 
            "weekday_number": "0", 
            "weeknumber": "16", 
            "year": "2024"
    ......

运行facter模块来查看facter信息:

复制代码
[root@ansible01 ~]# ansible 11.0.1.19 -m facter
11.0.1.19 | FAILED! => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "cmd": "--json", 
    "msg": "[Errno 2] 没有那个文件或目录", 
    "rc": 2
}

报错是因为被管节点没有安装facter的包,我们先去被管节点安装在执行ansible 11.0.1.19 -m facter:

复制代码
#1.在11.0.1.19被管控机上安装facter
[root@ansible02 ~]# yum install -y facter.x86_64
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
epel                                                                                                                                                                                                              | 4.7 kB  00:00:00     
rhel-7-server-rpms                                                                                                                                                                                                | 3.5 kB  00:00:00     
(1/4): epel/x86_64/updateinfo                                                                                                                                                                                     | 1.0 MB  00:00:01     
(2/4): epel/x86_64/primary_db                                                                                                                                                                                     | 7.0 MB  00:00:06     
(3/4): rhel-7-server-rpms/7Server/x86_64/updateinfo                                                                                                                                                               | 4.3 MB  00:00:16     
(4/4): rhel-7-server-rpms/7Server/x86_64/primary_db                                                                                                                                                               |  95 MB  00:01:39     
Resolving Dependencies
--> Running transaction check
---> Package facter.x86_64 0:2.4.1-1.el7 will be installed
--> Processing Dependency: /usr/bin/ruby for package: facter-2.4.1-1.el7.x86_64
--> Running transaction check
---> Package ruby.x86_64 0:2.0.0.648-39.el7_9 will be installed
--> Processing Dependency: ruby-libs(x86-64) = 2.0.0.648-39.el7_9 for package: ruby-2.0.0.648-39.el7_9.x86_64
--> Processing Dependency: ruby(rubygems) >= 2.0.14.1 for package: ruby-2.0.0.648-39.el7_9.x86_64
--> Processing Dependency: rubygem(bigdecimal) >= 1.2.0 for package: ruby-2.0.0.648-39.el7_9.x86_64
--> Processing Dependency: libruby.so.2.0()(64bit) for package: ruby-2.0.0.648-39.el7_9.x86_64
--> Running transaction check
---> Package ruby-libs.x86_64 0:2.0.0.648-39.el7_9 will be installed
---> Package rubygem-bigdecimal.x86_64 0:1.2.0-39.el7_9 will be installed
---> Package rubygems.noarch 0:2.0.14.1-39.el7_9 will be installed
--> Processing Dependency: rubygem(io-console) >= 0.4.2 for package: rubygems-2.0.14.1-39.el7_9.noarch
--> Processing Dependency: rubygem(psych) >= 2.0.0 for package: rubygems-2.0.14.1-39.el7_9.noarch
--> Processing Dependency: rubygem(rdoc) >= 4.0.0 for package: rubygems-2.0.14.1-39.el7_9.noarch
--> Running transaction check
---> Package rubygem-io-console.x86_64 0:0.4.2-39.el7_9 will be installed
---> Package rubygem-psych.x86_64 0:2.0.0-39.el7_9 will be installed
---> Package rubygem-rdoc.noarch 0:4.0.0-39.el7_9 will be installed
--> Processing Dependency: ruby(irb) = 2.0.0.648 for package: rubygem-rdoc-4.0.0-39.el7_9.noarch
--> Processing Dependency: rubygem(json) >= 1.7.7 for package: rubygem-rdoc-4.0.0-39.el7_9.noarch
--> Running transaction check
---> Package ruby-irb.noarch 0:2.0.0.648-39.el7_9 will be installed
---> Package rubygem-json.x86_64 0:1.7.7-39.el7_9 will be installed
--> Finished Dependency Resolution
......
Installed:
  facter.x86_64 0:2.4.1-1.el7                                                                                                                                                                                                            

Dependency Installed:
  ruby.x86_64 0:2.0.0.648-39.el7_9           ruby-irb.noarch 0:2.0.0.648-39.el7_9        ruby-libs.x86_64 0:2.0.0.648-39.el7_9       rubygem-bigdecimal.x86_64 0:1.2.0-39.el7_9       rubygem-io-console.x86_64 0:0.4.2-39.el7_9      
  rubygem-json.x86_64 0:1.7.7-39.el7_9       rubygem-psych.x86_64 0:2.0.0-39.el7_9       rubygem-rdoc.noarch 0:4.0.0-39.el7_9        rubygems.noarch 0:2.0.14.1-39.el7_9             

Complete!
#2.在11.0.1.18上执行
[root@ansible01 ~]# ansible 11.0.1.19 -m facter
11.0.1.19 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "architecture": "x86_64", 
    "bios_release_date": "11/12/2020", 
    "bios_vendor": "Phoenix Technologies LTD", 
    "bios_version": "6.00", 
    "blockdevice_sda_model": "VMware Virtual S", 
    "blockdevice_sda_size": 21474836480, 
    "blockdevice_sda_vendor": "VMware,", 
    "blockdevice_sr0_model": "VMware SATA CD00", 
    "blockdevice_sr0_size": 47063040, 
    "blockdevice_sr0_vendor": "NECVMWar", 
    "blockdevice_sr1_model": "VMware SATA CD01", 
    "blockdevice_sr1_size": 4043309056, 
    "blockdevice_sr1_vendor": "NECVMWar", 
    "blockdevices": "sda,sr0,sr1", 
    "boardmanufacturer": "Intel Corporation", 
    "boardproductname": "440BX Desktop Reference Platform", 
    "boardserialnumber": "None", 
    "changed": false, 
    "facterversion": "2.4.1", 
    "filesystems": "xfs", 
    "fqdn": "ansible02", 
    "gid": "root", 
    "hardwareisa": "x86_64", 
    "hardwaremodel": "x86_64", 
    "hostname": "ansible02", 
    "id": "root", 
    "interfaces": "eno16777736,lo", 
    "ipaddress": "11.0.1.19", 
    "ipaddress_eno16777736": "11.0.1.19", 
    "ipaddress_lo": "127.0.0.1", 
    "is_virtual": true, 
    "kernel": "Linux", 
    "kernelmajversion": "3.10", 
    "kernelrelease": "3.10.0-327.el7.x86_64", 
    "kernelversion": "3.10.0", 
    "macaddress": "00:0c:29:af:86:c8", 
    "macaddress_eno16777736": "00:0c:29:af:86:c8", 
    "manufacturer": "VMware, Inc.", 
    "memoryfree": "1.39 GB", 
    "memoryfree_mb": "1424.84", 
    "memorysize": "1.78 GB", 
    "memorysize_mb": "1824.89", 
    "mtu_eno16777736": 1500, 
    "mtu_lo": 65536, 
    "netmask": "255.255.255.0", 
    "netmask_eno16777736": "255.255.255.0", 
    "netmask_lo": "255.0.0.0", 
    "network_eno16777736": "11.0.1.0", 
    "network_lo": "127.0.0.0", 
    "operatingsystem": "RedHat", 
    "operatingsystemmajrelease": "7", 
    "operatingsystemrelease": "7.2", 
    "os": {
        "family": "RedHat", 
        "name": "RedHat", 
        "release": {
            "full": "7.2", 
            "major": "7", 
            "minor": "2"
        }
    }, 
    "osfamily": "RedHat", 
    "partitions": {
        "sda1": {
            "filesystem": "xfs", 
            "mount": "/boot", 
            "size": "614400", 
            "uuid": "570828b6-d779-4967-96fd-b2b0f526d1c7"
        }, 
        "sda2": {
            "filesystem": "swap", 
            "size": "4194304", 
            "uuid": "1c352bba-419c-45f9-aee4-33f561fa3adf"
        }, 
        "sda3": {
            "filesystem": "xfs", 
            "mount": "/", 
            "size": "37132288", 
            "uuid": "c058400b-3be7-4902-ba95-8c08abf428ba"
        }
    }, 
    "path": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin", 
    "physicalprocessorcount": 2, 
    "processor0": "Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz", 
    "processor1": "Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz", 
    "processorcount": 2, 
    "processors": {
        "count": 2, 
        "models": [
            "Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz", 
            "Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz"
        ], 
        "physicalcount": 2
    }, 
    "productname": "VMware Virtual Platform", 
    "ps": "ps -ef", 
    "rubyplatform": "x86_64-linux", 
    "rubysitedir": "/usr/local/share/ruby/site_ruby/", 
    "rubyversion": "2.0.0", 
    "selinux": true, 
    "selinux_config_mode": "enforcing", 
    "selinux_config_policy": "unknown", 
    "selinux_current_mode": "enforcing", 
    "selinux_enforced": true, 
    "selinux_policyversion": "28", 
    "serialnumber": "VMware-56 4d 8d ec 75 14 da 3d-86 a0 ac 4c 74 af 86 c8", 
    "sshecdsakey": "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNs6cwFKInCtX1eUrXl7PootQTQ7btd+aA3DcTtH9TihD252WnC/cUisILy38hGoqxm8+d2aw+W7HqHQOsd2HP4=", 
    "sshed25519key": "AAAAC3NzaC1lZDI1NTE5AAAAIMd6dtJf4QsdSa0cabaGWG6eX2vH0uN/BLrsrmdSAATV", 
    "sshfp_ecdsa": "SSHFP 3 1 c0cb53b2e9cb7e79e12913112aeae09da9e4c494\nSSHFP 3 2 f083051fe458b4f5edcfa529a92e1967b4d9d64f5528346eb04d0660bc98a36c", 
    "sshfp_ed25519": "SSHFP 4 1 039897f1b97cba8ea06efb6240b02db31a513312\nSSHFP 4 2 3d239224bf4ee372299910c034770f38fc09248b1729cb765ae8233fc4967f9a", 
    "sshfp_rsa": "SSHFP 1 1 5437165980a87d0243b80b9396f06b1702b2dfe2\nSSHFP 1 2 ae37485b3d438a68754088e2cecc6e5d34d7f2930f5264ec045b653e666c6fc0", 
    "sshrsakey": "AAAAB3NzaC1yc2EAAAADAQABAAABAQCwbc57oJONFHN/fq0eMlr5I9RmXMCIErK0hi9db1rIyUiJ+G8TdKGD3r3WBGez2MJrv0UbecNkU3kSx/UeC7anhtMFfGenBdM7ftXuTeFnNpLaJKHMvaG6IakET3+vXd7QJcSt4IFzL7koWD/31dU4v9UicPt4DXDXjggFuwDVTNI+4ff3LbzoOMhhf2e81VAogfSLz7SSxDQ7OUYHfI+p/hTf7YN5cAObRrzfi08AXQ3Wa4jF4nXRxeOewGyUJR3r+crUL8XyVP75ddUMG/QvjRbwAf0vdMnDuM/Z/MEWr6cZYO49ZvWMMAXlNaXQxgtxkmeZGz/2hC64xUPwcTtr", 
    "swapfree": "2.00 GB", 
    "swapfree_mb": "2047.47", 
    "swapsize": "2.00 GB", 
    "swapsize_mb": "2048.00", 
    "system_uptime": {
        "days": 1, 
        "hours": 25, 
        "seconds": 93468, 
        "uptime": "1 day"
    }, 
    "timezone": "PDT", 
    "type": "Other", 
    "uniqueid": "00000000", 
    "uptime": "1 day", 
    "uptime_days": 1, 
    "uptime_hours": 25, 
    "uptime_seconds": 93468, 
    "uuid": "EC8D4D56-1475-3DDA-86A0-AC4C74AF86C8", 
    "virtual": "vmware"
}

2. playbook变量与引用

2.1 通过Inventory文件定义主机以及主机组变量

首先,我们来看下对应的inventory文件,Ansible默认的Inventory文件是INI格式,例如:

复制代码
[root@ansible01 ansible]# cat /etc/ansible/hosts |grep -v "^#"|grep -v "^$"
11.0.1.18	key=118
11.0.1.19	key=119
[nginx]
11.0.1.1[8:9]
[nginx:vars]
ansible_python_interpreter=/usr/bin/python2.7

我们在编写个playbook来验证变量能否引用:

复制代码
#1.[root@ansible01 ansible]# cat /etc/ansible/variable.yaml 
---
- hosts: all
  gather_facts: False
  tasks:
   - name: diplay Host Variable from hostfile
     debug: msg="The {{ inventory_hostname }} Value is {{ key }}"
#2.[root@ansible01 ansible]# ansible-playbook variable.yaml 
[WARNING]: Unable to parse /etc/ansible/roles as an inventory source
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with auto plugin: no root 'plugin' key found, '/etc/ansible/variable.yaml' is not a valid YAML inventory plugin config file
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with yaml plugin: YAML inventory has invalid structure, it should be a dictionary, got: <class
'ansible.parsing.yaml.objects.AnsibleSequence'>
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with ini plugin: Invalid host pattern '---' supplied, '---' is normally a sign this is a YAML file.
[WARNING]: Unable to parse /etc/ansible/variable.yaml as an inventory source

PLAY [all] ********************************************************************************************************************************************************************************

TASK [diplay Host Variable from hostfile] *************************************************************************************************************************************************
ok: [11.0.1.18] => {
    "msg": "The 11.0.1.18 Value is 118"
}
ok: [11.0.1.19] => {
    "msg": "The 11.0.1.19 Value is 119"
}

PLAY RECAP ********************************************************************************************************************************************************************************
11.0.1.18                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
11.0.1.19                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

发现变量调用成功,我们修改下/etc/ansible/hosts文件

复制代码
[root@ansible01 ansible]# cat /etc/ansible/hosts |grep -v "^#"|grep -v "^$"
#11.0.1.18	key=118
#11.0.1.19	key=119
[nginx]
11.0.1.1[8:9]
[nginx:vars]
ansible_python_interpreter=/usr/bin/python2.7
key=nginx

在运行variable.yaml试试,看看效果:

复制代码
[root@ansible01 ansible]# ansible-playbook variable.yaml 
[WARNING]: Unable to parse /etc/ansible/roles as an inventory source
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with auto plugin: no root 'plugin' key found, '/etc/ansible/variable.yaml' is not a valid YAML inventory plugin config file
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with yaml plugin: YAML inventory has invalid structure, it should be a dictionary, got: <class
'ansible.parsing.yaml.objects.AnsibleSequence'>
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with ini plugin: Invalid host pattern '---' supplied, '---' is normally a sign this is a YAML file.
[WARNING]: Unable to parse /etc/ansible/variable.yaml as an inventory source
[WARNING]:  * Failed to parse /etc/ansible/variable2.yaml with auto plugin: no root 'plugin' key found, '/etc/ansible/variable2.yaml' is not a valid YAML inventory plugin config file
[WARNING]:  * Failed to parse /etc/ansible/variable2.yaml with yaml plugin: YAML inventory has invalid structure, it should be a dictionary, got: <class
'ansible.parsing.yaml.objects.AnsibleSequence'>
[WARNING]:  * Failed to parse /etc/ansible/variable2.yaml with ini plugin: Invalid host pattern '---' supplied, '---' is normally a sign this is a YAML file.
[WARNING]: Unable to parse /etc/ansible/variable2.yaml as an inventory source

PLAY [all] ********************************************************************************************************************************************************************************

TASK [diplay Host Variable from hostfile] *************************************************************************************************************************************************
ok: [11.0.1.18] => {
    "msg": "The 11.0.1.18 Value is nginx"
}
ok: [11.0.1.19] => {
    "msg": "The 11.0.1.19 Value is nginx"
}

PLAY RECAP ********************************************************************************************************************************************************************************
11.0.1.18                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
11.0.1.19                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

2.2 通过/etc/ansible/下的文件定义主机以及主机组变量

我们可以在/etc/ansible下新建host_vars和group_vars目录来针对主机和主机组定义的变量,我们看看目录结构:

复制代码
[root@ansible01 hosts_vars]# tree /etc/ansible/
/etc/ansible/
├── ansible.cfg
├── group_vars
│   └── nginx
├── hosts
├── hosts_vars
│   ├── 11.0.1.18
│   └── 11.0.1.19
├── inventory
│   ├── docker
│   └── hosts
├── roles
└── variable.yaml

我们查看变量目录下文本内容:

复制代码
[root@ansible01 ansible]# head group_vars/nginx 
key: nginx
[root@ansible01 ansible]# head hosts_vars/*
==> hosts_vars/11.0.1.18 <==
key: 11.0.1.18

==> hosts_vars/11.0.1.19 <==
key: 11.0.1.19

删除/etc/ansible/hosts文件下的key定义:

复制代码
[root@ansible01 ansible]# cat /etc/ansible/hosts |grep -v "^#"|grep -v "^$"
[nginx]
11.0.1.1[8:9]
[nginx:vars]
ansible_python_interpreter=/usr/bin/python2.7

再次运行variable.yaml看看输出:

复制代码
ansible-playbook      ansible-playbook-2    ansible-playbook-2.7  ansible-pull          ansible-pull-2        ansible-pull-2.7      
[root@ansible01 ansible]# ansible-playbook variable.yaml 
[WARNING]:  * Failed to parse /etc/ansible/hosts_vars/11.0.1.18 with ini plugin: Invalid host pattern 'key:' supplied, ending in ':' is not allowed, this character is reserved to provide
a port.
[WARNING]: Unable to parse /etc/ansible/hosts_vars/11.0.1.18 as an inventory source
[WARNING]:  * Failed to parse /etc/ansible/hosts_vars/11.0.1.19 with ini plugin: Invalid host pattern 'key:' supplied, ending in ':' is not allowed, this character is reserved to provide
a port.
[WARNING]: Unable to parse /etc/ansible/hosts_vars/11.0.1.19 as an inventory source
[WARNING]: Unable to parse /etc/ansible/hosts_vars as an inventory source
[WARNING]: Unable to parse /etc/ansible/roles as an inventory source
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with auto plugin: no root 'plugin' key found, '/etc/ansible/variable.yaml' is not a valid YAML inventory plugin config file
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with yaml plugin: YAML inventory has invalid structure, it should be a dictionary, got: <class
'ansible.parsing.yaml.objects.AnsibleSequence'>
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with ini plugin: Invalid host pattern '---' supplied, '---' is normally a sign this is a YAML file.
[WARNING]: Unable to parse /etc/ansible/variable.yaml as an inventory source

PLAY [all] ********************************************************************************************************************************************************************************

TASK [diplay Host Variable from hostfile] *************************************************************************************************************************************************
ok: [11.0.1.18] => {
    "msg": "The 11.0.1.18 Value is nginx"
}
ok: [11.0.1.19] => {
    "msg": "The 11.0.1.19 Value is nginx"
}

PLAY RECAP ********************************************************************************************************************************************************************************
11.0.1.18                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
11.0.1.19                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

2.3 通过ansible-playbook命令行传入

我们先清除所有的变量key设置,然后再运行命令:

复制代码
#1.清空变量设置
[root@ansible01 ansible]# echo " " >group_vars/nginx
[root@ansible01 ansible]# echo " " >hosts_vars/11.0.1.18
[root@ansible01 ansible]# echo " " >hosts_vars/11.0.1.19
#2.运行命令
[root@ansible01 ansible]# ansible-playbook variable.yaml -e "key=wyx"
[WARNING]: Unable to parse /etc/ansible/roles as an inventory source
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with auto plugin: no root 'plugin' key found, '/etc/ansible/variable.yaml' is not a valid YAML inventory plugin config file
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with yaml plugin: YAML inventory has invalid structure, it should be a dictionary, got: <class
'ansible.parsing.yaml.objects.AnsibleSequence'>
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with ini plugin: Invalid host pattern '---' supplied, '---' is normally a sign this is a YAML file.
[WARNING]: Unable to parse /etc/ansible/variable.yaml as an inventory source

PLAY [all] ********************************************************************************************************************************************************************************

TASK [diplay Host Variable from hostfile] *************************************************************************************************************************************************
ok: [11.0.1.18] => {
    "msg": "The 11.0.1.18 Value is wyx"
}
ok: [11.0.1.19] => {
    "msg": "The 11.0.1.19 Value is wyx"
}

PLAY RECAP ********************************************************************************************************************************************************************************
11.0.1.18                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
11.0.1.19                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

2.4 在playbook文件内使用vars

修改variable.yaml如下:

复制代码
[root@ansible01 ansible]# cat variable.yaml 
---
- hosts: all
  gather_facts: False
  vars:
    key: Ansible_nginx
  tasks:
   - name: diplay Host Variable from hostfile
     debug: msg="The {{ inventory_hostname }} Value is {{ key }}"

再次运行:

复制代码
[root@ansible01 ansible]# ansible-playbook variable.yaml 
[WARNING]: Unable to parse /etc/ansible/roles as an inventory source
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with auto plugin: no root 'plugin' key found, '/etc/ansible/variable.yaml' is not a valid YAML inventory plugin config file
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with yaml plugin: YAML inventory has invalid structure, it should be a dictionary, got: <class
'ansible.parsing.yaml.objects.AnsibleSequence'>
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with ini plugin: Invalid host pattern '---' supplied, '---' is normally a sign this is a YAML file.
[WARNING]: Unable to parse /etc/ansible/variable.yaml as an inventory source

PLAY [all] ********************************************************************************************************************************************************************************

TASK [diplay Host Variable from hostfile] *************************************************************************************************************************************************
ok: [11.0.1.18] => {
    "msg": "The 11.0.1.18 Value is Ansible_nginx"
}
ok: [11.0.1.19] => {
    "msg": "The 11.0.1.19 Value is Ansible_nginx"
}

PLAY RECAP ********************************************************************************************************************************************************************************
11.0.1.18                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
11.0.1.19                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

2.5 使用register内的变量

我们假设有2个task,如何让第二个task引用第一个task命令的结果座位变量呢?看下面这个例子:

复制代码
[root@ansible01 ansible]# cat variable2.yaml 
---
- hosts: all
  gather_facts: False
  tasks:
   - name: register varibale
     shell: hostname
     register: info 
   - name: display variable
     debug: msg="The {{ inventory_hostname }} Value is {{ info }}"

我们在运行看看结果:

复制代码
[root@ansible01 ansible]# ansible-playbook variable2.yaml 
[WARNING]: Unable to parse /etc/ansible/roles as an inventory source
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with auto plugin: no root 'plugin' key found, '/etc/ansible/variable.yaml' is not a valid YAML inventory plugin config file
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with yaml plugin: YAML inventory has invalid structure, it should be a dictionary, got: <class
'ansible.parsing.yaml.objects.AnsibleSequence'>
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with ini plugin: Invalid host pattern '---' supplied, '---' is normally a sign this is a YAML file.
[WARNING]: Unable to parse /etc/ansible/variable.yaml as an inventory source
[WARNING]:  * Failed to parse /etc/ansible/variable2.yaml with auto plugin: no root 'plugin' key found, '/etc/ansible/variable2.yaml' is not a valid YAML inventory plugin config file
[WARNING]:  * Failed to parse /etc/ansible/variable2.yaml with yaml plugin: YAML inventory has invalid structure, it should be a dictionary, got: <class
'ansible.parsing.yaml.objects.AnsibleSequence'>
[WARNING]:  * Failed to parse /etc/ansible/variable2.yaml with ini plugin: Invalid host pattern '---' supplied, '---' is normally a sign this is a YAML file.
[WARNING]: Unable to parse /etc/ansible/variable2.yaml as an inventory source

PLAY [all] ********************************************************************************************************************************************************************************

TASK [register varibale] ******************************************************************************************************************************************************************
changed: [11.0.1.19]
changed: [11.0.1.18]

TASK [display variable] *******************************************************************************************************************************************************************
ok: [11.0.1.18] => {
    "msg": "The 11.0.1.18 Value is {'stderr_lines': [], u'changed': True, u'end': u'2024-04-28 15:21:18.866921', 'failed': False, u'stdout': u'ansible01', u'cmd': u'hostname', u'rc': 0, u'start': u'2024-04-28 15:21:18.862297', u'stderr': u'', u'delta': u'0:00:00.004624', 'stdout_lines': [u'ansible01']}"
}
ok: [11.0.1.19] => {
    "msg": "The 11.0.1.19 Value is {'stderr_lines': [], u'changed': True, u'end': u'2024-04-28 00:20:19.627787', 'failed': False, u'stdout': u'ansible02', u'cmd': u'hostname', u'rc': 0, u'start': u'2024-04-28 00:20:19.623874', u'stderr': u'', u'delta': u'0:00:00.003913', 'stdout_lines': [u'ansible02']}"
}

PLAY RECAP ********************************************************************************************************************************************************************************
11.0.1.18                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
11.0.1.19                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

我们看到返回的结果是一串python字典,我们在修改下取值后再运行:

复制代码
#1.修改取值
[root@ansible01 ansible]# cat variable2.yaml 
---
- hosts: all
  gather_facts: False
  tasks:
   - name: register varibale
     shell: hostname
     register: info 
   - name: display variable
     debug: msg="The {{ inventory_hostname }} Value is {{ info['stdout'] }}"
#2.执行查看结果
[root@ansible01 ansible]# ansible-playbook variable2.yaml 
[WARNING]: Unable to parse /etc/ansible/roles as an inventory source
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with auto plugin: no root 'plugin' key found, '/etc/ansible/variable.yaml' is not a valid YAML inventory plugin config file
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with yaml plugin: YAML inventory has invalid structure, it should be a dictionary, got: <class
'ansible.parsing.yaml.objects.AnsibleSequence'>
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with ini plugin: Invalid host pattern '---' supplied, '---' is normally a sign this is a YAML file.
[WARNING]: Unable to parse /etc/ansible/variable.yaml as an inventory source
[WARNING]:  * Failed to parse /etc/ansible/variable2.yaml with auto plugin: no root 'plugin' key found, '/etc/ansible/variable2.yaml' is not a valid YAML inventory plugin config file
[WARNING]:  * Failed to parse /etc/ansible/variable2.yaml with yaml plugin: YAML inventory has invalid structure, it should be a dictionary, got: <class
'ansible.parsing.yaml.objects.AnsibleSequence'>
[WARNING]:  * Failed to parse /etc/ansible/variable2.yaml with ini plugin: Invalid host pattern '---' supplied, '---' is normally a sign this is a YAML file.
[WARNING]: Unable to parse /etc/ansible/variable2.yaml as an inventory source

PLAY [all] ********************************************************************************************************************************************************************************

TASK [register varibale] ******************************************************************************************************************************************************************
changed: [11.0.1.19]
changed: [11.0.1.18]

TASK [display variable] *******************************************************************************************************************************************************************
ok: [11.0.1.18] => {
    "msg": "The 11.0.1.18 Value is ansible01"
}
ok: [11.0.1.19] => {
    "msg": "The 11.0.1.19 Value is ansible02"
}

PLAY RECAP ********************************************************************************************************************************************************************************
11.0.1.18                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
11.0.1.19                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

2.6 使用vars_prompt传入

Ansible还支持在运行playbook的时候,通过交互式的方式给定义好的参数传入变量值,如下面这个例子:

复制代码
[root@ansible01 ansible]# cat variable3.yaml 
---
- hosts: all
  gather_facts: False
  vars_prompt:
   - name: "one"
     prompt: "please input one value"
     private: no
   - name: "two"
     prompt: "please input two value"
     default: 'good'
     private: yes
  tasks:
   - name: display one variable
     debug: msg="one value is {{ one }}"
   - name: display two variable
     debug: msg="two value is {{ two }}"

运行:

复制代码
[root@ansible01 ansible]# ansible-playbook variable2.yaml 
[WARNING]: Unable to parse /etc/ansible/roles as an inventory source
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with auto plugin: no root 'plugin' key found, '/etc/ansible/variable.yaml' is not a valid YAML inventory plugin config file
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with yaml plugin: YAML inventory has invalid structure, it should be a dictionary, got: <class
'ansible.parsing.yaml.objects.AnsibleSequence'>
[WARNING]:  * Failed to parse /etc/ansible/variable.yaml with ini plugin: Invalid host pattern '---' supplied, '---' is normally a sign this is a YAML file.
[WARNING]: Unable to parse /etc/ansible/variable.yaml as an inventory source
[WARNING]:  * Failed to parse /etc/ansible/variable2.yaml with auto plugin: no root 'plugin' key found, '/etc/ansible/variable2.yaml' is not a valid YAML inventory plugin config file
[WARNING]:  * Failed to parse /etc/ansible/variable2.yaml with yaml plugin: YAML inventory has invalid structure, it should be a dictionary, got: <class
'ansible.parsing.yaml.objects.AnsibleSequence'>
[WARNING]:  * Failed to parse /etc/ansible/variable2.yaml with ini plugin: Invalid host pattern '---' supplied, '---' is normally a sign this is a YAML file.
[WARNING]: Unable to parse /etc/ansible/variable2.yaml as an inventory source
please input one value: hello
please input two value [good]: 

PLAY [all] ********************************************************************************************************************************************************************************

TASK [display one variable] ***************************************************************************************************************************************************************
ok: [11.0.1.18] => {
    "msg": "one value is hello"
}
ok: [11.0.1.19] => {
    "msg": "one value is hello"
}

TASK [display two variable] ***************************************************************************************************************************************************************
ok: [11.0.1.18] => {
    "msg": "two value is good"
}
ok: [11.0.1.19] => {
    "msg": "two value is good"
}

PLAY RECAP ********************************************************************************************************************************************************************************
11.0.1.18                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
11.0.1.19                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

看yaml中,one被定义非私有变量,two定义为私有变量并提供了默认值good

相关推荐
风清再凯2 天前
自动化工具ansible,以及playbook剧本
运维·自动化·ansible
IT乌鸦坐飞机2 天前
ansible部署数据库服务随机启动并创建用户和设置用户有完全权限
数据库·ansible·centos7
遇见火星15 天前
如何使用Ansible一键部署MinIO集群?
ansible
粥周粥15 天前
ANSIBLE
ansible
码农101号15 天前
Linux中ansible模块补充和playbook讲解
linux·运维·ansible
码农101号15 天前
Linux的Ansible软件基础使用讲解和ssh远程连接
ansible
烟雨书信17 天前
ANSIBLE运维自动化管理端部署
运维·自动化·ansible
碎碎-li17 天前
ANSIBLE(运维自动化)
运维·自动化·ansible
@donshu@20 天前
Linux运维-ansible-python开发-获取inventroy信息
linux·运维·ansible
Kendra91923 天前
Ansible
ansible