前言
本文将继续介绍ansible-playbook中roles的各种用法
环境预备
组件版本操作系统Ubuntu 22.04.4 LTSansible2.17.6基本用法
文件布局
- .
- ├── deploy.hosts
- ├── deploy.yaml
- └── roles
- └── base
- └── tasks
- └── main.yaml
复制代码 界说全局公共变量
新增group_vars目录,并且新增文件- .
- ├── deploy.hosts
- ├── deploy.yaml
- ├── group_vars
- │ └── all.yaml
- └── roles
- └── base
- └── tasks
- └── main.yaml
复制代码- ▶ cat group_vars/all.yaml
- info: IT paiqiu
复制代码- ▶ cat roles/base/tasks/main.yaml
- - name: first
- debug:
- msg: "hello world {{ info }}"
复制代码 运行:- ▶ ansible-playbook -i deploy.hosts deploy.yaml
- ...
- TASK [base : first] **********************************************************************************************
- ok: [10.22.11.166] => {
- "msg": "hello world IT paiqiu"
- }
- ...
复制代码 界说role级变量
可以覆盖全局变量
在role base 下面新增vars目录,并且新增main.yaml文件- .
- ├── deploy.hosts
- ├── deploy.yaml
- ├── group_vars
- │ └── all.yaml
- └── roles
- └── base
- ├── tasks
- │ └── main.yaml
- └── vars
- └── main.yaml
复制代码- ▶ cat roles/base/tasks/main.yaml
- - name: first
- debug:
- msg: "hello world {{ info }}"
复制代码- ▶ cat roles/base/vars/main.yaml
- info:
- name: wilson
- addr: cd
复制代码 运行:- ▶ ansible-playbook -i deploy.hosts deploy.yaml
- ...
- TASK [base : first] **********************************************************************************************
- ok: [10.22.11.166] => {
- "msg": "hello world {'name': 'wilson', 'addr': 'cd'}"
- }
- ...
复制代码 界说静态文件目录
相当于界说role级别的根目录,更好的管理需要传输的文件,在role base下面创建目录files,并且在files下面放入需要传输的文件test.img- .
- ├── deploy.hosts
- ├── deploy.yaml
- ├── group_vars
- │ └── all.yaml
- └── roles
- └── base
- ├── files
- │ └── test.img
- ├── tasks
- │ └── main.yaml
- └── vars
- └── main.yaml
复制代码 传输test.img至目的机器- - name: first
- copy: src=test.img dest=/tmp/test.img
复制代码 test.img默认回去roles/base/files当中寻找,所以前面不需要添加路径
copy模块会主动查抄待传输文件的md5,如果没有变化,那就不会再传输了
界说模版
每次传输文件都会通过输入的变量重新渲染之后再传输,在role base下面创建目录templates,并且创建文件 test.conf- .
- ├── deploy.hosts
- ├── deploy.yaml
- ├── group_vars
- │ └── all.yaml
- └── roles
- └── base
- ├── files
- │ └── test.img
- ├── tasks
- │ └── main.yaml
- ├── templates
- │ └── test.conf
- └── vars
- └── main.yaml
复制代码 在模版文件中界说了两个变量,一个是手动设置的变量version,一个是ansible内建变量inventory_hostname- ▶ cat roles/base/templates/test.conf
- {{ version }}
- {{ inventory_hostname }}
复制代码- ▶ cat roles/base/tasks/main.yaml
- - name: first
- template: src=test.conf dest=/tmp/test.conf mode=0644
复制代码 运行:- ▶ ansible-playbook -i deploy.hosts -e version=2 deploy.yaml
- PLAY [deploy] ****************************************************************************************************
- TASK [base : first] **********************************************************************************************
- changed: [10.22.11.166]
- PLAY RECAP *******************************************************************************************************
- 10.22.11.166 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
复制代码 登录到目的机器查看:- ▶ cat test.conf
- 2
- 10.22.11.166
复制代码 2是本次任务传入的变量,10.22.11.166则是目的机器的ip地点
界说变乱驱动
通常用于某些任务完成之后需要触发的动作,比如:发布完某个配置文件之后需要重启服务。在role base下创建目录handlers,并创建文件main.yaml- .
- ├── deploy.hosts
- ├── deploy.yaml
- ├── group_vars
- │ └── all.yaml
- └── roles
- └── base
- ├── files
- │ └── test.img
- ├── handlers
- │ └── main.yaml
- ├── tasks
- │ └── main.yaml
- ├── templates
- │ └── test.conf
- └── vars
- └── main.yaml
复制代码 创建变乱first handler- ▶ cat roles/base/handlers/main.yaml
- - name: first handler
- debug:
- msg: echo 'hello world'
复制代码- ▶ cat roles/base/tasks/main.yaml
- - name: first
- template: src=test.conf dest=/tmp/test.conf mode=0644 notify: first handler
复制代码 运行:- ▶ ansible-playbook -i deploy.hosts -e version=2 deploy.yaml
- PLAY [deploy] ****************************************************************************************************
- TASK [base : first] **********************************************************************************************
- changed: [10.22.11.166]
- RUNNING HANDLER [base : first handler] ***************************************************************************
- ok: [10.22.11.166] => {
- "msg": "echo 'hello world'"
- }
- PLAY RECAP *******************************************************************************************************
- 10.22.11.166 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
复制代码 同样的,如果变乱前驱没有发生,那变乱关照也不会发生了,比如变乱前驱是传输一个文件,如果文件没有变化,就不会再传输,那变乱也不会再发生了
新增更多的task任务
当前只有main.yaml,在增长一个专门用于传输文件的任务files.yaml- ▶ cat roles/base/tasks/main.yaml
- - name: main
- include_tasks: files.yaml
- vars:
- app_version: 0.2
复制代码- ▶ cat roles/base/tasks/files.yaml
- - name: first
- debug:
- msg: "version: {{ app_version }}"
复制代码 运行:- ▶ ansible-playbook -i deploy.hosts deploy.yaml
- PLAY [deploy] ****************************************************************************************************
- TASK [base : main] ***********************************************************************************************
- included: /home/wilson/workspace/ansible/roles/base/tasks/files.yaml for 10.22.11.166
- TASK [base : first] **********************************************************************************************
- ok: [10.22.11.166] => {
- "msg": "version: 0.2"
- }
- PLAY RECAP *******************************************************************************************************
- 10.22.11.166 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
复制代码 如果文件过多,可以通过循环来处理:- - name: main
- include_tasks: "{{ yaml_items }}"
- loop:
- - files.yaml
- - packages.yaml
- loop_control:
- loop_var: yaml_items
- vars:
- app_version: 0.2
复制代码 增补一下常用的命令
执行命令 shell
- - name: display
- shell: echo 'hello world'
复制代码 传输文件 copy
copy模块会主动查抄待传输文件的md5,如果没有变化,那就不会再传输了- - name: copy file
- copy: src=test.img dest=/tmp/test.img
复制代码 修改文件内容(一行) lineinfile
- path: 指定要操作的文件路径(必填)
- line: 界说要插入或替换的完整行内容(可选)
- regexp: 用于匹配现有行的正则表达式。与 line 共同使用,匹配的行将被替换
- state:
- present(默认):确保指定行存在
- absent:移除匹配的行
- create: 如果文件不存在,是否创建文件(默认 yes)
- insertafter: 指定插入行的位置(默认 EOF)
- EOF:文件末尾
- BOF:文件开头
- 正则表达式:在匹配行之后插入
insertbefore: 和 insertafter 类似,但在匹配行之前插入
通过正则匹配行之后修改当前行- - name: modify
- lineinfile: dest=/tmp/test.txt regexp='^DC' line="DC=hello" state=present
复制代码 修改文件内容(多行/块) blockinfile
- path: 指定要操作的文件路径(必填)
- block: 界说要插入的文本内容(必填)
- marker: 指定标志块的开始和结束字符串,默以为 # {mark} ANSIBLE MANAGED BLOCK
- state:
- present(默认):确保块存在
- absent:移除块
- create: 如果文件不存在,是否创建文件(默认 yes)
- insertafter: 指定插入块的位置(默认 EOF)
- 可用值:
- EOF:文件末尾
- BOF:文件开头
- 正则表达式:在匹配行之后插入
- insertbefore: 和 insertafter 类似,但是在匹配行之前插入
1)在某一行下面增长新的内容,并且将增长的内容打上标志- - name: add new content with markers
- blockinfile:
- path: /tmp/test.txt
- marker: "# {mark} by wilson"
- insertafter: '^DC'
- block: |
- name: wilson
- city: cd
复制代码 运行之后查看效果- ▶ cat /tmp/test.txt
- DC=hello
- # BEGIN by wilson
- name: wilson
- city: cd
- # END by wilson
复制代码 2)删除已标志的内容- - name: Remove the managed block
- blockinfile:
- marker: "# {mark} by wilson"
- path: /tmp/test.txt
- state: absent
复制代码 添加内容块打上标志之后会让修改与删除都变得非常方便
使用模版
- - name: hostname config
- template: src=etc/hostname dest=/etc/hostname
复制代码 设置文件权限 file
- - name: change file 755
- file:
- path: /tmp/test.txt
- owner: wilson
- group: wilson
- state: file
- mode: 755
复制代码 使用循环 with_items
with_items
给多个目录修改权限- - name: change directory 755
- file:
- path: '{{ item.dir }}'
- owner: wilson
- group: wilson
- state: directory
- mode: '{{ item.mode }}'
- with_items:
- - { dir: '/tmp/1', mode: '0755'}
- - { dir: '/tmp/2', mode: '0755'}
复制代码 loop
当然使把with_items 替换成 loop也是可以的- - name: change directory 755
- file:
- path: '{{ item.dir }}'
- owner: wilson
- group: wilson
- state: directory
- mode: '{{ item.mode }}'
- with_items:
- - { dir: '/tmp/1', mode: '0755'}
- - { dir: '/tmp/2', mode: '0755'}
复制代码 嵌套循环 with_nested
输出每一种组合,相当于笛卡尔积- - name: nested loop
- debug:
- msg: "{{ item[0] }} {{ item[1] }}"
- with_nested:
- - [ "hello1", "hello2"]
- - [ "world1", "world2"]
复制代码 输出效果:- TASK [base : nested loop] ****************************************************************************************
- ok: [127.0.0.1] => (item=['hello1', 'world1']) => {
- "msg": "hello1 world1"
- }
- ok: [127.0.0.1] => (item=['hello1', 'world2']) => {
- "msg": "hello1 world2"
- }
- ok: [127.0.0.1] => (item=['hello2', 'world1']) => {
- "msg": "hello2 world1"
- }
- ok: [127.0.0.1] => (item=['hello2', 'world2']) => {
- "msg": "hello2 world2"
- }
复制代码 文件内容循环 with_file
逐行打印文件内容- - name: display file content
- debug:
- msg: "{{ item }}"
- with_file:
- - /tmp/test.txt
复制代码 幂等性
使用roles去管理多设备的时候,编写脚本需要时候注意幂等性,即每一次执行都要包管同样的效果
联系我
联系我,做深入的交流
至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |