美文网首页
Ansible-playbook (二)

Ansible-playbook (二)

作者: 你好_请关照 | 来源:发表于2019-07-11 15:53 被阅读0次

一、ansible 剧本介绍:

1、剧本的作用:

1)、将多个模块操作的功能进行整合
2)、实现重复工作简单化(提高工作效率)
3)、实现特殊需求

2、剧本中的内容:角色信息、任务信息

hosts :角色信息
tasks :任务信息

3、编写剧本的语法规范(yaml):

1、注意缩进的关系:两个空格一个缩进关系
2、创建键值对 :使用冒号(如 age: 18);如果没有空格是错误的;(如 age:18(错误))
有两种特殊情况除外:
(1)、冒号结尾
(2)、冒号出现在描述和注释当中
3、列表:相同的信息或类别出现多次
释义:多个列表使用短横线+空格
如:
- team1 zhangsan lisi
- team2 zhangsan lisi

4、

ansible-playbook --syntax-check test01.yaml --- 检查语法结构
ansible-playbook -C test01.yaml --- 模拟执行剧本

二、ansible 剧本编写示范:

shell模块和其他模块书写在一个name中会产生冲突

练习01:一键部署rsync守护进程服务

第1步:设置主机清单:

[root@m01 ~]# cat /etc/ansible/hosts  | tail -n 6
[nfs01]
172.16.1.31
[backup]
172.16.1.41
[web01]
172.16.1.7

第2步:编写剧本信息(注意书写格式):

[root@m01 ~]# cat rsync.yaml 
- hosts: backup
  tasks:
  - name: 01  安装rsync服务
    yum: name=rsync state=installed
  - name: 02 编辑rsync配置文件 /etc/rsyncd.conf
    copy: src=/etc/rsyncd.conf dest=/etc/
  - name: 03 创建虚拟用户rsync
    user: name=rsync shell=/sbin/nologin create_home=no
  - name: 04 创建本分文件目录backup 权限 600 
    file: path=/backup state=directory owner=rsync group=rsync
  - name: 05 创建服务端密码文件 rsync.password 权限 600
    copy: content='rsync_backup:123456' dest=/etc/rsync.password mode=600
  - name: 启动rsyncd 服务
    service: name=rsyncd state=started enabled=yes

- hosts: web01
  tasks: 
  - name: 01 创建服务端密码文件
    copy: content='123456' dest=/etc/rsync.password mode=600

第3步:测试剧本:

[root@m01 ~]# ansible-playbook --syntax-check rsync.yaml 

playbook: rsync.yaml
[root@m01 ~]# ansible-playbook rsync.yaml 

PLAY [backup] ***********************************************************************************************************************

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

TASK [01  安装rsync服务] ****************************************************************************************************************
changed: [172.16.1.41]

TASK [02 编辑rsync配置文件 /etc/rsyncd.conf] **********************************************************************************************
changed: [172.16.1.41]

TASK [03 创建虚拟用户rsync] ***************************************************************************************************************
ok: [172.16.1.41]

TASK [04 创建本分文件目录backup 权限 600] *****************************************************************************************************
ok: [172.16.1.41]

TASK [05 创建服务端密码文件 rsync.password 权限 600] *******************************************************************************************
changed: [172.16.1.41]

TASK [启动rsyncd 服务] ******************************************************************************************************************
changed: [172.16.1.41]

PLAY [web01] ************************************************************************************************************************

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

TASK [01 创建服务端密码文件] *****************************************************************************************************************
changed: [172.16.1.7]

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

[root@m01 ~]# [root@m01 ~]# cat rsync.yaml 

第4步:执行剧本

[root@m01 ~]# ansible-playbook rsync.yaml 

PLAY [backup] ***********************************************************************************************************************

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

TASK [01  安装rsync服务] ****************************************************************************************************************
changed: [172.16.1.41]

