龙空技术网

Ansible-playbook中的变量

运维零到小白 245

前言:

此时看官们对“ubuntu1414内核补丁”大体比较讲究,咱们都想要分析一些“ubuntu1414内核补丁”的相关内容。那么小编也在网络上网罗了一些有关“ubuntu1414内核补丁””的相关资讯,希望你们能喜欢,小伙伴们一起来了解一下吧!

playbook中的变量

在写playbook中使用变量可以使我们的playbook更加灵活

自定义变量

变量名应该由字母、数字、下划线组成,变量名需要以字母开头,ansible内置的关键字不能作为变量名

定义变量的格式:变量名:变量值

可以用关键字 vars来定义变量

---- hosts: 192.168.233.167  remote_user: root  vars:    testfile: mytestfile  tasks:  - name: create file    file:      path: /root/{{ testfile }} #引用变量名 在双花括号中,且变量名和花括号直接加一个空格      state: touch

多个变量写法

vars:  testfile1: mytestfile  testfile2: youtestfile

或者

vars:  - testfile1: mytestfile  - testfile2: youtestfile

两种写法都可以,根据你自己喜好。

除了在playbook中定义变量外,还可以在单独一个文件中定义变量

比如:写一个名为my_vars.yaml的变量文件如下:

nginx_port: "listen 880"  #变量中间有空格的用双引号,没有空格的可以不用引号#              nginx_conf_path: /etc/nginx/nginx.conf

每个变量占一行

引用方法如下:

---- hosts: 192.168.233.167  remote_user: root  vars:    testfile: mytestfile  var_files:   #用var_files关键字引入变量文件  - /root/my_vars.yaml # 引入变量文件的路径  tasks:  - name: create file    file:      path: /root/{{ testfile }} #引用变量名 在双花括号中,且变量名和花括号直接加一个空格      state: touch  - name: modify nginx listen port    replace:      path: /etc/nginx/sites-enabled/default #ubuntu用apt安装的nginx端口配置文件位置      regexp: 'listen 80' #匹配需要修改的内容      replace: {{ nginx_port }} #引用变量文件中的nginx_port值      #backup: yes 这里不做备份,因为ubuntu用apt安装nginx配置有点特殊,会导致nginx无法重启    notify: restart nginx #注意notify的层级和replace是同一层的  - name: fetch file    fetch:      src: "{{ nginx_conf_path }}" #调用了my_vars变量文件中的nginx_conf_path变量      dest: /root/    handlers: #handlers的层级是和"- name"同一层级的  - name: restart nginx    service:      name: nginx      state: restarted

vars和vars_files可以同时使用,但是建议只使用其中一种方式

如果两种方式都是用,且引用变量名相同时,会优先使用vars_files引用的文件中定义的变量

ansible变量

上面所讲的都是我们自己定义的变量,在ansible中除了自定义变量外,它自身也有自己的变量

通过setup模块我们查看一下

