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 天前
jmeter结合ansible分布式压测--3压测执行
分布式·jmeter·ansible
紫晓宁3 天前
jmeter结合ansible分布式压测--1数据准备
分布式·jmeter·ansible
紫晓宁3 天前
jmeter结合ansible分布式压测--2jmter环境准备
分布式·jmeter·ansible
SG.xf6 天前
ansible中的任务执行控制
ansible
赶紧回家去9 天前
Ansible基本使用
运维·ansible
我就是全世界10 天前
ansible详细介绍和具体步骤
ansible
福大大架构师每日一题10 天前
27.9 调用go-ansible执行playbook拷贝json文件重载采集器
golang·json·ansible·prometheus
SG.xf10 天前
Ansible
运维·ansible
避凉闲庭10 天前
ansible开局配置-openEuler
linux·运维·ansible·脚本·openeuler·免密登录·批量化
运维小白。。12 天前
Ansible 批量部署
ansible