---
主机名
hosts: string
#执行操作的用户
remote_user: string
#执行的任务:
tasks:
- name: task1
....
- name: task2
...
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
上面说到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}}
当一个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之外对变量进行设置,也可以通过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都会存在一个 【 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模板常用的数据类型和操作符,以及涉及到的关键字:
字符串:使用单引号或者双引号
数字:整数,浮点数
列表: [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
模板文件的存放位置,只能用户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
将一个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文件。 |
每个文件当中的都存在一个mian.yaml.类似于c当中的main函数,mian.yaml通过include包含文件下的其他的yaml文件,实现整个文件的同一的调用如:
- include create_dir.yaml
- include git_checkout.yaml
userconfig.yaml 这个文件时对roles文件夹下的不同任务进行调用的配置文件,需要调用那些任务,模板,变量,在这个文件当中的指定,注意此文件必须与role处于同一文件目录下。