TASK [02 编辑rsync配置文件 /etc/rsyncd.conf] **********************************************************************************************
changed: [172.16.1.41]

TASK [03 创建虚拟用户rsync] ***************************************************************************************************************
changed: [172.16.1.41]

TASK [04 创建本分文件目录backup 权限 600] *****************************************************************************************************
ok: [172.16.1.41]

TASK [05 创建服务端密码文件 rsync.password 权限 600] *******************************************************************************************
changed: [172.16.1.41]

TASK [启动rsyncd 服务] ******************************************************************************************************************
changed: [172.16.1.41]

PLAY [web01] ************************************************************************************************************************

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

TASK [01 创建服务端密码文件] *****************************************************************************************************************
changed: [172.16.1.7]

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

[root@m01 ~]# 

第5步:测试服务

[root@web01 ~]# rsync /etc/fstab rsync_backup@10.0.0.41::backup --password-file=/etc/rsync.password 
[root@backup ~]# ll /backup/
total 4
-rw-r--r--. 1 rsync rsync 501 Jul  6 23:37 fstab
[root@backup ~]# cls
[root@backup ~]# 

三、剧本编写扩展:

剧本编写扩展说明:

1、剧本编写设置变量(vars)
2、剧本编写注册信息(register)
3、剧本编写循环功能(with_items)
4、剧本编写判断功能(when)
5、剧本编写忽略错误(ignore_errors)
6、剧本编写标签功能(tags)
7、剧本编写忽略采集(gather_facts)
8、剧本编写触发功能(handlers)
9、剧本编写汇总功能(目录:files handlers tasks templates vars)

1、剧本编写设置变量(vars)

第1种方式:在剧本中设置变量

[root@m01 /server/scripts]# cat vars_test.yaml 
- hosts: backup
  vars: 
    dir_info: /etc/
    dir_file: hosts
    dest_info: /tmp/
    dest_file: hosts.bak
  tasks:
    - name: copy 文件
      copy: src={{ dir_info }}{{ dir_file }} dest={{ dest_info  }}{{ dest_file  }}

第2种方式:在命令行指定变量

注意:此种方式还可以嵌入组变量

[root@m01 /server/scripts]# cat vars_test.yaml 
- hosts: backup
  vars: 
    dir_info: /etc/
    dir_file: hosts
  tasks:
    - name: copy 文件
      copy: src={{ dir_info }}{{ dir_file }} dest={{ dest_info  }}{{ dest_file  }}
[root@m01 /server/scripts]# vim vars_test.yaml 
[root@m01 /server/scripts]# ansible-playbook -e dir_info=/etc/ -e dir_file=hosts vars_test.yaml 

PLAY [backup] ***********************************************************************************************************************

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

TASK [copy 文件] **********************************************************************************************************************
changed: [172.16.1.41]

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

[root@m01 /server/scripts]# 

第3种方式:在主机清单中设置变量

[root@m01 /server/scripts]# tail -n 10 /etc/ansible/hosts 
## db-[99:101]-node.example.com
[nfs01]
172.16.1.31
[backup]
172.16.1.41
[backup:vars]
 dir_info=/etc/ 
 dir_file=hosts
[web01]
172.16.1.7

注意 三种变量配置方式优先顺序如下:命令行配置变量最优先,剧本文件中配置其次,主机清单中配置最后。

2、剧本编写注册信息(register)

使用说明:register 的作用是将上一模块的执行结果报转化为register指定的变量中, 如果下面的模块需要用到这个变量,直接调用即可。一般配合debug使用
[root@m01 /server/scripts]# cat sshd_zhuce.yaml 
- hosts: backup
  tasks:
    - name: 重启sshd服务
      service: name=sshd state=restarted
    - name: 查看启动后端口信息
      shell: ss -tnlp | grep sshd 
      register: port_info   #将shell 模块执行的结果保存到 port_info 中,从某种角度来讲 这时的port_info 这时是一个变量。
    - name: 显示端口信息
      debug: msg={{ port_info.stdout_lines  }}  #用debug模块输出结果 stdout_lines 表示标准输出。

