详解ansible批量管理服务

1 ansible-playbook 任务剧本

1.1 剧本文件概念

(1)playbook可以将多个批量操作模块功能整合,完成一件事情。(2)简化运维工作复杂度(3)playbook通过yaml语法识别描述的状态文件,扩展名是yaml

1.2 剧本文件组成部分

(1)剧本的角色(hosts)定义的是主机信息(2)剧本的任务(tasks)定义的是具体任务信息(3)一个剧本文件有多个hosts组成,一个hosts可以包含多个tasks任务

1.3 剧本文件优势特点

(1)实现自动化功能更加全面(2)可以更好的控制逻辑关系(3)剧本展现命令语法更直观(4)拥有持久反复执行的特性

1.4 剧本文件编写规范

(1)缩进特点: 两个空格表示一个缩进关系(2)冒号用法: 冒号后面需要有空格 冒号结尾不需要有空格主机信息: 172.16.1.41 --- key: value (键值写法) (3)列表用法: 利用短横线加空格构建列表清单

1.5 剧本执行使用方法

(1)检查剧本语法:ansible-playbook --syntax-check test.yaml (2)剧本模拟执行:ansible-playbook -C test.yaml (3)剧本真实运行:ansible-playbook test.yaml

1.6 剧本编写扩展功能

(1)剧本变量编写功能(2)剧本信息通知功能(3)剧本信息判断功能(4)剧本信息循环功能(5)剧本编写忽略错误(6)剧本标签设置功能(7)剧本忽略采集功能(8)剧本信息触发功能

1.6.1 剧本变量编写功能

设置变量方法一: 在剧本执行命令参数中设置变量,命令行最优先

[root@m01 ansible_playbook]#ansible-playbook -e dir=/etc -e file=rsyncd.conf test_变量编写.yaml

设置变量方法二: 在剧本中设置变量,剧本变量其次优先

[root@m01 ansible_playbook]#vim test_变量编写.yaml
- hosts: 172.16.1.41
 vars:
 dir: /etc
 file: rsyncd.conf
 tasks:
 - name: copy file
  copy: src={{ dir }}/{{ file }} dest={{ dir }}/
# {{}}调用变量

设置变量方法二: 在主机清单中设置变量,主机清单变量最不优先

[root@m01 ansible_playbook]#vim /etc/ansible/hosts
[sersync_server]
172.16.1.31
[sersync_client]
172.16.1.41
[sersync_server:vars]
dir=/etc
file=rsyncd.conf
# 直接给主机组设置变量,这样主机组内的所有主机都可以调用变量了

1.6.2 剧本信息通知功能

编辑剧本

[root@m01 ansible_playbook]#vim test_通知功能.yaml
- hosts: 172.16.1.41
 tasks:
 - name: boot server
  service: name=rsyncd state=started
 - name: check server boot
  shell: netstat -lntup|grep 873
  register: oldboy
 - debug: msg={{ oldboy.stdout_lines }}
# 将shell中命令执行结果通过register注册给oldboy,oldboy相当于一个变量,{{}}调取oldboy
# debug类似echo,输出信息
# stdout_lines 将输出的信息变得有格式

运行剧本

[root@m01 ansible_playbook]#ansible-playbook test_通知功能.yaml 

PLAY [172.16.1.41] ***********************************************************************************

TASK [Gathering Facts] *******************************************************************************
ok: [172.16.1.41]

TASK [boot server] ***********************************************************************************
ok: [172.16.1.41]

TASK [check server boot] *****************************************************************************
changed: [172.16.1.41]

TASK [debug] *****************************************************************************************
ok: [172.16.1.41] => {
 "msg": [
  "tcp  0  0 0.0.0.0:873    0.0.0.0:*    LISTEN  3708/rsync   ",
  "tcp6  0  0 :::873     :::*     LISTEN  3708/rsync   "
 ]
}

PLAY RECAP *******************************************************************************************
172.16.1.41    : ok=4 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

1.6.3 剧本信息判断功能

