一、Playbook剧本

通过 task 调用 ansible 的模块将多个 play 组织在一 个playbook中运行。

Playbook本身由以下各部分组成:

  • Tasks: 任务,即调用模块完成的某操作
  • Variables: 变量
  • Templates: 模板
  • Handlers: 处理器,当某条件满足时,触发执行的操作
  • Roles: 角色
playbook yaml语法是换行空两格,-和:后必须空一格

YAML:是一种非标记语言。是用来写配置文件的语言,非常简洁合强大;

YAML语法和其他语言类似,也可以表达散列表、标量等数据结构

结构通过空格来展示,序列里配置项通过 - 来表示;Map里的键值用:来分隔;YAML的扩展名为yaml

二、YAML配置文件

(1)yaml文件基本格式

  1. 大小写敏感
  2. 使用缩进表示层级关系
  3. 缩进时不允许使用tab键、只允许使用空格
  4. 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
hosts            	定义节点              
remote_user	        使用XX用户身份进行登陆
tasks	            任务
become:yes	        表示切换用户
become_user: mysql	表示切换到mysql用户,配合上一条使用
 1. name:	            为下面执行的操作起名

(2)yaml支持的数据结构

对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes)/ 字典(dictionary)

数组:一组按次序排列的值,又称为序列(sequence)/ 列表(list)

纯量:单个的、不可再分的值

三、Inventory 变量

Inventory是Ansible管理主机信息的配置文件,相当于系统HOSTS文件的功能,默认存放在/etc/ansible/hosts

1、主机变量

[web1]
www.lfp1.com
www.lfp2.com

2、组变量

[servers:vars]

3、组嵌套

[web1]
www.lfp1.com
www.lfp2.com

[web2]
www.lfp3.com
www.lfp4.com

[webservers]
web1
web2

inventor 变量参数

ansible_ssh_host	     '将要连接的远程主机名,与你想要设定的主机的别名不同的话,可通过此变量设置'
ansible_ssh_port         'ssh 端口号,如果不是默认的端口号,通过此变量设置'
ansible_ssh_user	     '默认的ssh用户名'
ansible_ssh_pass	     'ssh密码(这种方式并不安全,我们强烈建议使用 --ask-pass或SSH密钥)'
ansible_ssh_private_key_file	'ssh使用的私钥文件,适用于有多个密钥,而你不想使用SSH代理的情况'
ansible_ssh_common_args	 '此设置附加到sftp,scp和ssh的缺省命令行'
ansible_sftp_extra_args	 '此设置附加到默认sftp命令行'
ansible_scp_extra_args	 '此设置附加到默认scp命令行'
ansible_ssh_extra_args	 '此设置附加到默认ssh命令行'
ansible_ssh_pipelining	 '确定是否使用SSH管道。这可以覆盖ansible.cfg中得到设置'
ansible_shell_type	     '目标系统的shell类型,默认情况下,命令的执行使用sh语法,可设置为csh 或 fish'
ansible_python_interpreter	'目标主机的python路径,适用于的情况:系统中有多个python,或者命令路径不是'“/usr/bin/python”
ansible_*_interpreter	 '这里的*可以是ruby或perl或其他语言的解释器,作用和ansible_python_interpreter类似'
ansible_shell_executable	'这将设置ansible控制器将在目标机器上使用的shell,覆盖ansible.cfg中的配置,默认为/bin/sh'

基本命令介绍

ansible-playbook xxx.yaml --syntax-check   			   		 '检查yaml文件的语法是否正确'
ansible-playbook xxx.yaml --list-task     					 '检查tasks任务'
ansible-playbook xxx.yaml --list-hosts     					 '检查生效的主机'
ansible-playbook xxx.yaml --start-at-task='xxx'			     '指定从某个task开始运行'
参数
-k(-ask-pass)	用来交互输入ssh密码
-K(-ask-become-pass)	用来交互输入sudo密码
-u	指定用户
-e	引入变量值

四、tasks忽略错误,强制返回

Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始。在运行playbook时(从上到下执行),如果一个host执行task失败, 整个tasks都会停止。