3、剧本编写循环功能(with_items)

功能说明:这个模块主要做循环使用,利用with_items子句生成一个循环列表,使用 {{ item }} 固定模式来调用变量,调用的是with_items 生成的整个列表。此功能还有第二种用法,使用{{item.xxx}}的方式来调用变量。具体参照下面第二种方式。
第1种方式:
- hosts: backup
  remote_user: root
  tasks:
    - name: create user to backup 
      user: name={{ item }} state=present 
      with_items: 
        - test1
        - test2
        - test3
第2种方式:
循环方式二:
    - hosts: 172.16.1.7
      tasks:
        - name: create user01-03
          user: name={{ item.name }}  shell={{ item.shell }} create_home={{ item.home }}
          with_items:
            - {name: 'user01', shell: '/sbin/nologin', home: 'yes'}
            - {name: 'user02', shell: '/bin/bash', home: 'no'}
            - {name: 'user03', shell: '/bin/bash', home: 'yes'}

4、剧本编写判断功能 (when)

使用说明:想要使用when 语句,首先要先了解一下setup模块的用法,setup模块可以查询到一些主机信息,然后借用这些主机信息来对条件做判断。下面给罗列了一些常用的参数

常见主机信息:

主机参数 参数说明
ansible_all_ipv4_addresses: 仅显示ipv4的信息。
ansible_devices: 仅显示磁盘设备信息。
ansible_distribution: 显示是什么系统,例:centos,suse等。
ansible_distribution_major_version: 显示是系统主版本。
ansible_distribution_version: 仅显示系统版本。
ansible_machine: 显示系统类型,例:32位,还是64位。
ansible_eth0: 仅显示eth0的信息。
ansible_hostname: 仅显示主机名。
ansible_kernel: 仅显示内核版本。
ansible_lvm: 显示lvm相关信息。
ansible_memtotal_mb: 显示系统总内存。
ansible_memfree_mb: 显示可用系统内存。
ansible_memory_mb: 详细显示内存情况。
ansible_swaptotal_mb: 显示总的swap内存。
ansible_swapfree_mb: 显示swap内存的可用内存。
ansible_mounts: 显示系统磁盘挂载情况。
ansible_processor: 显示cpu个数(具体显示每个cpu的型号)。
ansible_processor_vcpus: 显示cpu个数(只显示总的个数)。
[root@m01 /server/scripts/playbook]# vim copy.yaml 

- hosts: all
  remote_user: root
  tasks:
    - name: 分发文件 hosts
      copy: src=/etc/hosts dest=/tmp
      when: (ansible_hostname == "backup")
    - name: 分发文件 fstab
      copy: src=/etc/fstab dest=/tmp
      when: (ansible_hostname !=  "backup")
[root@m01 /server/scripts/playbook]# ansible-playbook copy.yaml 

PLAY [all] **************************************************************************************************************************

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

TASK [分发文件 hosts] *******************************************************************************************************************
skipping: [172.16.1.31]
skipping: [172.16.1.7]
changed: [172.16.1.41]

TASK [分发文件 fstab] *******************************************************************************************************************
skipping: [172.16.1.41]
changed: [172.16.1.31]
changed: [172.16.1.7]

PLAY RECAP **************************************************************************************************************************
172.16.1.31                : ok=2    changed=1    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
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   

[root@m01 /server/scripts/playbook]# 

5、剧本编写忽略错误(ignore_errors)

使用说明:此功能用于忽略报错,加上此语句表示忽略当前报错,使剧本继续执行。
[root@m01 /server/scripts/playbook]# cat ignore_errors.yaml 
- hosts: backup 
  remote_user: root
  tasks: 
    - name: 创建用户user01
      user: namei=user01
      ignore_errors: yes
    - name: 复制 reboot.yaml
      copy: src=reboot.yaml dest=/tmp
    - name: 更改reboot.yaml权限
      file: path=/tmp/hosts mode=600
