**1. playbook介绍** ``` playbook是有一个或多个"play"组成的列表 play的主要功能在于事先将归并为一组的主机装扮成事先通过ansible的task定义好的角色。 从根本上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制执行操作 playbook采用yaml语言编写 ``` **2. 用法** ``` ansible-playbook [options] playbook.yml [playbook2 ...] ``` **3. 命令** ``` 检测语法 ansible-playbook --syntax-check file.yaml 测试运行 ansible-playbook -C file.yaml 运行 ansible-playbook file.yaml 选项 -C, --check 只检测可能会发生的改变,但不真正执行操作 --list-hosts 列出运行任务的主机 --list-tasks 列出任务列表 --list-tags 列出所有标签 --limit 主机列表,只针对主机列表中的主机运行 -v 显示过程, -vv, -vvv -t TAGS, --tags=TAGS 指定标签运行 --skip-tags=SKIP_TAGS --start-at-task=START_AT ``` **4. playbook: 核心元素** ``` hosts 执行的远程主机列表 tasks 任务集,由模块定义的操作的列表; variables 内置变量或自定义变量在playbook中调用 templates 模板,即使用了模板语法的文本文件;可替换文件中的变量实现一些简单的逻辑的文件 handlers 由特定条件触发的Tasks;和notify结合使用 tags 标签,指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有法神变化的时间依然会非常的尝,此时,如果确信其没有变化,就可以使用tags跳过这些代码片段 ansible-playbook -t tagsname useradd.yml roles 角色 ``` **5. playbook:基础组件** - hosts ``` 执行指定任务的目标主机 ``` - remote_user ``` 在远程主机以哪个用户身份执行,可用于host和tasks中 sudo_user:非管理员需要拥有sudo权限 ``` - tasks ``` 任务列表: play主体部分是task list,task list个任务按顺序逐个在hosts指定的主机上运行,所有主机完成第一个任务之后在执行第二个。在自上而下运行某playbook时,如果中途发生错误,所有已执行的任务都将回滚,因此,再更正playbook后重新执行即可 使用指定的参数执行模块,在模块中可以使用变量。模块执行是幂等的,即多次执行是安全的,因为结果均一致 每个task应该有name,用于playbook的执行结果的输出,描述任务执行步骤,若没有name,则action结果将用于输出 格式: (1) action: module arguments (2) module:arguments 建议使用 注意: (1) shell和command模块后面跟命令,而非key=value tasks: - name: disable selinux command: /sbin/setenforce 0 (2) 某任务的状态在运行后变为changed时,可通过 notify 通知给形影的handlers (3) 任务可以通过tags打标签,而后可在ansible-playbook命令上使用 -t 指定进行调用 忽略错误: 如果命令或脚本的退出码不为0,可以使用如下方式替代 tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand || /bin/true 或者使用ignore_errors来忽略错误信息 tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand ignore_errors: true ``` **- handlers** ``` 说明: (1) handlers和notify结合使用触发条件 (2) handlers是task列表,这些task与前述的task没有本质的不同,用于当关注的资源发生变化是,才会采取一定的操作 (3) notify此action可用于在每个play的最后被触发,这样可以避免又多次改变发生时,每次都执行指定的操作,仅在所有的变化发生完成之后一次性的执行指定的操作,在notify中调用handler中定义的操作 语法: ----------------------- tasks: - name: TASK_NAME module: arguments notify: HANDLER_NAME handlers: - name: HANDLER_NAME module: arguments ----------------------- handlers可以定义多个 eg: --- - hosts: testsrvs remote_user: root tasks: - name: install httpd package yum: name=httpd - name: copy conf file copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes notify: retart httpd service - name: start service service: name=httpd state=started enabled=yes handlers: - name: retart httpd service service: name=httpd state=restarted ``` - **tags** ``` 用途 给指定的任务定义一个调用标识,可以单独执行标签对应的动作 eg: - name: start service service: name=httpd state=started enabled=yes tags: rshttpd 调用 -t ansible-playbook -t notify_nginx_conf nginx.yml ansible-playbook -t inshttpd,rshttpd httpd.yml 多个动作可以共用一个标签,标签名重复时,对应的动作都会执行 ``` - **variables** ``` 变量名 由字母、数字、下划线组成,只能以字母开头 变量调用: {{ var_name }} 内建: (1) facts ansible setup facts 远程主机上的所有变量都可以直接调用 ansible testsrvs -m setup |less ansible testsrvs -m setup -a 'filter=ansible_hostname' filter 过滤 自定义: (1) 命令行传递,优先级最高 -e VAR=VALUE ansible-playbook -e varname=value ansible-playbook -e 'pkname=vsftpd' app.yml ansible all -m shell -a 'ss -tnl|grep 21' # 查看是否安装成功 ansible-playbook -e 'pkname=vsftpd pkname2=httpd' app.yml # 安装多个包 (2) hosts Inventory (a) 向不同的主机传递不同的变量 ; IP/HOSTNAME variable_name=value eg: ————————————————————————— [testsrvs] 192.168.1.24 http_port=81 192.168.1.25 http_port=82 ————————————————————————— (b) 向组内的所有主机传递相同的变量 ; [groupname:vars] variable_name=value eg: ——————————————————— [testsrvs:vars] nodename=www domainname=haha.com ——————————————————— 普通变量:主机组中主机单独定义,优先级高于公共变量 公共(组)变量:针对主机组中所有主机主机定义同一变量 (3) 在playbook中定义 vars: - var1: value - var2: value eg: _________________________ --- - hosts: testsrvs remote_user: root vars: - pkname: httpd - pkname2: vsftpd _________________________ (4) Inventory参数: 远程目标主机 ansible_ssh_host ansible_ssh_port ansible_ssh_user ansible_ssh_pass ansible_sudo_pass (5) 在角色调用时传递 roles: - { role: ROLE_NAME, var: value, ...} ``` 最后修改:2019 年 08 月 21 日 11 : 12 AM © 著作权归作者所有