[root@localhost ~]# ansible 192.168.233.167 -m setup192.168.233.167 | SUCCESS => {    "ansible_facts": {        "ansible_all_ipv4_addresses": [            "192.168.233.167"        ],         "ansible_all_ipv6_addresses": [            "fe80::20c:29ff:fe31:441"        ],         "ansible_apparmor": {            "status": "enabled"        },         "ansible_architecture": "x86_64",         "ansible_bios_date": "07/29/2019",         "ansible_bios_version": "6.00",         "ansible_cmdline": {            "BOOT_IMAGE": "/vmlinuz-4.4.0-87-generic",             "ro": true,             "root": "/dev/mapper/ubuntu--vg-root"        },         "ansible_date_time": {            "date": "2021-02-03",             "day": "03",             "epoch": "1612322512",             "hour": "11",             "iso8601": "2021-02-03T03:21:52Z",             "iso8601_basic": "20210203T112152183883",             "iso8601_basic_short": "20210203T112152",             "iso8601_micro": "2021-02-03T03:21:52.183883Z",             "minute": "21",             "month": "02",             "second": "52",             "time": "11:21:52",             "tz": "CST",             "tz_offset": "+0800",             "weekday": "Wednesday",             "weekday_number": "3",             "weeknumber": "05",             "year": "2021"        },         "ansible_default_ipv4": {            "address": "192.168.233.167",             "alias": "ens33",             "broadcast": "192.168.233.255",             "gateway": "192.168.233.2",             "interface": "ens33",             "macaddress": "00:0c:29:31:04:41",             "mtu": 1500,             "netmask": "255.255.255.0",             "network": "192.168.233.0",             "type": "ether"        },         "ansible_default_ipv6": {},         "ansible_device_links": {            "ids": {                "dm-0": [                    "dm-name-ubuntu--vg-root",                     "dm-uuid-LVM-2wodXdFENDdoEyQu26BNJoBxQ7Vi3OpA8J1ctCb9mfzmBcg6fkMoq4qNzWbXc24U"                ],                 "dm-1": [                    "dm-name-ubuntu--vg-swap_1",                     "dm-uuid-LVM-2wodXdFENDdoEyQu26BNJoBxQ7Vi3OpA0SBFA2ppfr2CudF072rlk5JqgxEt6VZA"                ],                 "sda5": [                    "lvm-pv-uuid-e0VDvn-DMEP-FQ7u-cuFZ-8RQu-y76e-UdUbFX"                ],                 "sr0": [                    "ata-VMware_Virtual_SATA_CDRW_Drive_01000000000000000001"                ]            },             "labels": {                "sr0": [                    "Ubuntu-Server\\x2016.04.3\\x20LTS\\x20amd64"                ]            },             "masters": {                "sda5": [                    "dm-0",                     "dm-1"                ]            },             "uuids": {                "dm-0": [                    "4f69b277-6b7e-4bd8-80f0-4f85a04eadda"                ],                 "dm-1": [                    "e1b06976-3417-4a0c-8d43-9cf1481e43ae"                ],                 "sda1": [                    "64a1b32e-3914-493a-9353-03afe9700551"                ],                 "sr0": [                    "2017-08-01-11-30-13-00"                ]            }        },         "ansible_devices": {            "dm-0": {                "holders": [],                 "host": "",                 "links": {                    "ids": [                        "dm-name-ubuntu--vg-root",                         "dm-uuid-LVM-2wodXdFENDdoEyQu26BNJoBxQ7Vi3OpA8J1ctCb9mfzmBcg6fkMoq4qNzWbXc24U"                    ],                     "labels": [],                     "masters": [],                     "uuids": [                        "4f69b277-6b7e-4bd8-80f0-4f85a04eadda"                    ]                },                 "model": null,                 "partitions": {},                 "removable": "0",                 "rotational": "1",                 "sas_address": null,                 "sas_device_handle": null,                 "scheduler_mode": "",                 "sectors": "36741120",                 "sectorsize": "512",                 "size": "17.52 GB",                 "support_discard": "0",                 "vendor": null,                 "virtual": 1            },        ...

信息较多,我们只截取部分,有兴趣的同学可以自己研究一下。

在playbook执行过程中我们首先看到[Gathering Facts]任务,这个任务会自动执行setup模块收集远程机器的信息。

在我们写playbook的时候默认都会执行[Gathering Facts]任务,如果不想或不需要收集远程机器的信息我们可以把这个任务关闭,写法如下:

---- hosts: 192.168.233.167  remote_user: root  gather_facts: no  tasks:  - name: task1    file:      path: /root/test_one      state: touch    tags: t1  # 注意tags标签的层级,是和file模块同一层级  - name: task2    file:      path: /root/test_two      state: touch    tags: t2

加上gather_facts: no在执行playbook中就不会在执行[Gathering Facts]任务,这样也就提高了playbook的执行速度。

这里列出几个常用的变量名称

ansible_os_family:获取远程机器属于哪个家族的,比如RedHat、Debian

ansible_distribution_version:远程机器发行版本

ansible_default_ipv4:获取远程机器ip

我们写一个playbook看看上面三个变量对应的值

---- hosts: 192.168.233.167  remote_user: root  vars:    ip: "{{ ansible_default_ipv4['address'] }}"    family: "{{ ansible_os_family }}"    vers: "{{ ansible_distribution_version }}"  tasks:  - name: show ansible vars     debug:      msg: "{{ item }}"    loop:      - "{{ ip }}"      - "{{ family }}"      - "{{ vers }}"