[root@m01 /server/scripts/playbook]# ansible-playbook ignore_errors.yaml 

PLAY [backup] ***********************************************************************************************************************

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

TASK [创建用户user01] *******************************************************************************************************************
fatal: [172.16.1.41]: FAILED! => {"changed": false, "msg": "Unsupported parameters for (user) module: namei Supported parameters include: append, authorization, comment, create_home, expires, force, generate_ssh_key, group, groups, hidden, home, local, login_class, move_home, name, non_unique, password, password_lock, profile, remove, role, seuser, shell, skeleton, ssh_key_bits, ssh_key_comment, ssh_key_file, ssh_key_passphrase, ssh_key_type, state, system, uid, update_password"}
...ignoring

TASK [复制 reboot.yaml] ***************************************************************************************************************
changed: [172.16.1.41]

TASK [更改reboot.yaml权限] **************************************************************************************************************
changed: [172.16.1.41]

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

[root@m01 /server/scripts/playbook]# 

6、剧本编写标签功能(tags)

使用说明:在剧本中使用标签功能,加上标签后 ,在执行剧本时可以指定只运行标签内容,还是跳过标签内容

跳过标签运行剧本: ansible-playbook --skip-tags=标签名 剧本名

只运行标签内容:ansible-playbook -t 标签名 剧本名

如下示例:

[root@m01 /server/scripts/playbook]# cat tags.yaml 
- hosts: backup 
  remote_user: root
  tasks: 
    - name: 创建用户user01
      user: namei=user01
      ignore_errors: yes
      tags: test01
    - name: 复制 reboot.yaml
      copy: src=reboot.yaml dest=/tmp
    - name: 更改reboot.yaml权限
      file: path=/tmp/hosts mode=600
[root@m01 /server/scripts/playbook]# ansible-playbook -t test01 tags.yaml 

PLAY [backup] ***********************************************************************************************************************

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

TASK [创建用户user01] *******************************************************************************************************************
fatal: [172.16.1.41]: FAILED! => {"changed": false, "msg": "Unsupported parameters for (user) module: namei Supported parameters include: append, authorization, comment, create_home, expires, force, generate_ssh_key, group, groups, hidden, home, local, login_class, move_home, name, non_unique, password, password_lock, profile, remove, role, seuser, shell, skeleton, ssh_key_bits, ssh_key_comment, ssh_key_file, ssh_key_passphrase, ssh_key_type, state, system, uid, update_password"}
...ignoring

PLAY RECAP **************************************************************************************************************************
172.16.1.41                : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=1   
[root@m01 /server/scripts/playbook]# 

7、剧本编写忽略采集(gather_facts)

使用说明:忽略采集功能,直接执行任务信息,目的在于提高工作效率
[root@m01 /server/scripts/playbook]# cat gatehr_facts.yaml 
- hosts: backup 
  gather_facts: no
  remote_user: root
  tasks: 
    - name: 创建用户user01
      user: namei=user01
      ignore_errors: yes
    - name: 复制 reboot.yaml
      copy: src=reboot.yaml dest=/tmp
    - name: 更改reboot.yaml权限
      file: path=/tmp/hosts mode=600
[root@m01 /server/scripts/playbook]# ansible-playbook gatehr_facts.yaml 

PLAY [backup] ***********************************************************************************************************************

TASK [创建用户user01] *******************************************************************************************************************
fatal: [172.16.1.41]: FAILED! => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "msg": "Unsupported parameters for (user) module: namei Supported parameters include: append, authorization, comment, create_home, expires, force, generate_ssh_key, group, groups, hidden, home, local, login_class, move_home, name, non_unique, password, password_lock, profile, remove, role, seuser, shell, skeleton, ssh_key_bits, ssh_key_comment, ssh_key_file, ssh_key_passphrase, ssh_key_type, state, system, uid, update_password"}
...ignoring