每一个task必须有一个名称 name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。

示例:遇到错误task会停止,剧本不会继续执行下去

vim cw.yaml

- hosts: webserver
  remote_user: root
  tasks:
  - name: stop selinux
    command: '/usr/sbin/setenforc 0'
  - name: install httpd
    yum: name=httpd
  - name: start httpd
    service: name=httpd state=started

ansible-playbook cw.yaml

'加入ignore_errors: True 参数会忽略错误,报错后继续执行'

vim qz.yaml

- hosts: webserver
  remote_user: root
  tasks:
  - name: stop selinux
    command: '/usr/sbin/setenforc 0'
    ignore_errors: True
  - name: install httpd
    yum: name=httpd
  - name: start httpd
    service: name=httpd state=started
                                                   
ansible-playbook qz.yaml

五、Handlers概述

Handlers也是一些task的列表, 和一般的task并没有什么区别。

是由通知者进行的notify,如果没有被notify,则Handlers不会执行,假如被notify了,则Handlers被执行不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次

vim ha.yaml

- hosts: all
  remote_user: root
  tasks:
  - name: remove httpd
    yum: name=httpd state=absent

  - name: start firewalld
    service: name=firewalld state=started

  - name: setenforce 0 && install httpd
    command: '/usr/sbin/setenforce 0'
    notify:
    - step only

  - name: stop firewalld && start httpd
    service: name=firewalld state=stopped
    notify:
    - step only2

  handlers:

  - name: step only
    yum: name=httpd

  - name: step only2
    service: name=httpd state=started


ansible-playbook ha.yaml

六、引入变量

playbook引入变量有三种方式

  1. 通过ansible命令参数-e传递
  2. 直接在yaml中定义
  3. 引用主机清单中定义的变量

七、条件测试

如果需要根据变量、facts (setup) 或此前任务的执行结果来作为某task执行与否的前提时要用到条件测试,在Playbook中条件测试使用。在task后添加when子句即可使用条件测试 : when子句支持 jinjia2 表达式或语法

单条件判断

vim dan.yaml

 - hosts: all
   remote_user: root
   tasks:
     - name: "shutdown CentOS"
       command: /sbin/shutdown -h now
       when: ansible_distribution == "CentOS"

ansible-playbook dan.yaml

多条件判断

vim duo.yaml

- hosts: all
  remote_user: root
  tasks:
  - name: "shut down CentOS 7 systems"
    command: /sbin/shutdown -r now
    when:
    - ansible_distribution == "CentOS"
    - ansible_distribution_major_version == "7"

ansible-playbook duo.yaml

组条件判断

vim zu.yml
 
- hosts: all
  remote_user: root
  tasks:
  - name: "shut down CentOS 6 and Debian 7 systems"
    command: /sbin/shutdown -t now
    when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "6") or (ansible_distribution == "Debian" and ansible_distribution_major_version == "7")

ansible-playbook zu.yaml

八、迭代

当有需要重复性执行的任务时,可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句指明迭代。

vim dd.yaml

- hosts: all
  remote_user: root
  tasks:
  - name: install
    yum: name={{item}} state=latest
    with_items:
    - httpd
    - tree
    - gcc

ansible-playbook dd.yaml
ansible all -a 'rpm -q httpd'
ansible all -a 'rpm -q rpcbind'
ansible all -a 'rpm -q nfs-utils'

五、熟练掌握练习题

例:为所有组创建一个so用户并批量测试连接性

cd /opt
vim a.yaml

- hosts: all
  remote_user: root
  tasks:
  - name: test connection
    ping:
    remote_user: so
	
ansible all -m user -a 'name=so'
ansible all -m shell -a 'echo abc123 | passwd --stdin so'
ansible-playbook 1.yaml -k
abc123

例:指定远程主机切换用户执行剧本

vim b.yaml

- hosts: mysql
  remote_user: root
  become: yes         
  become_user: mysql   
  tasks:
  - name: copy text
    copy: src=/etc/fstab dest=/home/mysql/fstab.bak

ansible-playbook b.yaml