ToB企服应用市场:ToB评测及商务社交产业平台

标题: 不求甚解--详解ansible-playbook中roles的用法 [打印本页]

作者: 伤心客    时间: 2024-12-10 14:46
标题: 不求甚解--详解ansible-playbook中roles的用法
前言

本文将具体先容ansible-playbook中roles的各种用法,它允许你将相关的使命、变量、处置惩罚器、文件和模板等聚集在一起,以便于在不同的项目中复用
环境准备

组件版本操作系统Ubuntu 22.04.4 LTSansible2.17.6基本用法

文件结构
  1. .
  2. ├── deploy.hosts
  3. ├── deploy.yaml
  4. └── roles
  5.     └── base
  6.         └── tasks
  7.             └── main.yaml
复制代码
运行
  1. ▶ ansible-playbook -i deploy.hosts deploy.yaml
  2. PLAY [deploy] ****************************************************************************************************
  3. TASK [base : first] **********************************************************************************************
  4. changed: [10.22.11.166]
  5. PLAY RECAP *******************************************************************************************************
  6. 10.22.11.166               : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
复制代码
在屏幕上显示执行结果

需要改造roles/base/tasks/main.yaml
  1. ▶ cat roles/base/tasks/main.yaml
  2. - name: first
  3.   command: echo 'hello world'  register: display_result- name: display  debug:    msg: "{{ display_result }}"
复制代码
把结果放入变量display_result,然后通过模版语言打印出来,而且是json格式的
运行:
  1. ▶ ansible-playbook -i deploy.hosts deploy.yaml
  2. PLAY [deploy] ****************************************************************************************************
  3. TASK [base : first] **********************************************************************************************
  4. changed: [10.22.11.166]
  5. TASK [base : display] ********************************************************************************************
  6. ok: [10.22.11.166] => {
  7.     "msg": {
  8.         "changed": true,
  9.         "cmd": [
  10.             "echo",
  11.             "hello world"
  12.         ],
  13.         "delta": "0:00:00.002740",
  14.         "end": "2024-11-19 07:22:22.226036",
  15.         "failed": false,
  16.         "msg": "",
  17.         "rc": 0,
  18.         "start": "2024-11-19 07:22:22.223296",
  19.         "stderr": "",
  20.         "stderr_lines": [],
  21.         "stdout": "hello world",
  22.         "stdout_lines": [
  23.             "hello world"
  24.         ]
  25.     }
  26. }
  27. PLAY RECAP *******************************************************************************************************
  28. 10.22.11.166               : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
复制代码
引用环境变量

将操作系统的环境变量传入,可以通过lookup来引用,好比:要使用PATH,可以通过lookup('env', 'PATH')
改造roles/base/tasks/main.yaml
  1. ▶ cat roles/base/tasks/main.yaml
  2. - name: first
  3.   debug:
  4.     msg: "{{ lookup('env', 'PATH') }}"
复制代码
运行:
  1. ▶ ansible-playbook -i deploy.hosts deploy.yaml
  2. PLAY [deploy] ****************************************************************************************************
  3. TASK [base : first] **********************************************************************************************
  4. ok: [10.22.11.166] => {
  5.     "msg": "/home/wilson/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/usr/local/go/bin:/usr/local/go/bin"
  6. }
  7. PLAY RECAP *******************************************************************************************************
  8. 10.22.11.166               : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
复制代码
使用ansible变量

这里的ansible变量,其中一部门ansible默认的变量,一部门是ansible运行的时候,会默认去收罗目标呆板的基本信息,好比操作系统、cpu、内存、磁盘等等的基本信息
部门内置变量

变量名描述inventory_hostname当前使命执行的主机名(来自 Inventory 文件)ansible_facts包罗所有收集到的主机事实(facts)hostvars所有主机变量的聚集,包罗当前和其他主机收罗目标呆板的基本信息

需要把之前收罗ansible基本信息的开关打开gather_facts: yes,打开之后会牺牲运行速度
改造roles/base/tasks/main.yaml
  1. - name: first
  2.   debug:
  3.     msg: "{{ hostvars }}"