nfs服务客户端三台主机
centos7 10.0.0.7、centos6 10.0.0.8、centos7 10.0.0.9
此时在批量启动的时候需要进行判断,因为centos6,centos7启动命令不一样
判断的格式
- hosts: nfs_client
tasks:
- name: boot centos7 nfs
shell: systemctl start nfs
判断: 如果是centos7 ???
- name: boot centos6 nfs
shell: /etc/init.d/nfs start
判断: 如果是centos6 ???

setup模块:收集远程主机信息
语法:
[root@m01 ansible_playbook]#ansible 172.16.1.41 -m setup -a "filter=ansible_hostname"
172.16.1.41 | SUCCESS => {
 "ansible_facts": {
  "ansible_hostname": "backup",
  "discovered_interpreter_python": "/usr/bin/python"
 },
 "changed": false
}

# filter 过滤 筛选

实现收集子信息的方法

问题: 获取主机信息,以及子信息

方法一:

- hosts: rsync
 tasks:
 - name: touch file
  file: path=/etc/oldboy01.txt state=touch
  when: (ansible_eth1.ipv4.address == "172.16.1.41")

方法二:

- hosts: rsync
 tasks:
 - name: touch file
  file: path=/etc/oldboy01.txt state=touch
  when: (ansible_eth1["ipv4"]["address"] == "172.16.1.41")

setup模块常用来收集的信息

根据 ip 地址进行判断创建目录

[root@m01 ansible_playbook]#vim test_判断功能.yaml
- hosts: nfs_client
 tasks:
 - name: create file for 41 host
  file: path=/tmp/172.16.1.41 state=directory
  when: (ansible_hostname == "backup")
 - name: create file for 7 host
  file: path=/tmp/172.16.1.7 state=directory
  when: (ansible_hostname == "web01")

运行剧本

root@m01 ansible_playbook]#ansible-playbook -C test_判断功能.yaml 

PLAY [nfs_client] ************************************************************************************

TASK [Gathering Facts] *******************************************************************************
ok: [172.16.1.41]
ok: [172.16.1.7]

TASK [create file for 41 host] ***********************************************************************
skipping: [172.16.1.7]
changed: [172.16.1.41]

TASK [create file for 7 host] ************************************************************************
skipping: [172.16.1.41]
changed: [172.16.1.7]

PLAY RECAP *******************************************************************************************
172.16.1.41    : ok=2 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
172.16.1.7     : ok=2 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 

1.6.4 剧本信息循环功能

循环创建多个用户

[root@m01 ansible_playbook]#vim test_循环功能.yaml
- hosts: 172.16.1.41
 tasks:
 - name: create user
  user: name={{ item }}
  with_items:
  - oldgirl01
  - oldgirl02
  - oldgirl03
  - oldgirl04
  - oldgirl05

循环创建多个用户 多个用户uid数值是不同的

[root@m01 ansible_playbook]#vim test_循环功能.yaml
- hosts: 172.16.1.41
 tasks:
 - name: create user
  user: name={{ item.name }} uid={{ item.uid }}
  with_items:
  - {name: "oldgirl06", uid: "3006"}
  - {name: "oldgirl07", uid: "3007"}
  - {name: "oldgirl08", uid: "3008"}
  - {name: "oldgirl09", uid: "3009"}
  - name: check create user info
   shell: grep oldgirl0 /etc/passwd
   register: user_info
  - debug: msg={{ user_info.stdout_lines }}

1.6.5 剧本编写忽略错误功能

忽略功能主要用来调试剧本

[root@m01 ansible_playbook]#vim test_h忽略功能.yaml
- hosts: 172.16.1.41
 tasks:
 - name: create rsync user
  shell: useradd rsync -M -s /sbin/nologin
  ignore_errors: yes
 - name: create backup dir
  shell: mkdir /backup
  ignore_errors: yes
 - name: boot server
  shell: systemctl start rsyncd
  ignore_errors: yes

