ansible playbooks 总结

基本格式

---
主机名
hosts: string 
#执行操作的用户
remote_user: string
#执行的任务:
tasks:
- name: task1
  ....
- name: task2
  ...

handlers

handlers 类似于函数的作用,是多个任务的集合,可以被其他的tasks调用,但是与函数有一点不同,调用了handles不一定会执行,只有当调用它的tasks发生了实质性的执行(比如修改一个文件内容并修改文件权限,handlers内容为修改文件权限,当文件内容没有被修改,就不会执行hanlers当中tasks)

head的执行顺序与其在playbooks当中的顺序相同并不是使用notify调用了headlers当中的任务执行的顺序就发生了改变,如果需要执行执行玩对应的任务之后立即执行headlers当中指定的任务。可以使用meta模块。

也可以使用listen关键字对headlers当中的不同类别的进行分组,这个时候使用notify 进行调用分组的名字即可

示例:安装tomcat,修改完成之后重启服务

---
- hosts: tomcat-web
  remote_user: tomcat
  tasks:
  - name: install_tomcat
    copy: src=apache-tomcat-8.5.54.tar.gz dest=/home/
    script: /home/ansible_test/install.sh
   	notifiy: system_group
   	
  - meta: flush_headlers
 
   	headlers:
  	  tasks: tomcat_start
  	  - name: start_tomcat
  	  	listen: system_group
  	    service: name=tomcat state=start enable=yes
  	  - name: selinux_stop
  	  	listen: system_group
  	  	shell: setenforce 0
  

install.sh

#!/bin/bash
if [ -e /home/apache-tomcat-8.5.54.tar.gz ];then
	cd /home/ && tar -xf apache-tomcat-8.5.54.tar.gz
	ln -s apache-tomcat-8.5.54 tomcat
	if [ $? -eq 0 ]; then
		yum install java-1.8.0-openjdk.x86_64 -y >>/dev/null
	fi
	cd /home/tomcat/
	make && make install >>/dev/null
fi

tags

上面说到headlers即是调用playbook

标签:为每个任务打上自己的标签,需要使用某个任务的功能直接使用标签调用此任务即可。一个任务可以含有多个标签。

示例:

- hosts: tomcat-web
  remote_user: tomcat
  tasks:
  - name: install_tomcat
    copy: src=apache-tomcat-8.5.54.tar.gz dest=/home/
    script: /home/ansible_test/install.sh
   	notifiy: system_group
   	tags:
   	  - install_tomcat
   	  - inital
   	  
  - meta: flush_headlers
      
  - name: selinux_stop
  	listen: system_group
  	shell: setenforce 0
  	tags:
      - selinux_stop
      - system
 
   	headlers:
  	  tasks: tomcat_start
  	  - name: start_tomcat
  	  	listen: system_group
  	    service: name=tomcat state=start enable=yes

在使用时可以指定参数调用playbooks当中的含有某个标签的任务

ansible-playbook --tags=tomcat_install,system tomcat.yml

或者时不执行playbook当中的某个任务

ansible-playbook --skip-tags=selinux_stop tomcat.yml

ansible当中含支持五个特殊的标签

标签 说明
always 任务总是执行,除非使用–skip-tags指定其不执行时才会不执行。
never 不执行,除非用tags指定其执行
tagged 执行有标签的任务
untaged 执行没有标签的任务
all 执行说有,默认情况就使用的all

变量

ansible当中的变量由字母,下划线,变量应由字母开头,ansible内置变量不能作为自定义变量名。

定义变量

定义变量需要借助关键字:vars,使用变量使用{{}}使用。

示例:

---
- hosts: host
  remote_user: root
  vars:
    USER_GROUP_NAME: ansible
  tasks:
  - name: copy test.sh
    copy: src=test.sh dest=/home/ansible_test/ backup=yes owner={{USER_GROUP_NAME}} group={{USER_GROUP_NAME}} mode=0664

定义多个变量:

vars:
  USER_GROUP_NAME: ansible
  TOMCAT_PATH: /home/tomcat/

子变量

变量当中可以包含多个变量,它们同属于一个变量

vars:
	tomcat_path:
      server: /home/tomcat/conf/server.xml
  	  tomcat_user: /home/tomcat/conf/tomcat_user.xml

使用:

注意:冒号使用时的双引号,等号使用时则没有

