剧本的扩展功能配置

主机名称和IP地址规划

服务 主机名 eth0网卡IP eth1网卡IP 软件
防火墙服务器 firewalld 10.0.0.81 172.16.1.81 firewalld
负载均衡服务器 lb01 10.0.0.5 172.16.1.5 nginx,keepalived
负载均衡服务器 lb02 10.0.0.6 172.16.1.6 nginx,keepalived
web服务器 web01 10.0.0.7 172.16.1.7 nginx
web服务器 web02 10.0.0.8 172.16.1.8 nginx
web服务器 web03 10.0.0.9 172.16.1.9 nginx
存储服务器 nfs01 10.0.0.31 172.16.1.31 nfs
备份服务器 backup 10.0.0.41 172.16.1.41 rsync
数据库服务器 db01 10.0.0.51 172.16.1.51 mysql,mariaDB
批量管理服务器 m01 10.0.0.61 172.16.1.61 ansible
跳板机服务器 jumpserver 10.0.0.71 172.16.1.71 jumpserver
监控服务器 zabbix 10.0.0.72 172.16.1.72 zabbix
缓存服务器 暂无 暂无 暂无 暂无

在剧本中设置循环信息

  • 单变量循环
- hosts: 172.16.1.31
  tasks:
    - name: touch
      copy: content='1997sty' dest={{item}}
      with_items:
      - /tmp/1997sty1
      - /tmp/1997sty2
  • 数组形式(测试的时候不能直接填写路径,所以这里用yum命令举例)
- hosts: 172.16.1.31
  tasks:
    - name: install
      yum:
        name: ['rsync', 'tree', 'wget']
        state: installed
  • 多变量循环
- hosts: 172.16.1.31
  tasks:
    - name: touch
      copy: content={{item.text}} dest={{item.dir}}
      with_items:
      - {text: '1997sty1',dir: '/tmp/1997sty1'}
      - {text: '1997sty2',dir: '/tmp/1997sty2'}

剧本执行出现错误排查思路/步骤

  1. 找到剧本中出现问题关键点
  2. 将剧本中的操作转换成模块进行操作
  3. 将模块的功能操作转换成linux命令
  4. 本地管理主机上执行命令测试
  5. 远程被管理主机上执行命令测试

在剧本中设置忽略错误

  • ignore_errors: yes
- hosts: 172.16.1.31
  tasks:
    - name: install
      # echo 123 -> cho 123 演示忽略错误
      command: cho 123
      ignore_errors: yes
  • 也可以写在上面
- hosts: 172.16.1.31
  ignore_errors: yes
  tasks:
    - name: install
      # echo 123 -> cho 123 演示忽略错误
      command: cho 123

忽略错误并继续执行剧本

[root@m01 ~]# ansible-playbook run.ymal

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

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

TASK [install] ******************************************************************
fatal: [172.16.1.31]: FAILED! => {"changed": false, "cmd": "cho 123", "msg": "[Errno 2] 没有那个文件或目录", "rc": 2}
...ignoring

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

在剧本中设置标签功能

- hosts: 172.16.1.31
  tasks:
    - name: http
      yum: name=httpd state=installed
      tags: t1
    - name: install wget
      yum: name=wget state=installed
      tags: t2
  • 使用命令执行指定标签的内容
#执行标签t1
ansible-playbook run.ymal --tags=t1
#跳过执行标签t1
ansible-playbook run.ymal --skip-tags=t1

在剧本中设置触发功能

- hosts: 172.16.1.31
  tasks:
    - name: http
      yum: name=httpd state=installed
      notify: restart httpd server
#如果发生改变就会触发notify执行handlers中name为restart httpd server的内容
  handlers:
    - name: restart httpd server
      service: name=httpd state=restarted

第一次执行如果安装httpd就睡执行handlers的内容,第二次就不会执行

[root@m01 ~]# ansible-playbook run.ymal

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

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

TASK [http] *********************************************************************
changed: [172.16.1.31]

RUNNING HANDLER [restart httpd server] ******************************************
changed: [172.16.1.31]

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

[root@m01 ~]# ansible-playbook run.ymal

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

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

TASK [http] *********************************************************************
ok: [172.16.1.31]

PLAY RECAP **********************************************************************
172.16.1.31                : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

将多个剧本进行整合

方法一 include_tasks

- hosts: all
  tasks:
    - include_tasks: f1.yml
    - include_tasks: f2.yml

方法二 include

- include:f1.yml
- include:f2.yml

方法三 import_playbook

- import_playbook: base.yml
- import_playbook: rsync.yml
- import_playbook: nfs.yml

NFS服务部署剧本

创建目录

[root@m01 ansible-playbook]# tree
.
└── nfs-file
    ├── nfs-client
    └── nfs-server

/etc/ansible/hosts追加以下参数

[nfs:children]
nfs_server
nfs_client

[nfs_server]
172.16.1.31

[nfs_client]
172.16.1.7
172.16.1.8
172.16.1.9

剧本内容

- hosts: nfs
  tasks:
    - name: install nfs
      yum: state=installed name=nfs-utils
    - name: install rpcbind
      yum: state=installed name=rpcbind

- hosts: nfs_server
  tasks:
    - name: push exports
      copy: src=/etc/ansible/ansible-playbook/nfs-file/nfs-server/exports dest=/etc
      notify: restart nfs server
    - name: mkdir /data nfsnobody.nfsnobody
      file: path=/data state=directory owner=nfsnobody group=nfsnobody
    - name: rpcbind
      service: name=rpcbind state=started enabled=yes
    - name: nfs
      service: name=nfs state=started enabled=yes
  handlers:
    - name: restart nfs server
      service: name=nfs state=restarted