在使用shell进行一些操作时,shell产生的结果已经存在时,会导致剧本无法进行下去,因此使用忽略功能可以有效的使剧本进行下去。

1.6.6 剧本标签设置功能

标签功能主要用来调试剧本

tags:标签

[root@m01 ansible_playbook]#vim test_标签功能.yaml
- hosts: 172.16.1.41
 tasks:
 - name: 01:安装软件
  yum: name=rsync state=installed
  ignore_errors: yes
 - name: 02:创建用户
  user: name=rsync create_home=no shell=/sbin/nologin
  ignore_errors: yes
  tags: create_user
 - name: 03:创建目录
  file: path=/backup state=directory

运行剧本

ansible-playbook -t create_user test_标签功能.yaml    --- 执行剧本中标签任务
ansible-playbook --skip-tags create_user test_标签功能.yaml --- 跳过指定标签任务,执行其他任务
ansible-playbook -t create_user,create_dir test_标签功能.yaml --- 执行多个标签
# -t=tags

1.6.7 剧本忽略采集功能

[

root@m01 ansible_playbook]#vim test_忽略采集.yaml
- hosts: 172.16.1.41
 gather_facts: no
 tasks:
 - name: 01:安装软件
  yum: name=rsync state=installed
  ignore_errors: yes
 - name: 02:创建用户
  user: name=rsync create_home=no shell=/sbin/nologin
  ignore_errors: yes
  tags: create_user
 - name: 03:创建目录
  file: path=/backup state=directory
  tags: create_dir 

当剧本采集大量主机信息时,可能会变得卡,慢,影响剧本后面的操作执行的效率。所以在这个时候,可以忽略采集功能,提高效率,在hosts下面添加 gather_facts: no 如果剧本中有判断功能,不能使用此参数,因为采集的信息会与判读信息对比

1.6.8 剧本信息触发功能

编写剧本

[root@m01 ansible_playbook]#vim test_触发功能.yaml
- hosts: 172.16.1.41
 tasks:
 - name: 01:传输配置文件
  copy: src=/etc/ansible/ansible_playbook/rsyncd.conf dest=/etc/
  notify: rsync_restart
 - name: 02:启动服务程序
  service: name=rsyncd state=started
 handlers:
 - name: rsync_restart
  service: name=rsyncd state=restarted

handlers:一般用于配置文件修改时,才会进行触发功能,对服务进行重启 notify:传输配置文件过来,notify通知rsync_restart这个触发器。然后handlers会进行重启服务说明: 整体任务执行完毕,才会执行触发功能

1.7 编写剧本练习题

要求:

(1)在172.16.1.41主机上操作: ①将定时任务服务停止 ②创建一个/etc/目录软连接 在/opt目录中生成 ③将本地/etc/hosts文件分发给41主机 保存到/tmp目录中(2)在172.16.1.31主机上操作: ①将防火墙服务开机自动运行 ②将主机上安装keepalived软件

实践:

编写剧本文件

[root@m01 ansible_playbook]#vim test.yaml
- hosts: 172.16.1.41
 tasks:
 - service: name=crond state=stopped
 - file: src=/etc path=/opt/etc_link state=link
 - copy: src=/etc/hosts dest=/tmp
- hosts: 172.16.1.31
 tasks:
 - service: name=firewalld enabled=yes
 - yum: name=keepalived state=installed

剧本语法检查

# 语法检查剧本文件
[root@m01 ansible_playbook]#ansible-playbook --syntax-check test.yaml
playbook: test.yaml

剧本模拟执行

[root@m01 ansible_playbook]#ansible-playbook -C test.yaml

PLAY [172.16.1.41] ***********************************************************************************

TASK [Gathering Facts] *******************************************************************************
ok: [172.16.1.41]

TASK [service] ***************************************************************************************
ok: [172.16.1.41]

TASK [file] ******************************************************************************************
ok: [172.16.1.41]

TASK [copy] ******************************************************************************************
ok: [172.16.1.41]

PLAY [172.16.1.31] ***********************************************************************************

