Ansible—Playbook(剧本)

剧本文件的结尾:.yml .yaml

基础不好的建议看一下Ansible部署与应用中的Ansible简单操作中的模块的使用

编写剧本格式

注意缩进格式

- hosts: 操作对象
  remote_user: 远程操控时使用的主控端用户名
  tasks:   # 以下为具体执行的任务
    - name: 任务描述信息
      模块名: 任务操作
    - name: 任务描述信息
      模块名: 任务操作
    ...

例:

- hosts: dbserver        # 操作对象为主机清单中的dbserver模块
  remote_user: root        # 远程操控用户为root
  tasks:                    
    - name: install vsftpd        # 任务描述
      yum: name=vsftpd            # 安装vsftpd
    - name: start vsftpd        #任务描述
      service: name=vsftpd state=started    # 开启vsftpd服务

tags标签

可以通过给每一步的任务添加一个tags标签

- hosts: dbserver        # 操作对象为主机清单中的dbserver模块
  remote_user: root        # 远程操控用户为root
  tasks:                    
    - name: install vsftpd        # 任务描述
      yum: name=vsftpd            # 安装vsftpd
      tags: vsftpd # 该任务的tags为vsftpd

可以在执行剧本时,仅执行yml文件中的这一个

使用-t执行指定标签的tasks

ansible-playbook xxx.yml -t vsftp

以上这条命令,只会执行tasks中标签为vsftpd的这一个模块

主机与用户

可以为一个yml文件指定以哪个用户的身份去执行task

- hosts: dbserver
  remote_user: root    

上述例子,是指指定的hosts使用的用户为root,在每个task中,可以定义自己的远程用户,前提是被管理主机上有该用户

- hosts: dbserver
  remote_user: root
  tasks:                    
    - name: install vsftpd
      yum: name=vsftpd
      remote_user: cyj # 表示执行yum这个task时使用cyj用户来执行

sudo

sudo的用法也可以与用户一样的理解,可以指定那一个task可以使用sudo,也可以指定文件中的所有task都是用sudo

指定所有task都是用sudo

- hosts: dbserver
  remote_user: root
  sudo: yes
  tasks:                    
    - name: install vsftpd
      yum: name=vsftpd

指定单个task使用sudo

- hosts: dbserver
  remote_user: root
  tasks:                    
    - name: install vsftpd
      yum: name=vsftpd
      sudo: yes

使用sudo来切换用户

- hosts: dbserver
  remote_user: root
  sudo: yes
  sudo_user: cyj

如果你需要在使用 sudo 时指定密码,可在运行 ansible-playbook 命令时加上选项 --ask-sudo-pass (-K). 如果使用 sudo 时,playbook 疑似被挂起,可能是在 sudo prompt 处被卡住,这时可执行 Control-C 杀死卡住的任务,再重新运行一次.

当使用 sudo_user 切换到 非root 用户时,模块的参数会暂时写入 /tmp 目录下的一个随机临时文件. 当命令执行结束后,临时文件立即删除.这种情况发生在普通用户的切换时,比如从 ‘bob’ 切换到 ‘timmy’, 切换到 root 账户时,不会发生,如从 ‘bob’ 切换到 ‘root’,直接以普通用户或root身份登录也不会发生. 如果你不希望这些数据在短暂的时间内可以被读取(不可写),请避免在 sudo_user中传递未加密的密码. 其他情况下,’/tmp’ 目录不被使用,这种情况不会发生.Ansible 也有意识的在日志中不记录密码参数

Tasks列表

每一个yml文件包含了一个tasks列表,一个task在其所对应的所有主机上,也就是hosts文件中所定义的主机组,执行完一个task之后,下一个task才会执行。

在运行yml文件时,会按照先后顺序从上到下依次执行,如果主机组中有一台主机中执行同一个task失败,则会跳出执行,中断,请排错之后重新运行

Handlers:在发生改变时执行的操作

当被管理端的某个文件被改动之后,执行的操作,比如修改某个配置文件之后,需要重新启动相应的服务

当远端文件发生变动后,notify会在每一个task结束时被触发,而且即使有多个不同的task通知改动的发生,notify只会被触发一次

如:当foo.conf发生变动时,重新启动memcachedapache,**notify下列出的就是handlers**

- name: template configuration file
  template: src=template.j2 dest=/etc/foo.conf
  notify:
     - restart memcached
     - restart apache

handlers也是一些task的列表,通过制定的task的name来引用,一般和task并没有什么区别,handlers是由通知者进行notify,如果没有被notifyhandlers不会执行,不管被多少个通知进行了notify,等到文件中所有task执行完成之后,handlers也只会被执行一次

handlers示例:

handlers:
    - name: restart memcached
      service:  name=memcached state=restarted
    - name: restart apache
      service: name=apache state=restarted

Handlers 最佳的应用场景是用来重启服务,或者触发系统重启操作.除此以外很少用到了.

如果你想立即执行所有的 handler 命令,你可以这样做

tasks:
   - shell: some tasks go here
   - meta: flush_handlers
   - shell: some other tasks

检测语法错误

ansible-playbook yml文件路径 --syntax-check

执行剧本

ansible-playbook yml文件路径

ansible-playbook playbook.yml --list-hosts,可以看到yml的执行影响到了那些主机

ansible中文权威指南

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0