IT评测·应用市场-qidao123.com

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

作者: 反转基因福娃    时间: 2024-12-13 19:13
标题: 不求甚解--详解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
复制代码
界说全局公共变量

新增group_vars目录,并且新增文件
  1. .
  2. ├── deploy.hosts
  3. ├── deploy.yaml
  4. ├── group_vars
  5. │   └── all.yaml
  6. └── roles
  7.     └── base
  8.         └── tasks
  9.             └── main.yaml
复制代码
  1. ▶ cat group_vars/all.yaml
  2. info: IT paiqiu
复制代码
  1. ▶ cat roles/base/tasks/main.yaml
  2. - name: first
  3.   debug:
  4.     msg: "hello world {{ info }}"
复制代码
运行:
  1. ▶ ansible-playbook -i deploy.hosts deploy.yaml
  2. ...
  3. TASK [base : first] **********************************************************************************************
  4. ok: [10.22.11.166] => {
  5.     "msg": "hello world IT paiqiu"
  6. }
  7. ...
复制代码
界说role级变量

可以覆盖全局变量
在role base 下面新增vars目录,并且新增main.yaml文件
  1. .
  2. ├── deploy.hosts
  3. ├── deploy.yaml
  4. ├── group_vars
  5. │   └── all.yaml
  6. └── roles
  7.     └── base
  8.         ├── tasks
  9.         │   └── main.yaml
  10.         └── vars
  11.             └── main.yaml
复制代码
  1. ▶ cat roles/base/tasks/main.yaml
  2. - name: first
  3.   debug:
  4.     msg: "hello world {{ info }}"
复制代码
  1. ▶ cat roles/base/vars/main.yaml
  2. info:
  3.   name: wilson
  4.   addr: cd
复制代码
运行:
  1. ▶ ansible-playbook -i deploy.hosts deploy.yaml
  2. ...
  3. TASK [base : first] **********************************************************************************************
  4. ok: [10.22.11.166] => {
  5.     "msg": "hello world {'name': 'wilson', 'addr': 'cd'}"
  6. }
  7. ...
复制代码
界说静态文件目录

相当于界说role级别的根目录,更好的管理需要传输的文件,在role base下面创建目录files,并且在files下面放入需要传输的文件test.img
  1. .
  2. ├── deploy.hosts
  3. ├── deploy.yaml
  4. ├── group_vars
  5. │   └── all.yaml
  6. └── roles
  7.     └── base
  8.         ├── files
  9.         │   └── test.img
  10.         ├── tasks
  11.         │   └── main.yaml
  12.         └── vars
  13.             └── main.yaml
复制代码
传输test.img至目的机器
  1. - name: first
  2.   copy: src=test.img dest=/tmp/test.img
复制代码
test.img默认回去roles/base/files当中寻找,所以前面不需要添加路径
copy模块会主动查抄待传输文件的md5,如果没有变化,那就不会再传输了
界说模版

每次传输文件都会通过输入的变量重新渲染之后再传输,在role base下面创建目录templates,并且创建文件 test.conf
  1. .
  2. ├── deploy.hosts
  3. ├── deploy.yaml
  4. ├── group_vars
  5. │   └── all.yaml
  6. └── roles
  7.     └── base
  8.         ├── files
  9.         │   └── test.img
  10.         ├── tasks
  11.         │   └── main.yaml
  12.         ├── templates
  13.         │   └── test.conf
  14.         └── vars
  15.             └── main.yaml
复制代码
在模版文件中界说了两个变量,一个是手动设置的变量version,一个是ansible内建变量inventory_hostname
  1. ▶ cat roles/base/templates/test.conf
  2. {{ version }}
  3. {{ inventory_hostname }}
复制代码
  1. ▶ cat roles/base/tasks/main.yaml
  2. - name: first
  3.   template: src=test.conf dest=/tmp/test.conf mode=0644
复制代码
运行:
  1. ▶ ansible-playbook -i deploy.hosts -e version=2 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
复制代码
登录到目的机器查看:
  1. ▶ cat test.conf
  2. 2
  3. 10.22.11.166
复制代码
2是本次任务传入的变量,10.22.11.166则是目的机器的ip地点
界说变乱驱动

通常用于某些任务完成之后需要触发的动作,比如:发布完某个配置文件之后需要重启服务。在role base下创建目录handlers,并创建文件main.yaml
  1. .
  2. ├── deploy.hosts
  3. ├── deploy.yaml
  4. ├── group_vars
  5. │   └── all.yaml
  6. └── roles
  7.     └── base
  8.         ├── files
  9.         │   └── test.img
  10.         ├── handlers
  11.         │   └── main.yaml
  12.         ├── tasks
  13.         │   └── main.yaml
  14.         ├── templates
  15.         │   └── test.conf
  16.         └── vars
  17.             └── main.yaml
复制代码
创建变乱first handler
  1. ▶ cat roles/base/handlers/main.yaml
  2. - name: first handler
  3.   debug:
  4.     msg: echo 'hello world'
复制代码
  1. ▶ cat roles/base/tasks/main.yaml
  2. - name: first
  3.   template: src=test.conf dest=/tmp/test.conf mode=0644  notify: first handler
复制代码
运行:
  1. ▶ ansible-playbook -i deploy.hosts -e version=2 deploy.yaml
  2. PLAY [deploy] ****************************************************************************************************
  3. TASK [base : first] **********************************************************************************************
  4. changed: [10.22.11.166]
  5. RUNNING HANDLER [base : first handler] ***************************************************************************
  6. ok: [10.22.11.166] => {
  7.     "msg": "echo 'hello world'"
  8. }
  9. PLAY RECAP *******************************************************************************************************
  10. 10.22.11.166               : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