path: "{{tomcat_path.server}}"
或
path={{tomcat_path.server}}

引用其它playbooks的变量

当一个playbook引用了其他得playbooks,自然其变量也成了这个playbooks的变量。

这个时候需要使用关键字: vars_files

示例:

定义一个变量文件tomcat_vars.yml

vars:
  tomcat_path:
  	server: /home/tomcat/conf/server.xml
  	tomcat_user: /home/tomcat/conf/tomcat_user.xml

引用:

---
- hosts: tomcat
  remote_user: tomcat
  vars_files:
  - tomcat_var.yml
  tasks:
  	- name: touch_file
  	  file:
  	  	path={{tomcat_path.server}}
  	  	state: touch

注册变量

在一些情况下ansible不会显示执行之后的返回值,只能看到执行的流程,与执行的结果。怎么才能实现获取执行的返回值,这个需要注册变量,register关键字表示。ansible会把执行的信息写入这个变量当。使用debug显示其结果。

---
- hosts: host
  remote_user: root
  tasks:
  - name: 1
    shell: "echo 1> /dev/null"
    register: vars_test
  - name: debug_1
    debug:
      msg: "{{vars_test}}"

结果:

TASK [debug_1] ******
ok: [192.168.10.20] => {
    "msg": {
        "changed": true, 
        "cmd": "echo 1> /dev/null", 
        "delta": "0:00:00.006167", 
        "end": "2020-05-11 17:40:59.463422", 
        "failed": false, 
        "rc": 0, 
        "start": "2020-05-11 17:40:59.457255", 
        "stderr": "", 
        "stderr_lines": [], 
        "stdout": "", 
        "stdout_lines": []
    }
}

tasks当中设置变量

除了可以在tasks之外对变量进行设置,也可以通过set_facts 关键字实现在tasks当中进行环境变量的设置。

示例:

- hosts: host
  remote_user: root
  tasks:
  - set_facts:
  		user_name: ansible
  tasks:
  - name: show set_facts
  	debug:
  		msg: "{{user_name}}"

主机清单当中的变量

变量 含义
ansible_version ansible的版本号
hostvars 远程主机的信息,只有当执行了【gathering facts】之后hostvars才会存在数值
inventory_hostname 获取当前/etc/ansible/host/当中的配置的主机信息
inventory_hostname_short 获取当前play操作的主机在清单中对应的名称
play_hosts 获取到当前play所操作的所有主机的主机名列表
groups 可以获取到清单中"所有分组"的"分组信息"
group_names 获取到当前主机所在分组的组名
inventory_dir 获取到ansible主机中清单文件的存放路径

变量的使用

保存playbooks执行之后的返回信息

默认情况下载执行playbooks都会存在一个 【 Gathering Facts 】的任务,主要是收集远程主机的基信息(ip,系统版本,主机名,硬件等信息)。默认情况下不会显示这些信息,如果需要保存,可以使用变量

获取主机信息信息使用的是setup模块,获取主机的ip地址。

ansible host -m setup -a "filter=ansible_all_*_addresses"

调试模块debug,帮助我们进行调试

​ 例如我们需要将获取的IP地址输出:

---
- hosts: host
  remote_user: root
  tasks:
  - name: debug_test
    debug:
      msg: "{{ansible_memory_mb}}"

结果:

[root@zhang ansible_test]# ansible-playbook vars_debug.yaml 

PLAY [host] *******

TASK [Gathering Facts] *******
ok: [192.168.10.20]
TASK [debug_test] *******
ok: [192.168.10.20] => {
    "msg": {
        "nocache": {
            "free": 1576, 
            "used": 243
        }, 
        "real": {
            "free": 1267, 
            "total": 1819, 
            "used": 552
        }, 
        "swap": {
            "cached": 0, 
            "free": 819, 
            "total": 819, 
            "used": 0
        }
    }
}

PLAY RECAP *********
192.168.10.20              : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansible_memory_mb其实就是一个内置的变量,直接可以使用.

交互式

在某些情况下需要用户输入一些信息,这个时候需要使用vars_prompt 关键字

vars_prompt:
#输入的信息存入name当中,prompt为输入前的提示信息
	- name: "user_name"
	  prompt:"input_username:"

示例:创建用户以及用户的组