TASK [Gathering Facts] *******************************************************************************
ok: [172.16.1.31]

TASK [service] ***************************************************************************************
ok: [172.16.1.31]

TASK [yum] *******************************************************************************************
ok: [172.16.1.31]

PLAY RECAP *******************************************************************************************
172.16.1.31    : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.16.1.41    : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

剧本真实执行

[root@m01 ansible_playbook]#ansible-playbook test.yaml

PLAY [172.16.1.41] ***********************************************************************************

TASK [Gathering Facts] *******************************************************************************
ok: [172.16.1.41]

TASK [service] ***************************************************************************************
ok: [172.16.1.41]

TASK [file] ******************************************************************************************
ok: [172.16.1.41]

TASK [copy] ******************************************************************************************
ok: [172.16.1.41]

PLAY [172.16.1.31] ***********************************************************************************

TASK [Gathering Facts] *******************************************************************************
ok: [172.16.1.31]

TASK [service] ***************************************************************************************
ok: [172.16.1.31]

TASK [yum] *******************************************************************************************
ok: [172.16.1.31]

PLAY RECAP *******************************************************************************************
172.16.1.31    : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.16.1.41    : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

补充:

如果系统中装有cowsay软件,在执行命令时,会产生图案信息,影响查阅结果,可以关闭。

[root@m01 ansible]#vim ansible.cfg
# don't like cows? that's unfortunate.
# set to 1 if you don't want cowsay support or export ANSIBLE_NOCOWS=1
# nocows = 1
把# nocows = 1 中的 # 去掉即可。

1.8 ansible剧本实现rsync一键化部署

第一个历程: 按照模块方式,完成服务每个步骤部署

第一步:服务端配置

# 安装软件程序
ansible rsync -m yum -a "name=rsync state=installed"
# 编写配置文件:要在批量管理主机上提前写好,然后推送给服务端
# 在管理端准备好服务配置文件
ansible rsync_server -m copy -a "src=/etc/ansible/conf_file/rsyncd.conf dest=/etc/"
# 创建虚拟用户
ansible rsync_server -m user -a "name=rsync create_home=no shell=/sbin/nologin"
# 创建密码文件 (授权600)
ansible rsync_server -m copy -a "content='rsync_backup:oldboy123' dest=/etc/rsync.password mode=600"
# 创建备份目录 (授权 属主 属组)
ansible rsync_server -m file -a "path=/backup state=directory owner=rsync group=rsync"
@ 启动程序服务
ansible rsync_server -m service -a "name=rsyncd state=started enabled=yes"

第二步:客户端配置

# 创建密钥文件 (授权600)
ansible rsync_client -m copy -a "content='oldboy123' dest=/etc/rsync.password mode=600"
# 批量测试传输文件
ansible rsync_client -m shell -a "rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password"

第二个历程: 编写剧本信息

[root@m01 ansible_playbook]#vim rsync_auto.yaml
- hosts: rsync_server
 tasks:
  - name: 01:install rsync
   yum: name=rsync state=installed
  - name: 02:copy conf file
   copy: src=/etc/ansible/conf_file/rsyncd.conf dest=/etc/
  - name: 03:create rsync user
   user: name=rsync create_home=no shell=/sbin/nologin
  - name: 04:create password file
   copy: content='rsync_backup:oldboy123' dest=/etc/rsync.password mode=600
  - name: 05:create backup dir
   file: path=/backup state=directory owner=rsync group=rsync
  - name: 06:boot rsync server
   service: name=rsyncd state=started enabled=yes

- hosts: rsync_client
 tasks:
  - name: 01:create password file
   copy: content='oldboy123' dest=/etc/rsync.password mode=600

恢复环境剧本

[root@m01 ansible_playbook]#vim rsync_backup.yaml
- hosts: rsync_server
 tasks:
  - name: 01:delete conf file
   file: path=/etc/rsyncd.conf state=absent
  - name: 02:delete rsync user
   user: name=rsync state=absent
  - name: 03:delete password file
   file: path=/etc/rsync.password state=absent
  - name: 04:delete backup dir
   file: path=/backup/ state=absent
  - name: 05:boot rsync server
   service: name=rsyncd state=stopped enabled=no