- hosts: nfs_client
  tasks:
    - name: mount /data
      mount: src=172.16.1.31:/data path=/mnt fstype=nfs state=mounted
    - name: check
      shell: df -h| grep /data
      register: mount_info
    - name: print
      debug: msg={{ mount_info.stdout_lines }}

ansible程序roles

roles.png

剧本编写问题

  1. 目录结构不够规范
  2. 编写好的任务如何重复调用
  3. 服务端配置文件改动,客户端参数信息也自动变化
  4. 汇总剧本中没有显示主机角色信息
  5. 一个剧本内容信息过多,不容易进行阅读,如何进行拆分

规范剧本目录

cd /etc/ansible/roles
mkdir {rsync,nfs}
mkdir {nfs,rsync}/{vars,tasks,templates,handlers,files}

#目录结构
[root@m01 roles]# tree
.
├── nfs
│   ├── files #保存需要分发文件目录
│   ├── handlers #保存触发器配置文件信息
│   ├── tasks #保存要执行的动作信息文件
│   ├── templates #保存需要分发模板文件 模板文件中可以设置变量信息
│   └── vars #保存变量信息文件
└── rsync
    ├── files
    ├── handlers
    ├── tasks
    ├── templates
    └── vars

创建相关文件

  • 所在位置/etc/ansible/roles

./nfs/files/exports

/data  172.16.1.0/24(rw,sync)

./nfs/handlers/main.yml

- name: restart nfs server
  service: name=nfs state=restarted

./nfs/tasks/main.yml

- name: install nfs
  yum: state=installed name=nfs-utils
- name: install rpcbind
  yum: state=installed name=rpcbind
- name: push exports
  copy: src=exports dest=/etc
  notify: restart nfs server
- name: mkdir {{ data }} nfsnobody.nfsnobody
  file: path={{ data }} state=directory owner=nfsnobody group=nfsnobody
- name: rpcbind
  service: name=rpcbind state=started enabled=yes
- name: nfs
  service: name=nfs state=started enabled=yes

./nfs/vars/main.yml

data: /data

./site.yml

- hosts: nfs_server
  roles: 
    - nfs
  • 运行剧本,会自动完成服务端的部署
ansible-playbook site.yml
  • 运行结果
[root@m01 roles]# ansible-playbook site.yml 

PLAY [nfs_server] ***********************************************************************

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

TASK [nfs : install nfs] ****************************************************************
ok: [172.16.1.31]

TASK [nfs : install rpcbind] ************************************************************
ok: [172.16.1.31]

TASK [nfs : push exports] ***************************************************************
changed: [172.16.1.31]

TASK [nfs : mkdir /data nfsnobody.nfsnobody] ********************************************
ok: [172.16.1.31]

TASK [nfs : rpcbind] ********************************************************************
ok: [172.16.1.31]

TASK [nfs : nfs] ************************************************************************
ok: [172.16.1.31]

RUNNING HANDLER [nfs : restart nfs server] **********************************************
changed: [172.16.1.31]

PLAY RECAP ******************************************************************************
172.16.1.31                : ok=8    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

使用templates目录分发模版文件

  • 可以选择将./nfs/files/exports移动到./nfs/templates/exports
  • 修改./nfs/templates/exports,修改./nfs/tasks/main.yml
  • 在推送./nfs/templates/exports时,会自动加载data变量

./nfs/templates/exports

#修改之前
/data  172.16.1.0/24(rw,sync)
#修改之后 修改为变量,./nfs/tasks/main.yml中的推送方式改为template
{{ data }}  172.16.1.0/24(rw,sync)

./nfs/tasks/main.yml

#修改之前
- name: install nfs
  yum: state=installed name=nfs-utils
- name: install rpcbind
  yum: state=installed name=rpcbind
- name: push exports
  copy: src=exports dest=/etc
  notify: restart nfs server
- name: mkdir {{ data }} nfsnobody.nfsnobody
  file: path={{ data }} state=directory owner=nfsnobody group=nfsnobody
- name: rpcbind
  service: name=rpcbind state=started enabled=yes
- name: nfs
  service: name=nfs state=started enabled=yes
#修改之后 template会推送templates目录下的文件并加载其中的变量
- name: install nfs
  yum: state=installed name=nfs-utils
- name: install rpcbind
  yum: state=installed name=rpcbind
- name: push exports
  template: src=exports dest=/etc
  notify: restart nfs server
- name: mkdir {{ data }} nfsnobody.nfsnobody
  file: path={{ data }} state=directory owner=nfsnobody group=nfsnobody
- name: rpcbind
  service: name=rpcbind state=started enabled=yes
- name: nfs
  service: name=nfs state=started enabled=yes
  • 运行剧本,会自动完成服务端的部署
ansible-playbook site.yml
  • 运行结果
[root@m01 roles]# ansible-playbook site.yml 

PLAY [nfs_server] ***********************************************************************

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

TASK [nfs : install nfs] ****************************************************************
ok: [172.16.1.31]

TASK [nfs : install rpcbind] ************************************************************
ok: [172.16.1.31]

TASK [nfs : push exports] ***************************************************************
changed: [172.16.1.31]

TASK [nfs : mkdir /data nfsnobody.nfsnobody] ********************************************
ok: [172.16.1.31]

TASK [nfs : rpcbind] ********************************************************************
ok: [172.16.1.31]

TASK [nfs : nfs] ************************************************************************
ok: [172.16.1.31]

RUNNING HANDLER [nfs : restart nfs server] **********************************************
changed: [172.16.1.31]

PLAY RECAP ******************************************************************************
172.16.1.31                : ok=8    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
  • 设定的data变量为/data,所以运行剧本后172.16.1.31的/etc/exports`内容如下
[root@nfs01 /]# cat /etc/exports
/data  172.16.1.0/24(rw,sync)