认识playbook

不同于临时命令,playbook适合于复杂应用的部署。
playbook的格式是YAML。playbook 由一个或多个 play 组成。
play 的内容,被称为 task,即任务。一个任务是一个对 ansible 模块的调用。

playbook包含:

  1. Tasks:任务,即调用模块完成的某操作
  2. Variables:变量
  3. Templates:模板
  4. Handlers:处理器,当某条件满足时,触发执行的操作
  5. Roles:角色,通过分别将变量、文件、任务、模块及处理器放置于单独的目录中、并可以便捷地include他们的一种机制

一个项目的目录结构可能是这样的:

  1. site.yml
  2. webservers.yml
  3. fooservers.yml
  4. roles/
  5. common/
  6. files/
  7. templates/
  8. tasks/
  9. main.yaml
  10. 01.yaml
  11. 02.yaml
  12. handlers/
  13. vars/
  14. defaults/
  15. meta/
  16. webservers/
  17. files/
  18. templates/
  19. tasks/
  20. handlers/
  21. vars/
  22. defaults/
  23. meta/
  • yml文件,用于定义此角色用到的各handler:在handler中使用include包含的其他的handler文件也应该位于此目录中;
  • files目录:存放由copy或script等模块调用的文件;
  • templates目录:templates模块会自动在此目录中寻找Jinja2模板文件;
  • tasks目录:至少应该包含一个名为main.yml的文件,其定义了此角色的任务列表;此文件可以使用include包含其他的位于此目录中的task文件;
  • handlers目录:此目录中应当包含一个main;
  • vars目录:应当包含一个main.yml文件,用于定义此角色用到的变量;
  • meta目录:应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系;
  • default目录:为当前角色设定默认变量时使用此目录;应当包含一个main.yml文件;

YAML文件基本语法规则

  • 大小写敏感;
  • 使用缩进表示层级关系;
  • 缩进时不允许使用Tab键,只允许使用空格;
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。
  • #” 表示注释,从这个字符一直到行尾,都会被解析器忽略
  • 只需要知道两种结构类型即可:
    • Lists
    • Maps

YAML Maps:

  • 是一个键值对:Key:Value
  • Maps的value既能够对应字符串也能够对应一个Maps,如:
    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: kube100-site
    5. labels:
    6. app: web

YAML List:

  • 说白了就是一个数组:

    1. args
    2. -beijing
    3. -shanghai
    4. -shenzhen
    5. -guangzhou
  • Lists的子项也可以是Maps,Maps的子项也可以是List,如:

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: kube100-site
    5. labels:
    6. app: web
    7. spec:
    8. containers:
    9. - name: front-end
    10. image: nginx
    11. ports:
    12. - containerPort: 80
    13. - name: flaskapp-demo
    14. image: jcdemo/flaskapp
    15. ports: 8080

注意:

  • 在YAML文件中绝对不要使用tab键
  • 配置文件应该存储在版本控制仓库中。如果需要,可以快速回滚配置、重新创建和恢复

hosts和users

  1. - hosts: all
  2. remote_user: root
  3. tasks:
  4. - name: test connection
  5. ping:
  6. remote_user: root