- hosts: rsync_client
 tasks:
  - name: 01:delete password file
   file: path=/etc/rsync.password state=absent

1.9 ansible剧本实现nfs一键化部署

第一个历程: 按照模块方式,完成服务每个步骤部署

服务端配置

01. 安装部署软件程序: rpcbind nfs-utile

ansible nfs_server -m yum -a "name=rpcbind state=installed"
ansible nfs_server -m yum -a "name=nfs-utile state=installed"

02. 编写配置文件:配置文件要提前写好

# 批量管理主机写好的配置文件推送给服务端/etc/ansible-playbook/nfs.conf
ansible nfs_server -m copy -a "src=/etc/ansible/ansible_playbook/nfs.conf dest=/etc/exports"

03. 创建共享目录:

ansible nfs_server -m file -a "path=/data/ state=directory owner=nfsnobody group=nfsnobody"

04. 启动程序服务:

ansible nfs_server -m service -a "name=rpcbind state=started enabled=yes"
ansible nfs_server -m service -a "name=nfs state=started enabled=yes"

客户端配置:

01. 安装部署软件

ansible nfs_client -m yum -a "name=nfs-utile state=installed"

02. 挂载共享目录

ansible nfs_client -m mount -a "src=172.16.1.31:/data/ path=/mnt fstype=nfs state=mounted"

第二个历程编写剧本:

[root@m01 ansible_playbook]#vim nfs_auto.yaml
- hosts: nfs_server
 tasks:
  - name: 1:install rpcbind nsf-utils
   yum:
    name:
     - rpcbind
     - nfs-utils
    state: installed
  - name: 2:copy conf file
   copy: src=/etc/ansible/ansible_playbook/nfs.conf dest=/etc/exports
  - name: 3:create data dir
   file: path=/data/ state=directory owner=nfsnobody group=nfsnobody
  - name: 4:boot server rcbind
   service: name=rpcbind state=started enabled=yes
  - name: 4:boot server nfs
   service: name=nfs state=restarted enabled=yes
- hosts: nfs_client
 tasks:
  - name: 1:install nfs
   yum: name=nfs-utils state=installed
  - name: 2:mount data dir
   mount: src=172.16.1.31:/data/ path=/mnt fstype=nfs state=mounted

恢复环境剧本

[root@m01 ansible_playbook]#vim nfs_backup.yaml
- hosts: nfs_server
 tasks:
  - name: 01:install rpcbind nfs-utils
   yum:
    name:
     - rpcbind
     - nfs-utils
    state: removed
  - name: 02:copy conf file
   shell: echo "" >/etc/exports
  - name: 03:create data dir
   file: path=/data/ state=absent
- hosts: nfs_client
 tasks:
  - name: 01:install nfs
   yum: name=nfs-utils state=removed
  - name: 02:mount data dir
   mount: src=172.16.1.31:/data/ path=/mnt fstype=nfs state=unmounted

优化剧本:

[root@m01 ansible_playbook]#vim nfs_auto.yaml
- hosts: nfs_server
 vars:
  conf_file: exports
  data_dir: /data
 tasks:
  - name: 01:install nfs rpcbind
   yum:
    name: ['nfs-utils', 'rpcbind']
    state: installed
  - name: 02:copy conf file
   copy: src=/etc/ansible/ansible_playbook/nfs.conf dest=/etc/{{ conf_file }}
   notify:
    - nfs_restart
  - name: 03:create data dir
   file: path={{ data_dir }} state=directory owner=nfsnobody group=nfsnobody
  - name: 04:boot server rpcbind
   service: name={{ item.name }} state={{ item.state }} enabled={{ item.enabled }}
   with_items:
    - {name: "rpcbind", state: "started", enabled: "yes"}
    - {name: "nfs",   state: "started", enabled: "yes"}
 handlers:
  - name: nfs_restart
   service: name=nfs state=reloaded