TASK [复制 reboot.yaml] ***************************************************************************************************************
ok: [172.16.1.41]

TASK [更改reboot.yaml权限] **************************************************************************************************************
ok: [172.16.1.41]

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

[root@m01 /server/scripts/playbook]# 

8、剧本编写触发功能(handlers)

使用场景:一般用于某些配置文件发生改变,需要重新启动某些服务,但是一个剧本中可能有多个服务,为了不影响其他的服务,但是又能实现当前的任务

使用说明:handlers 只会处理notify中列出的任务,而且不论notify中有多少个任务,handlers都会一次处理完成,如果notify没有通知handlers将不会运行;其实handlers与常规任务并没有什么不同,但是这里要注意handlers 和tasks是同一列。
- hosts: backup
    tasks:
        - name: copy file
          copy: src=rsyncd.conf  dest=/etc/
          notify: rsync_server
        - name: boot server
          service: name=rsyncd state=started
    
      handlers:
        - name: rsync_server
          service: name=rsyncd state=restarted

9、剧本编写汇总功能

例:以部署自动部署NFS为例(其实还可以完善)

准备工作在 /etc/ansible/roles下创建files 、 handlers 、 tasks 、templates 、vars 五个目录,这五个目录各有其用。

a、tasks: 包含角色要执行的主要任务列表,此实例内容如下:

[root@m01 /etc/ansible/roles]# ls nfs/
files  handlers  tasks  templates  vars
[root@m01 /etc/ansible/roles]# cat nfs/tasks/main.yaml 
    - name: 01 安装部署软件
      yum: name={{ item.name }} state=installed
      with_items:
        - {name: 'nfs-utils'}
        - {name: 'rpcbind' } 
    - name: 02 分发NFS配置文件
      copy: src=exports  dest={{ conf_dir }}exports
    - name: 创建用户组
      group: name={{ group_name  }} gid={{ gid_num }} state=present
    - name: 03 创建虚拟用户
      user: name={{ user_name }}  uid={{ uid_num }}  group={{ gid_num }}  shell=/sbin/nologin create_home=no state=present
      ignore_errors: no 
    - name: 04 创建挂载目录
      file: path=/web_data owner={{ user_name  }} group={{ user_name  }} state=directory
    - name: 05 启动NFS服务
      service: name={{ item.start }} state=started
      with_items:
        - {start: 'nfs'}
        - {start: 'rpcbind' } 
      notify: change_status
    - name: 重读配置文件
      service: name=nfs state=reloaded
    - name: 查看服务启动状态
      shell: showmount -e {{ ip }} 
      register: start_info
    - name: 显示服务启动状态
      debug: msg={{ start_info.stdout_lines }}  
[root@m01 /etc/ansible/roles]# 

b、vars:角色的其他变量(有关更多信息,请参阅使用变量)。此实例内容如下

[root@m01 /etc/ansible/roles]# cat nfs/vars/main.yaml 
conf_dir: /etc/
gid_num: "1100"
uid_num: "1100"
user_name: www
group_name: www
ip: 172.16.1.31
[root@m01 /etc/ansible/roles]# 

c、files : 包含可以通过此角色部署的文件。此实例用到的文件如下

[root@m01 /etc/ansible/roles]# ls nfs/files/
exports
[root@m01 /etc/ansible/roles]# 

d、handlers:包含处理程序,可以由此角色使用,甚至可以在此角色之外的任何位置使用。此实例内容如下

[root@m01 /etc/ansible/roles]# cat nfs/handlers/main.yaml 
- name: change_status
  service: name=nfs state=reloaded

[root@m01 /etc/ansible/roles]# 

e、templates - 包含可以通过此角色部署的模板。此实例未使用到此目录,如需要使用请到官网查看,或发间信于我,我来帮助你

