前言:
此时看官们对“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内核补丁