- hosts: nfs_client
 vars:
  data_dir: /data
 tasks:
  - name: 01:install nfs
   yum: name=nfs-utils state=installed
  - name: 02:mount data dir
   mount: src=172.16.1.31:{{ data_dir }} path=/mnt fstype=nfs state=mounted
  - name: 03:check mount info
   shell: df -h|grep mnt
   register: mount_info
  - debug: msg={{ mount_info.stdout_lines }}

1.10 ansible剧本实现sersync一键化部署

第一个历程: 按照模块方式,完成服务每个步骤部署配置hosts主机清单

[server_server]
172.16.1.31
[server_client]
172.16.1.41

#安装rsync
ansible backup_server -m yum -a "name=rsync state=installed"
#在批量管理主机上下载sersync,解压发送给客户端
ansible backup_server -m file -a "src=/usr/local/sersync_installdir_64bit/sersync dest=/usr/local"
#在批量管理主机上写好sersync配置文件,发送给客户端
ansible backup_server -m copy -a "src=/usr/local/sersync_installdir_64bit/sersync/conf/confxml.xml dest=/usr/local/sersync/conf/"
#给sersync加上执行权限
ansible backup_server -m file -a "path=/usr/local/sersync/bin/sersync mode=a+x"
#给sersync创建软链接
ansible backup_server -m file -a "src=/usr/local/sersync/bin/sersync path=/usr/local/sbin/sersync state=link"
#启动sersync 测试实时同步
ansible backup_server -m shell -a "sersync -dro /usr/local/sersync/conf/confxml.xml"

第二个历程,编写剧本

[root@m01 ansible_playbook]#vim sersync_auto.yaml
- hosts: sersync_server
 tasks:
  - name: 安装rsync
   yum: name=rsync state=installed
  - name: 将sersync传输到客户端
   file: src=/usr/local/sersync_installdir_64bit/sersync/ dest=/usr/local
  - name: 将写好的配置文件传输到客户端
   copy: src=/usr/local/sersync_installdir_64bit/sersync/conf/confxml.xml dest=/usr/local/sersync/conf/
  - name: 加上执行权限
   file: path=/usr/local/sersync/bin/sersync mode=a+x
  - name: 创建软链接
   file: src=/usr/local/sersync/bin/sersync path=/usr/local/sbin/sersync state=link
  - name: 启动sersync 测试实时同步
   shell: sersync -dro /usr/local/sersync/conf/confxml.xml

恢复环境剧本

[root@m01 ansible_playbook]#cat sersync_backup.yaml
- hosts: sersync_server
 tasks:
  - name: 卸载rsync
   yum: name=rsync state=removed
  - name: 删除sersync
   file: path=/usr/local/sersync

2 多个剧本如何进行整合

第一个历程: 确保每个剧本执行成功第二个历程: 进行剧本整合方法一:不建议使用

[root@m01 ansible_playbook]#vim zhenghe.yaml # ---角色里使用
- hosts: all
 remote_user: root
 tasks:
  - include_tasks: nfs_auto.yml
  - include_tasks: rsync_auto.yml
# 不写hosts信息,只写任务信息

方法二:在以后的ansible中可能会取消include功能

[root@m01 ansible_playbook]#vim zhenghe.yaml
- include:nfs_auto.yml
- include:rsync_auto.yml

方法三:建议使用这个方法

[root@m01 ansible_playbook]#vim zhenghe.yaml
- import_playbook: nfs_auto.yaml
- import_playbook: rsync_auto.yaml

3 ansible剧本编写方式:角色

(1)规范ansible程序目录结构(2)汇总剧本中有定义的主机信息

3.1 角色调用流程图

3.2 nfs服务角色编写

第一个历程: 创建角色目录结构

cd roles/;mkdir {nfs,rsync,web,sersync}
cd nfs/{vars,tasks,templates,handlers,files}
# vars:   定义变量信息
# tasks:   定义任务信息
# templates: 定义模板文件(jinja2模板文件)
# handlers: 定义触发器信息
# files:   定义需要分发的文件