f、在/etc/ansible/roles/ 下编写site.yml的文件,文件内容如下,这里注意文件的后缀是.yml。

[root@m01 /]# cat etc/ansible/roles/site.yml 
- hosts: nfs01
  remote_user: root
  roles:
  - nfs
[root@m01 /]# 

g、在 /etc/ansible/roles/下执行剧本即可,再提一下 使用ansible之前,一定好提前规划好ansible的主机文件即/etc/ansible/hosts,具体配置在本博客Ansible基础(一)中可以找到

[root@m01 /etc/ansible/roles]# ansible-playbook --syntax-check site.yml  3进行语法检查

playbook: site.yml
[root@m01 /etc/ansible/roles]# ansible-playbook site.yml #无问题后执行即可这里不再做演示

10、多个剧本整合成一个剧本执行

方式一

(1)事先写好的剧本,不包含主机信息

[root@m01 /server/ansible_play]# cat rsync.yaml
- name: 01:安装软件
 yum: name=rsync state=installed
- name: 02:分发配置文件
 copy: src=/etc/rsyncd.conf dest=/etc/rsyncd.conf
- name: 03:创建虚拟用户
 user: name=rsync shell=/sbin/nologin create_home=no
- name: 04:创建备份目录
 file: path=/backup_data state=directory owner=rsync group=rsync
- name: 05:创建密码文件
 copy: content='rsync_backuo:123456' dest=/etc/rsync.password mode=600
- name: 06:启动服务
 service: name=rsyncd state=started enabled=yes


- name: 01:创建密码文件
 copy: content='123456' dest=/etc/rsync.password mode=600
[root@m01 /server/ansible_play]# cat with_items.yaml
- name: 01:安装NFS
 yum: name={{ item.name }} state=installed 
 with_items:
   - {name: 'nfs-utils'}
   - {name: 'rpcbind'}

[root@m01 /server/ansible_play]# 

(2)将上面的两个剧本放在一个剧本中执行

其实就是给主机信息,然后用include调用

[root@m01 /server/ansible_play]# cat auto.yaml 
- hosts: backup
  tasks:
    - include_tasks: rsync.yaml

- hosts: nfs01
  tasks: 
    -  include_tasks: with_items.yaml
[root@m01 /server/ansible_play]# 

方式二

(1)正常书写单个剧本

[root@m01 /server/ansible_play]# cat rsync.yaml 
- hosts: backup
  tasks: 
    - name: 01:安装软件
      yum: name=rsync state=installed
    - name: 02:分发配置文件
      copy: src=/etc/rsyncd.conf dest=/etc/rsyncd.conf
    - name: 03:创建虚拟用户
      user: name=rsync shell=/sbin/nologin create_home=no
    - name: 04:创建备份目录
      file: path=/backup_data state=directory owner=rsync group=rsync
    - name: 05:创建密码文件
      copy: content='rsync_backuo:123456' dest=/etc/rsync.password mode=600
    - name: 06:启动服务
      service: name=rsyncd state=started enabled=yes


- hosts: web01
  tasks:
    - name: 01:创建密码文件
      copy: content='123456' dest=/etc/rsync.password mode=600
[root@m01 /server/ansible_play]# cat with_items.yaml 
- hosts: nfs01
  tasks:
    - name: 01:安装NFS
      yum: name={{ item.name }} state=installed 
      with_items:
        - {name: 'nfs-utils'}
        - {name: 'rpcbind'}
    
[root@m01 /server/ansible_play]# 

(2)汇总到一起执行,执行时只需ansible-playbook auto.yaml 即可

    
[root@m01 /server/ansible_play]# cat auto.yaml 
- import_playbook: rsync.yaml
- import_playbook: with_items.yaml
[root@m01 /server/ansible_play]# 

相关文章

网友评论

      本文标题:Ansible-playbook (二)

      本文链接:https://www.haomeiwen.com/subject/ovomhctx.html