Ansible系列基础篇 1.7.1、PlayBook
ansbile-playbook是一系列ansible命令的集合,利用yaml 语言编写。playbook命令根据自上而下的顺序依次执行。同时,playbook开创了很多特性,它可以允许你传输某个命令的状态到后面的指令,如你可以从一台机器的文件中抓取内容并附为变量,然后在另一台机器中使用,这使得你可以实现一些复杂的部署机制,这是ansible命令无法实现的。
一、概述
其主要有以下四部分构成:
- Target section: 定义将要执行 playbook 的远程主机组
- Variable section: 定义 playbook 运行时需要使用的变量
- Task section: 定义将要在远程主机上执行的任务列表
- Handler section: 定义 task 执行完成以后需要调用的任务
# playbook示例:新建用户 - name: create user # 对该playbook实现的功能做一个概述,后面执行过程中,会打印 name变量的值 hosts: all # 对该playbook实现的功能做一个概述,后面执行过程中,会打印 name变量的值 remote_user: root # 指定在远程被管理机上执行操作时使用什么用户,如不指定,则使用ansible.cfg中配置的remote_user gather_facts: false # 指定在执行任务之前,是否先执行setup模块获取主机相关信息,如未用到,可不指定 vars: # 定义后续任务中会使用到的变量,如未用到,可不指定 user:"test" tasks: # 定义具体需要执行的任务 - name: create user # 具体任务描述,执行过程中会被打印出来 user: name="{{ user }}" # 调用的模块名 ...
二、语法详解
总的来说, Playbook 语法和yaml格式类似,具有如下一些特性:
1. 需要以“一” ( 3 个减号)开始,且需顶行首写;
2. 次行开始正常写 Playbook的内容,建议写明该 Playbook 的功能;
3. 使用#号注释代码;
4. 缩进必须是统一的,不能将空格和 Tab 混用;
5. 缩进的级别必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的;
6. YAML 文件内容和 Linux 系统大小写判断方式保持一致,是区别大小写的,k/v 的值均需大小写敏感;
7. k/v的值可同行写也可换行写。同行使用“ : ”分隔,换行写需要以“一”分隔;
8. 一个完整的代码块功能需最少元素,需包括 name : task;
9. 一个name只能包括一个 task;
复杂的playbook:
--- - hosts: host_name remote_user: admin become: yes become_user: root become_method: sudo vars: foo: foox blu: blux vars_files: - xxx.yml tasks: - name: task01 command: ls -trl / - name: task02 copy: src: /app/xx.log dest: /app - name: 安装apache yum: name={{item}} state=present with_items: - httpd - httpd-devel - name: 复制配置文件 copy: src: {{item.src}} dest: {{item.dest}} with_items: - {src: /app/xx.log, dest: /app} - {src: /app2/xx2.log, dest: /app2} notify: - name: restart httpd - name: restart httpd2 # 如果有多个触发,格式如下 - handlers: - name: restart httpd service: name=httpd state=restart ...
三、高级语法
playbook高级语法之循环
playbook高级语法之变量
playbook高级语法之判断
playbook高级语法之register
playbook高级语法之tags
playbook高级语法之include
playbook高级语法之block
二、Playbook命令参数
# --limit,playbook限定执行的主机范围
ansible-playbook pb.yml --limit cs_servers
# --list-hosts,列出执行playbook时,哪些主机会受影响
ansible-playbook pb.yml --list-hosts
# --remote-user,指定执行时的用户,如果-hosts字段没有定义用户,那将会使用Inventory文件中定义的用户,如果Inventory文件中没有定义,那么会使用当前ssh连接的用户。
ansible-playbook pb.yml --remote-user=admin
# --ask-sudo-pass,传递sudo密码到远程主机
# --sudo-user
# --sudo --sudo,强制所有play都使用sudo用户,同时使用--sudo-user选项指定sudo可以执行哪个用户的权限,如果不指定,则默认使用root运行
# --inventory,指定inventory文件
ansible-playbook pb.yml --inventory=/etc/ansible/hosts
# --verbose(-v),显示详细输出,-vvvv显示更精确的输出
# --extra-vars="k1=v1,k2=v2",定义playbook使用时的变量。 也可以引入文件,--extra-vars="@xxx.yml"
# --forks=Num (-f Num),指定并发数量
# --connection=Type (-c Type),指定连接远程主机的方式,默认ssh。不建议修改
# --check, 检测模式,所有任务在每台主机上进行检测,但不真正执行
-v:打印任务运行结果
-vv:打印任务运行结果以及任务的配置信息
-vvv:包含了远程连接的一些信息
-vvvv:Adds extra verbosity options to the connection plug-ins,including the users being used in the managed hosts to execute scripts, and what scripts have been executed
1. handlers只有在所在的任务被执行时,才会被执行;
2. handlers只会在play的末尾运行一次,如果想要在playbook的中间运行,需要使用meta模块来实现,例如: - meta: flush_handlers
3.
playbook 在运行到调用 handlcrs 的语句之前失败了,那么这个 handlers 将不会被执行。我们可以使用 mega 模块的 --force-handlers。选项来强制执行 Handlers , 即使是 Handlers 所在的 Play 中途运行失败也能执行。
环境变量:
1. 使用lineinfile模块,来修改远程主机的环境变量
- name: 修改远程主机上的用户指定的环境变量
lineinfile: dest=~/.bash_profile regexp=^ENV_VAR= line=ENV_VAR=value
2. 在后续任务中使用此前定义过的变量,可以使用register来将环境变量保存到自定义的变量中
- name: 获取刚指定的环境变量,并保存到自定义变量foo中
shell: source ~/.bash_profile && echo $ENV_VAR
register: foo
- name: 打印环境变量
debug: msg={{foo.stdout}}
高级变量:
vars:
foo:
- list1
- list2
- list3
访问方式: foo[0] foo[1] foo|first(jinja2格式,不推荐)
vars:
eth0: {active: true, ipv4: {address: "127.0.0.1", network: "127.0.0.2"}}
访问方式:
一: echo.active.ipv4.address
二: echo["active"]["ipv4"]["address"]
内置变量(待完善)
hostvars
groups 包含所有hosts文件里主机组的一个列表
group_names 包含当前主机所在的所有主机组名的一个列表
inventory_hostname 通过hosts文件定义主机的主机名
inventory_hostname_short 变量inventory_hostname的第一部分
play_hosts 执行档期那任务的所有主机