再看一下执行结果

[root@localhost ~]# ansible-playbook ansible_vars.yml PLAY [192.168.233.167] *********************************************************************************************************TASK [Gathering Facts] *********************************************************************************************************ok: [192.168.233.167]TASK [show ansible vars] *********************************************************************************************************ok: [192.168.233.167] => (item=192.168.233.167) => {    "msg": "192.168.233.167"  }ok: [192.168.233.167] => (item=Debian) => {    "msg": "Debian"}ok: [192.168.233.167] => (item=16.04) => {    "msg": "16.04"}PLAY RECAP *********************************************************************************************************192.168.233.167            : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

用debug模块分别显示了上面三个变量的值,远程机器不同,可能显示的结果也不同。

注册变量

其实ansible每次执行后都会有返回值,执行Ad-hoc(就是临时执行的命令)的时候可以看到,但是执行playbook的时候是看不到的。

在我们写playbook的时候如果某一步操作想引用前一步执行后的返回值怎么办呢?

这时候我们可以借助ansible的关键字register,把返回的内容注册的一个自定义的变量中,

先写一个register.yaml,内容如下:

---- hosts: 192.168.233.167  remote_user: root  tasks:  - name: free -m    shell: free -m    register: free  #返回内容注册到变量free  - name: show register vars    debug:      var: free  #显示变量free的内容

这个yaml文件的意思是第一个任务使用shell模块执行free -m命令,再把返回的结果注册到变量free。第二个任务用debug模块通过关键字var把刚才注册到free变量的内容显示出来

看一下执行结果:

[root@localhost ~]# ansible-playbook register.yml PLAY [192.168.233.167] *********************************************************************************************************TASK [Gathering Facts] *********************************************************************************************************ok: [192.168.233.167]TASK [free -m] *********************************************************************************************************changed: [192.168.233.167]TASK [show register vars] *********************************************************************************************************ok: [192.168.233.167] => {    "free": {        "changed": true,         "cmd": "free -m",         "delta": "0:00:00.006214",         "end": "2021-02-03 14:32:45.998207",         "failed": false,         "rc": 0,         "start": "2021-02-03 14:32:45.991993",         "stderr": "",         "stderr_lines": [],         "stdout": "              total        used        free      shared  buff/cache   available\nMem:           1982         326         232           9        1423        1414\nSwap:          2047          34        2013",         "stdout_lines": [            "              total        used        free      shared  buff/cache   available",             "Mem:           1982         326         232           9        1423        1414",             "Swap:          2047          34        2013"        ]    }}PLAY RECAP *********************************************************************************************************192.168.233.167            : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

可以看到变量free的内容,"stdout_lines"的内容就是执行free -m的结果。

交互式变量

之前我们写的playbook都是直接执行完成,中间没有任何交互的,但是在执行playbook的时候想要临时输入一下变量需要怎么做呢?只要通过关键字prompt即可实现。我(官方没有这个叫法)把这种变量叫做交互式变量,要先通过vars_prompt定义好哪些变量需要交互实现

先看一个例子

---- hosts: 192.168.233.167  remote_user: root  vars_prompt:    - name: uname      prompt: "Input uname"      private: no  #关闭private    - name: passwd      prompt: "Password"  tasks:  - name: out prompt    debug:      msg: you uname is {{ uname }} password is {{ passwd }}

参数 private默认是打开的,该参数打开输入内容是不可见的,关闭后输入的内容可以在屏幕显示

执行结果如下:

[root@localhost ~]# ansible-playbook  123.yml Input uname: xiaoming   #关闭private,显示输入内容Password:               #默认打开private,不显示输入内容PLAY [192.168.233.167] *********************************************************************************************************TASK [Gathering Facts] *********************************************************************************************************ok: [192.168.233.167]TASK [out prompt] *********************************************************************************************************ok: [192.168.233.167] => {    "msg": "you uname is xiaoming password is 123456"}PLAY RECAP *********************************************************************************************************192.168.233.167            : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

交互式变量就讲这么多。

当然还有其他设置变量的方式,个人觉得掌握以上几种足够工作中使用了。感兴趣的同学,可以网上去找其他设置变量的方式。这里就不全列出了

标签: #ubuntu1414内核补丁