1.Playbook定义
在Ansible中,将各个模块组合在一起的一个YAML格式的配置文件,称为playbook。一个playbook可以包含一个到多个play,每一个play是一个完整的任务。一个play必须包含两项内容,hosts与task。
--- - hosts: dbservers become: yes become_method: yes tasks: - name: install software yum: name=nginx state=present
task的定义的格式:module:options,以模块作为键,参数作为值。YAML的字符串不需要使用单引号或者双引号,因此上述的例子中,“name=nginx state=present”是一个完整的字符串。当参数较多时,可以使用 “>” 符号或者使用缩进子块的形式进行折叠换行来增加playbook的可读性。
task: - name: install software yum: > name=nginx state=present
实际使用过程中,我们建议每个playbook中只编写一个play,这样可以增加playbook的可读性和可维护性,以及在不同的任务中重复利用。我们可以通过include参数来导入playbook,被导入的playbook会依次执行。
--- - include: test1.yaml - include: test2.yaml
2.使用ansible-playbook执行playbook
ansible-playbook是一个命令行工具,使用方式如下:
ansible-playbook playbook.yaml
ansible-playbook的一些参数:
- -T –timeout:建立ssh连接的超时时间
- –key-file –private-key:建立ssh连接的私钥文件
- -i –inventory-file:指定inventory文件
- –f –forks:并发执行的进程数
- –list-hosts:列出执行任务的服务器列表
- –list-tasks:列出任务列表
- –step:每执行完一个任务后停止,等待用户确认
- –syntax-check:检查playbook的语法
- -C –check:检查当前playbook是否会修改远程服务器,相当于预测执行结果
3.Playbook的详细语法
3.1权限
在Ansible中,默认使用当前用户执行远程服务器操作。除了在ansible.cfg中定义默认用户,我们也可以通过remote_user指定执行play的用户。
--- - hosts: dbservers remote_user: root tasks: - name: install software yum: name=nginx state=present
也可以细分每一个task:
--- - hosts: dbservers remote_user: root tasks: - name: install software yum: name=nginx state=present remote_user: username
当任务执行需要更高级别的权限时,使用管理员身份去执行操作,可以通过become和become_method(默认为sudo)参数,也可以细分每一个task。
--- - hosts: dbservers remote_user: root become: yes become_method: sudo tasks: ....
3.2通知
在Ansible中,模块是幂等的,也就是说执行相同的操作,只有第一次才起作用。比如我们要在远程服务器创建一个用户,如果该用户已经存在,那么该任务不会执行,而是直接返回成功。
日常工作中可能会有这样一种情况,我们需要通过ansible修改远程服务器nginx的配置文件,并重启nginx服务。如果此时配置文件内容和我们想要修改的内容是一致的,那么此时就不应该重启nginx服务。在Ansible中,通过notify和handler级制来处理这种情况。
hander是ansible提供的条件机制。只有当notify被触发后,handler才会被执行。那么又是通过什么条件判断notify触发的是哪一个handler呢?那就是task使用handler的名字作为参数,以此来促发handler。
.... tasks: - name: install nginx yum: name=nginx state=latest - name: copy nginx config file template: src=/root/nginx.conf.j2 dest=/etc/nginx/nginx.conf notify: restart nginx handlers: - name: restart nginx service: name=nginx state=restarted
需要注意的是,handler不会在notify被触发的时候立即执行,而是在所有的task执行完成后执行,并且只会执行一次,即使notify被触发多次。官方文档中提法到,handler唯一的用途就是重启服务或者服务器。
3.3变量
在变量比较少的情况下,我们可以直接将变量定义在vars参数中;当变量比较多的时候,可以将变量保存在一个独立的文件中。
--- - hosts: webservers vars: worker_processes: 4 vars_files: - /ansible/vars.yaml
[root@Ansible ansible]# cat /ansible/vars.yaml ansible_port: 2222
3.3.1注册变量
注册变量就是获取任务的执行的结果,将任务的执行结果保存在一个变量中,并在之后引用这个变量。在Ansible中通过register参数获取。
.... tasks: - name: install nginx yum: name=nginx state=latest register: install_result ignore_errors: True - name: xxx when: install_result | succeeded
3.4facts变量
facts变量是ansible执行远程任务之前从远程服务器中获取的系统信息。可以通过setup模块查看变量列表。获取到的变量可以直接在playbook中使用。
3.5循环
.... tasks: - name: install nginx yum: name={{ item }} state=latest with_items: - nginx - mysql-server
3.6条件
Ansible没有条件语句,但是提供了一个类似if语句的参数,那就是when参数。
.... tasks: - name: install nginx yum: name=nginx state=latest when: ansible_os_family == "CentOS"
when参数的条件可以使用and,or和括进行定义;也可以读取变量的值,或者与循环一起使用。
3.7任务执行的策略
Ansible是以task为单位执行任务,默认使用5个进程。默认当所有服务器都执行完task1之后才会执行task2。为了允许执行较快的服务器提前完成部署任务,我们可以使用free参数,这样就不需要等待其他服务器一起执行task。
--- - hosts: webservers strategy: free
「 文章如果对你有帮助,请点个赞哦^^ 」 
若无特殊注明,文章均为本站原创或整理发布。
转载请注明本文地址:https://om.fangxiaoxiong.com/3127.html