第二个历程: 编写文件信息 tasks: 任务信息编写方式一: nfs服务编写

vim main.yaml
- name: 01:install nfs rpcbind
 yum:
  name: ['nfs-utils', 'rpcbind']
  state: installed
- name: 02:copy conf file
 copy: src=/etc/ansible/ansible_playbook/nfs.conf dest=/etc/{{ conf_file }}
 notify:
  - nfs_restart
- name: 03:create data dir
 file: path={{ data_dir }} state=directory owner=nfsnobody group=nfsnobody
- name: 04:boot server rpcbind
 service: name={{ item.name }} state={{ item.state }} enabled={{ item.enabled }}
 with_items:
  - {name: "rpcbind", state: "started", enabled: "yes"}
  - {name: "nfs",   state: "started", enabled: "yes"}
- name: 01:install nfs
 yum: name=nfs-utils state=installed
- name: 02:mount data dir
 mount: src=172.16.1.31:{{ data_dir }} path=/mnt fstype=nfs state=mounted
- name: 03:check mount info
 shell: df -h|grep mnt
 register: mount_info
- debug: msg={{ mount_info.stdout_lines }}

tasks: 任务信息编写方式二: tasks:定义任务信息

cd tasks
vim main.yaml
vim nfs_boot.yaml
vim nfs_conf.yaml
vim nfs_datadir.yaml
vim nfs_install.yaml
vim nfs_mount.yaml
#########################
vim main.yaml
- include_tasks: nfs_install.yaml
- include_tasks: nfs_conf.yaml
- include_tasks: nfs_datadir.yaml
- include_tasks: nfs_boot.yaml
- include_tasks: nfs_mount.yaml

vars:定义变量信息

vim main.yaml
conf_file: exports
data_dir: /data

files:定义需要分发的文件

[root@m01 files]# ll
total 4
-rw-r--r-- 1 root root 42 Jul 29 10:34 nfs.conf

handlers:定义触发器信息

vim main.yaml
- name: nfs_restart
service: name=nfs state=reloaded

总结