复制代码
同样的,如果变乱前驱没有发生,那变乱关照也不会发生了,比如变乱前驱是传输一个文件,如果文件没有变化,就不会再传输,那变乱也不会再发生了
新增更多的task任务

当前只有main.yaml,在增长一个专门用于传输文件的任务files.yaml
  1. ▶ cat roles/base/tasks/main.yaml
  2. - name: main
  3.   include_tasks: files.yaml
  4.   vars:
  5.     app_version: 0.2
复制代码
  1. ▶ cat roles/base/tasks/files.yaml
  2. - name: first
  3.   debug:
  4.     msg: "version: {{ app_version }}"
复制代码
运行:
  1. ▶ ansible-playbook -i deploy.hosts deploy.yaml
  2. PLAY [deploy] ****************************************************************************************************
  3. TASK [base : main] ***********************************************************************************************
  4. included: /home/wilson/workspace/ansible/roles/base/tasks/files.yaml for 10.22.11.166
  5. TASK [base : first] **********************************************************************************************
  6. ok: [10.22.11.166] => {
  7.     "msg": "version: 0.2"
  8. }
  9. PLAY RECAP *******************************************************************************************************
  10. 10.22.11.166               : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
复制代码
如果文件过多,可以通过循环来处理:
  1. - name: main
  2.   include_tasks: "{{ yaml_items }}"
  3.   loop:
  4.     - files.yaml
  5.     - packages.yaml
  6.   loop_control:
  7.     loop_var: yaml_items
  8.   vars:
  9.     app_version: 0.2
复制代码
增补一下常用的命令

执行命令 shell
  1. - name: display
  2.   shell: echo 'hello world'
复制代码
传输文件 copy

copy模块会主动查抄待传输文件的md5,如果没有变化,那就不会再传输了
  1. - name: copy file
  2.   copy: src=test.img dest=/tmp/test.img
复制代码
修改文件内容(一行) lineinfile

通过正则匹配行之后修改当前行
  1. - name: modify
  2.   lineinfile: dest=/tmp/test.txt regexp='^DC' line="DC=hello" state=present
复制代码
修改文件内容(多行/块) blockinfile

1)在某一行下面增长新的内容,并且将增长的内容打上标志
  1. - name: add new content with markers
  2.   blockinfile:
  3.     path: /tmp/test.txt
  4.     marker: "# {mark} by wilson"
  5.     insertafter: '^DC'
  6.     block: |
  7.       name: wilson
  8.       city: cd
复制代码
运行之后查看效果
  1. ▶ cat /tmp/test.txt
  2. DC=hello
  3. # BEGIN by wilson
  4. name: wilson
  5. city: cd
  6. # END by wilson
复制代码
2)删除已标志的内容
  1. - name: Remove the managed block
  2.   blockinfile:
  3.     marker: "# {mark} by wilson"
  4.     path: /tmp/test.txt
  5.     state: absent
复制代码
添加内容块打上标志之后会让修改与删除都变得非常方便
使用模版
  1. - name: hostname config
  2.   template: src=etc/hostname dest=/etc/hostname
复制代码
设置文件权限 file
  1. - name: change file 755
  2.   file:
  3.     path: /tmp/test.txt
  4.     owner: wilson
  5.     group: wilson
  6.     state: file
  7.     mode: 755
复制代码
使用循环 with_items

with_items

给多个目录修改权限
  1. - name: change directory 755
  2.   file:
  3.     path: '{{ item.dir }}'
  4.     owner: wilson
  5.     group: wilson
  6.     state: directory
  7.     mode: '{{ item.mode }}'
  8.   with_items:
  9.     - { dir: '/tmp/1', mode: '0755'}
  10.     - { dir: '/tmp/2', mode: '0755'}
复制代码
loop

当然使把with_items 替换成 loop也是可以的
  1. - name: change directory 755
  2.   file:
  3.     path: '{{ item.dir }}'
  4.     owner: wilson
  5.     group: wilson
  6.     state: directory
  7.     mode: '{{ item.mode }}'
  8.   with_items:
  9.     - { dir: '/tmp/1', mode: '0755'}
  10.     - { dir: '/tmp/2', mode: '0755'}
复制代码
嵌套循环 with_nested

输出每一种组合,相当于笛卡尔积
  1. - name: nested loop
  2.   debug:
  3.     msg: "{{ item[0] }} {{ item[1] }}"
  4.   with_nested:
  5.     - [ "hello1", "hello2"]
  6.     - [ "world1", "world2"]
复制代码
输出效果:
  1. TASK [base : nested loop] ****************************************************************************************
  2. ok: [127.0.0.1] => (item=['hello1', 'world1']) => {
  3.     "msg": "hello1 world1"
  4. }
  5. ok: [127.0.0.1] => (item=['hello1', 'world2']) => {
  6.     "msg": "hello1 world2"
  7. }
  8. ok: [127.0.0.1] => (item=['hello2', 'world1']) => {
  9.     "msg": "hello2 world1"
  10. }
  11. ok: [127.0.0.1] => (item=['hello2', 'world2']) => {
  12.     "msg": "hello2 world2"
  13. }
复制代码
文件内容循环 with_file

逐行打印文件内容
  1. - name: display file content
  2.   debug:
  3.     msg: "{{ item }}"
  4.   with_file:
  5.     - /tmp/test.txt
复制代码
幂等性

使用roles去管理多设备的时候,编写脚本需要时候注意幂等性,即每一次执行都要包管同样的效果
联系我

联系我,做深入的交流

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

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




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4