---
- hosts: host
  remote_user: host
  vars_prompt:
  - name: "user_name"
    prompt: "input username"
    
    default: user1
  - name: "group_name"
    prompt: "input groupname"
  - name: "user_password"
  	prompt:"input password"
  	#/etc/shdow 下的密码都是加密的,输入的密码也需要进行加密
  	encrypt "sha512_crypt"
  	#重复输入,验证两次密码是否一致
  	confirm: yes
  tasks:
  - name: create user
    user:
      owner: "{{user_name}}"
      group: "{{group_name}}"
      password: "{{user_password}}"
      state: present
      shell: "/sbin/nologin"

jinjia2模板

主要为了解决重复性的工作,将其设定为固定的模板,使用时可以直接调用。

下面为jinjia2模板常用的数据类型和操作符,以及涉及到的关键字:

字符串:使用单引号或者双引号

数字:整数,浮点数

列表: [item1,itemd2,…]

元组: [item1,item2,…]

字典: {key1:value1,key2:value2,…}

算数运算:+,-,* ,/ ,//(取整),%。

比较操作符:==,!=,>,>=,<,<=.

逻辑运算符:and ,or ,not

流表达式: for ,if ,when,with_items(迭代)

迭代:

解决一个重复性的任务

---
- host: nginx_web
  remote_user: root
  
  tasks:
  - name: create nginx data_file
  	file: name=/data/{{ item }}
 ## 使用固定的变量名item 调用 with_itemsde 	
  	with_items:
  	- web_data
  	- images
  	- videoes

templates

模板文件的存放位置,只能用户play-book当中,模板文件名:file_name.j2

变量的优先级:

ansible 命令行-e指定的变量>playbooks> hosts

## 在不同的系统版本centos安装不同的nginx,同时配置不同的nginx.conf
---
- host: nginx_web_server
  remote_user: root
  
  tasks:
  - name: install nginx
  	yum: name=nginx
  - name: config nginx6
  	temlate: src=nginx6.conf.j2 dest=/usr/local/nginx/nginx.conf
  	when: ansible_distribution_major_version=6
  	notify: restart nginx7
   - name: config nginx
  	temlate: src=nginx6.conf.j2 dest=/usr/local/nginx/nginx.conf
  	when: ansible_distribution_major_version=7
  	notify: restart nginx
  - name: start service
  	service: name=nginx state=started
  	
  headlers:
  - name: restart nginx
  	service: name=nginx state=restart
###
#在nginx.conf[6,7].j2 文件当中的我们需要进行通过变量进行配置,变量来源大致有三个: setup 模块当中的返回的json,playbook当中通过vars自定义的变量,hosts配置清单当中的变量。
# 如需要根据主机的核心数进行设置nginx work 进程的数量,配置如下:
# work 进程的数量时cpu个数的两倍,默认是auto
worker_processes {{ ansible_processor_vcpus }} * 2

ROLE

将一个play-books 进行模块话进行拆分,放在不同的目录下。

目录 解释
templates(常用) 模板文件目录
files(常用) 存放copy或script模块等调用的文件
tasks(常用) 任务文件目录,
headlers headlers任务,至少包含一个main文件
vars 变量文件目录,至少包含一个main文件
meta 定义当前角色的特殊设定以及依赖关系,至少包含一个main文件
defualts 设定默认变量时使用此目录中的mian文件。

每个文件当中的都存在一个mian.yaml.类似于c当中的main函数,mian.yaml通过include包含文件下的其他的yaml文件,实现整个文件的同一的调用如:

- include create_dir.yaml
- include git_checkout.yaml

                          |

| headlers | headlers任务,至少包含一个main文件 |
| vars | 变量文件目录,至少包含一个main文件 |
| meta | 定义当前角色的特殊设定以及依赖关系,至少包含一个main文件 |
| defualts | 设定默认变量时使用此目录中的mian文件。 |

ansible playbooks 总结_第1张图片
每个文件当中的都存在一个mian.yaml.类似于c当中的main函数,mian.yaml通过include包含文件下的其他的yaml文件,实现整个文件的同一的调用如:

- include create_dir.yaml
- include git_checkout.yaml

userconfig.yaml 这个文件时对roles文件夹下的不同任务进行调用的配置文件,需要调用那些任务,模板,变量,在这个文件当中的指定,注意此文件必须与role处于同一文件目录下。

你可能感兴趣的:(ansible)