复制代码
运行:
由于数据量太大,只展示部门,而且json格式,可以直接拿想要的值
  1. ▶ ansible-playbook -i deploy.hosts deploy.yaml
  2. PLAY [deploy] ******************************************************************
  3. TASK [Gathering Facts] *********************************************************
  4. ok: [10.22.11.166]
  5. TASK [base : first] ************************************************************
  6. ok: [10.22.11.166] => {
  7.     "msg": {
  8.         "10.22.11.166": {
  9.             "ansible_all_ipv4_addresses": [
  10.                 "10.22.11.166"
  11.             ],
  12.             "ansible_all_ipv6_addresses": [
  13.                 "fe80::a00:27ff:fef6:82c4"
  14.             ],
  15.             "ansible_apparmor": {
  16.                 "status": "enabled"
  17.             },
  18.             "ansible_architecture": "x86_64",
  19.             "ansible_bios_date": "12/01/2006",
  20.             "ansible_bios_vendor": "innotek GmbH",
  21.             "ansible_bios_version": "VirtualBox",
  22.             "ansible_board_asset_tag": "NA",
  23.             "ansible_board_name": "VirtualBox",
  24.             "ansible_board_serial": "NA",
  25.             "ansible_board_vendor": "Oracle Corporation",
  26.             ...
  27.             "inventory_dir": "/home/wilson/workspace/ansible",
  28.             "inventory_file": "/home/wilson/workspace/ansible/deploy.hosts",
  29.             "inventory_hostname": "10.22.11.166",
  30.             "inventory_hostname_short": "10.22.11.166",
  31.             "module_setup": true,
  32.             "playbook_dir": "/home/wilson/workspace/ansible"
  33.         }
  34.     }
  35. }
  36. PLAY RECAP *********************************************************************
  37. 10.22.11.166               : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
复制代码
是否收罗目标的基本信息

上面已经演示过,只需要gather_facts: yes即可
从命令行传入变量

ansible-playbook可以通过-e传入变量使用
  1. ▶ cat roles/base/tasks/main.yaml
  2. - name: first
  3.   debug:
  4.     msg: "{{ app_name }} - {{ app_version }}"
复制代码
运行:
  1. ▶ ansible-playbook -i deploy.hosts -e "app_name=prom app_version=1.0" deploy.yaml
  2. PLAY [deploy] ****************************************************************************************************
  3. TASK [Gathering Facts] *******************************************************************************************
  4. ok: [10.22.11.166]
  5. TASK [base : first] **********************************************************************************************
  6. ok: [10.22.11.166] => {
  7.     "msg": "prom - 1.0"
  8. }
  9. PLAY RECAP *******************************************************************************************************
  10. 10.22.11.166               : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
复制代码
动态选择host

1)将主机分组
修改deploy.hosts文件
  1. ▶ cat deploy.hosts
  2. [ga]
  3. 10.22.11.166
  4. [gb]
  5. 10.22.11.166
  6. 127.0.0.1
复制代码
2)改造入口文件
  1. ▶ cat deploy.yaml
  2. - name: deploy
  3.   hosts: '{{h}}'
  4.   remote_user: wilson
  5.   gather_facts: no
  6.   vars:
  7.     ansible_ssh_pass: '123456'
  8.     ansible_python_interpreter: /usr/bin/python3
  9.   roles:
  10.     - base
复制代码
将hosts改在成为'{{h}}',通过传入h变量来动态定义
3)运行
指定h为ga
  1. ▶ ansible-playbook -i deploy.hosts -e "h=ga" deploy.yaml
  2. PLAY [deploy] ****************************************************************************************************
  3. TASK [base : first] **********************************************************************************************
  4. ok: [10.22.11.166] => {
  5.     "msg": "hello world"
  6. }
  7. PLAY RECAP *******************************************************************************************************
  8. 10.22.11.166               : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
复制代码
指定h为gb
  1. ▶ ansible-playbook -i deploy.hosts -e "h=gb" deploy.yaml
  2. PLAY [deploy] ****************************************************************************************************
  3. TASK [base : first] **********************************************************************************************
  4. ok: [10.22.11.166] => {
  5.     "msg": "hello world"
  6. }
  7. ok: [127.0.0.1] => {
  8.     "msg": "hello world"
  9. }
  10. PLAY RECAP *******************************************************************************************************
  11. 10.22.11.166               : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
  12. 127.0.0.1                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
复制代码
条件选择when
  1. ▶ cat roles/base/tasks/main.yaml
  2. - name: first
  3.   debug:
  4.     msg: "version 1"
  5.   when: version == '1'
  6. - name: second
  7.   debug:
  8.     msg: "version 2"
  9.   when: version == '2'