以上所述是小编给大家介绍的ansible批量管理服务 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • python ansible服务及剧本编写

    第1章 ansible软件概念说明 python语言是运维人员必会的语言,而ansible是一个基于Python开发的自动化运维工具 (saltstack).其功能实现基于SSH远程连接服务:ansible可以实现批量系统配置.批量软件部署.批量文件拷贝.批量运行命令等功能 ansible软件相关参考链接信息: http://docs.ansible.com/ansible/intro_installation.html http://www.ansible.com.cn/ http://doc

  • 在alpine镜像中添加ansible服务的方法

    使用apk add ansible即可在alpine镜像中添加ansible服务. 添加步骤 在alpine中使用ansible需要如下几步 Dockerfile 在Dockerfile中添加上面的语句: #update apk for install RUN apk update #install ansible and openssh RUN apk add ansible openssh #init ansible hosts file RUN mkdir -p /etc/ansible

  • 详解ansible批量管理服务

    1 ansible-playbook 任务剧本 1.1 剧本文件概念 (1)playbook可以将多个批量操作模块功能整合,完成一件事情.(2)简化运维工作复杂度(3)playbook通过yaml语法识别描述的状态文件,扩展名是yaml 1.2 剧本文件组成部分 (1)剧本的角色(hosts)定义的是主机信息(2)剧本的任务(tasks)定义的是具体任务信息(3)一个剧本文件有多个hosts组成,一个hosts可以包含多个tasks任务 1.3 剧本文件优势特点 (1)实现自动化功能更加全面(2

  • 详解Java虚拟机管理的内存运行时数据区域

    详解Java虚拟机管理的内存运行时数据区域 概述 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁. 程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基

  • 详解webpack模块化管理和打包工具

    本篇文章主要介绍了详解webpack模块化管理和打包工具,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 Webpack简介 webpack是当下最热门的前端资源模块化管理和打包工具. 它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源.还可以将按需加载的模块进行代码分隔,等到实际 需要的时候再异步加载.通过 loader  的转换,任何形式的资源都可以视作模块,比如 CommonJs 模块. AMD 模块. ES6 模块.CSS.图片. JSON.

  • 详解JAVA 内存管理

    前一段时间粗略看了一下<深入Java虚拟机 第二版>,可能是因为工作才一年的原因吧,看着十分的吃力.毕竟如果具体到细节的话,Java虚拟机涉及的内容太多了.可能再过一两年去看会合适一些吧. 不过看了一遍<深入Java虚拟机>再来理解Java内存管理会好很多.接下来一起学习下Java内存管理吧. 请注意上图的这个: 我们再来复习下进程与线程吧: 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调

  • 详解prometheus监控golang服务实践记录

    一.prometheus基本原理介绍 prometheus是基于metric采样的监控,可以自定义监控指标,如:服务每秒请求数.请求失败数.请求执行时间等,每经过一个时间间隔,数据都会从运行的服务中流出,存储到一个时间序列数据库中,之后可通过PromQL语法查询. 主要特点: 多维数据模型,时间序列数据通过metric名以key.value的形式标识: 使用PromQL语法灵活地查询数据: 不需要依赖分布式存储,各服务器节点是独立自治的: 时间序列的收集,通过 HTTP 调用,基于pull 模型

  • 详解Go语言微服务开发框架之Go chassis

    引言 https://github.com/go-chassis/go-chassis是一个微服务开发框架,而微服务开发框架带来的其中一个课题就是:当单体应用向微服务转型后,有大量的配置需要管理,而你并不希望登录到远端机器去更改配置,并重启应用,尤其是现在已经是容器的时代了,也不希望因为一个配置的变更,而发布一个新的软件包.那么分布式系统中每个进程的动态配置管理及运行时热加载就成为了一个亟待解决的问题.https://github.com/go-chassis/go-archaius为gocha

  • 详解Golang开启http服务的三种方式

    前言 都说go标准库实用,Api设计简洁.这次就用go 标准库中的net/http包实现一个简洁的http web服务器,包括三种版本. v1最简单版 直接使用http.HandleFunc(partern,function(http.ResponseWriter,*http.Request){}) HandleFunc接受两个参数,第一个为路由地址,第二个为处理方法. //v1 func main() { http.HandleFunc("/", func(w http.Respon

  • 详解Android项目多服务端接口适配(超简单)

    现状 Android项目如果是多服务端接口时,一般怎么弄呢? 方法1:服务器地址放在Header中 把服务器地址放在接口Header中,然后通过拦截器来动态修改请求地址而实现的.除了默认服务器的接口,其它都要加一个Header,有点麻烦.看起来也不爽,不简洁. interface ApiHeaderCase { /************************** server A ****************************/ @Headers("host:$SERVER_HOS

  • 详解mybatis批量插入10万条数据的优化过程

    数据库 在使用mybatis插入大量数据的时候,为了提高效率,放弃循环插入,改为批量插入,mapper如下: package com.lcy.service.mapper; import com.lcy.service.pojo.TestVO; import org.apache.ibatis.annotations.Insert; import java.util.List; public interface TestMapper { @Insert("") Integer test

  • 详解PHP调用Go服务的正确方式

    问题 服务耦合 我们在开发过程中可能会遇到这样的情况: 进程依赖于某服务,所以把服务耦合在进程代码中: 服务初始化耗时长,拖慢了进程启动时间: 服务运行要占用大量内存,多进程时内存损耗严重. 文本匹配服务,它是消息处理流程中的一环,被多个消息处理进程依赖,每次初始化进程要 6秒 左右时间构造 Trie 树,而且服务读取关键词大文件.使用树组构造 Trie 树,会占用大量(目前设置为 256M )内存. 我已经把进程写成了守护进程的形式,让它们长时间执行,虽然不用更多地考虑初始化时间了,但占用内存

随机推荐