复制代码
定义暂时变量

通过-e传入的变量来产生暂时变量
  1. - name: first
  2.   set_fact:
  3.     tag: "hello-{{ version }}"
  4. - name: second
  5.   debug:
  6.     msg: "{{ tag }}"
复制代码
运行:
  1. ▶ ansible-playbook -i deploy.hosts -e "version=2" deploy.yaml
  2. ...
  3. TASK [base : second] *********************************************************************************************
  4. ok: [10.22.11.166] => {
  5.     "msg": "hello-2"
  6. }
  7. ...
复制代码
调用多个role

1)新增role: advance
  1. .
  2. ├── deploy.hosts
  3. ├── deploy.yaml
  4. └── roles
  5.     ├── advance
  6.     │   └── tasks
  7.     │       └── main.yaml
  8.     └── base
  9.         └── tasks
  10.             └── main.yaml
复制代码
2)直接在入口文件deploy.yaml引用
  1. .
  2. ├── deploy.hosts
  3. ├── deploy.yaml
  4. └── roles
  5.     ├── advance
  6.     │   └── tasks
  7.     │       └── main.yaml
  8.     └── base
  9.         └── tasks
  10.             └── main.yaml
复制代码
运行:
  1. ▶ ansible-playbook -i deploy.hosts -e "version=2" deploy.yaml
  2. PLAY [deploy] ****************************************************************************************************
  3. TASK [base : first] **********************************************************************************************
  4. ok: [10.22.11.166]
  5. TASK [base : second] *********************************************************************************************
  6. ok: [10.22.11.166] => {
  7.     "msg": "hello-2"
  8. }
  9. TASK [advance : new-first] ***************************************************************************************
  10. ok: [10.22.11.166] => {
  11.     "msg": "new hello world"
  12. }
  13. PLAY RECAP *******************************************************************************************************
  14. 10.22.11.166               : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
复制代码
3)在roles base中引用 advance
  1. ▶ cat deploy.yaml
  2. - name: deploy
  3.   hosts: all
  4.   remote_user: wilson
  5.   gather_facts: no
  6.   vars:
  7.     ansible_ssh_pass: '123456'
  8.     ansible_python_interpreter: /usr/bin/python3
  9.   roles:
  10.     - base
复制代码
  1. ▶ cat roles/base/tasks/main.yaml
  2. - name: base first
  3.   debug:
  4.     msg: "base {{ version }}"
  5. - name: base second
  6.   include_role:
  7.     name: advance
  8.   vars:
  9.     role_pipe_from_base: "hello world from base"
  10. - name: base third
  11.   debug:
  12.     msg: "{{ role_pipe_from_advance }}"
复制代码
  1. ▶ cat roles/advance/tasks/main.yaml
  2. - name: advance first
  3.   debug:
  4.     msg: "advance {{ version }}"
  5. - name: advance second
  6.   debug:
  7.     msg: "{{ role_pipe_from_base }}"
  8. - name: advance third
  9.   set_fact:
  10.     role_pipe_from_advance: "hello world from advance"
复制代码
运行:
  1. ▶ ansible-playbook -i deploy.hosts -e "version=2" deploy.yaml
  2. PLAY [deploy] ****************************************************************************************************
  3. TASK [base : base first] *****************************************************************************************
  4. ok: [10.22.11.166] => {
  5.     "msg": "base 2"
  6. }
  7. TASK [base second] ***********************************************************************************************
  8. included: advance for 10.22.11.166
  9. TASK [advance : advance first] ***********************************************************************************
  10. ok: [10.22.11.166] => {
  11.     "msg": "advance 2"
  12. }
  13. TASK [advance : advance second] **********************************************************************************
  14. ok: [10.22.11.166] => {
  15.     "msg": "hello world from base"
  16. }
  17. TASK [advance : advance third] ***********************************************************************************
  18. ok: [10.22.11.166]
  19. TASK [base : base third] *****************************************************************************************
  20. ok: [10.22.11.166] => {
  21.     "msg": "hello world from advance"
  22. }
  23. PLAY RECAP *******************************************************************************************************
  24. 10.22.11.166               : ok=6    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
复制代码

这个例子呈现了:
小结


至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝见教...

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4