Ansible 的脚本 --- playbook 剧本
playbooks 本身由以下各部分组成
(1)Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行
(2)Variables:变量
(3)Templates:模板
(4)Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作
(5)Roles:角色
apache的剧本:
ansible-playbook test1.yaml
//补充参数:
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户
ansible-playbook test1.yaml --syntax-check #检查yaml文件的语法是否正确
ansible-playbook test1.yaml --list-task #检查tasks任务
ansible-playbook test1.yaml --list-hosts #检查生效的主机
ansible-playbook test1.yaml --start-at-task='install httpd' #指定从某个task开始运行
- name: second play
hosts: dbservers
remote_user: root
vars: #定义变量
- groupname: mysql #格式为 key: value
- username: nginx
tasks:
- name: create group
group: name={{groupname}} system=yes gid=306 #使用 {{key}} 引用变量的值
- name: create user
user: name={{username}} uid=306 group={{groupname}}
- name: copy file
copy: content="{{ansible_default_ipv4}}" dest=/opt/vars.txt #在setup模块中可以获取facts变量信息
ansible-playbook test1.yaml -e "username=nginx" #在命令行里定义变量
---
- hosts: dbservers
remote_user: zhangsan
become: yes #2.6版本以后的参数,之前是sudo,意思为切换用户运行
become_user: root #指定sudo用户为root
执行playbook时:ansible-playbook test1.yml -k -K
在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。
//when一个比较常见的应用场景是实现跳过某个主机不执行任务或者只有满足条件的主机执行任务(特殊的任务给特殊的主机执行)
- name:
....
tasks:
- name: XXXX
模块: ....
when: 变量名 条件运算符 "值" when判断结果为true才会执行当前任务,false不执行任务
== != >= <=
Ansible提供了很多种循环结构,一般都命名为with_items,作用等同于 loop 循环。
横向格式:
user: name=zhangsan groups={{item}}
纵向格式:
user:
name: zhangsan
groups: "{{item}}"
with_items 的编写格式
横向格式:
值为纯量时
with_items: ["a", "b", "c"]
值为纯量对象时
with_items:
- {key1: value1, key2: value2}
- {key1: value3, key2: value4}
纵向格式:
值为纯量时
with_items:
- a
- b
- c
值为纯量对象时
with_items:
- key1: value1
key2: value2
- key1: value3
key2: value4
with_items with_flattened with_list loop
- a
- b
- c
在处理单层列表(每个列表只有一个元素)时,上面几个循环结构体是没有区别的,都会把每个列表的值遍历一遍
with_items with_flattened with_list loop
- [a, b, c]
- [1, 2, 3]
- [A, B, C]
在处理嵌套的多层列表(每个列表只有多个元素)时,with_items 和 with_flattened 会将嵌套列表拉平扩展,将循环处理所有的元素
with_list 和 loop 不会嵌套列表拉平扩展,只会按照最外层的列表进行循环处理
with_together 将几个列表的元素对齐合并后输出,比如第一个列表的第一个元素和第二个列表的第一个元素合并输出
第一个列表的第二个元素和第二个列表的第二个元素合并输出
with_nested 和 with_cartesian 将每个列表的元素分别组合循环输出,比如 a1A a1B a1C a2A a2B a2C ...
运行playbook
ansible-playbook XXX.yaml --syntax-check 检查剧本的语法是否正确
--list-task 列出剧本里的所有任务
--list-hosts 列出剧本在哪些主机执行
--start-at-task='任务名称' 指定从哪个任务开始执行
1)先要准备一个 xxx.j2 模板文件,在文件中使用 {{变量名}} 引用主机变量 或者 vars自定义的变量 及 facts 字段的值
2)在 playbook 中的 tasks 中定义 template 模板配置 template: src=XXX.j2 dest=XXX
根据 tags 标签仅执行拥有指定 tags 标签的任务,always 标签在指定任意标签时都会执行
- name:
....
tasks:
- name: XXXX
模块:
tags:
- 标签1
- 标签2
- name: XXXX
模块:
tags:
- always
ansible-playbook --tags="标签" XXX.yaml
角色 roles 的作用?
把 playbook 里的各个 play 看作为角色,将各个角色的 tasks 任务、vars 变量、templates 模块、files 文件等内容放置到角色的目录中统一管理,需要的时候可在 playbook 中直接使用 roles 调用,所以 roles 可以实现代码的复用。
用roles运行一个nginx:
前期准备:
mkdir /etc/ansible/roles/nginx
mkdir /etc/ansible/roles/nginx/{files,templates,tasks,handlers,vars,defaults,meta}
touch /etc/ansible/roles/nginx/{defaults,vars,tasks,meta,handlers}/main.yml
①本地安装nginx,复制/etc/nginx/conf.d/default.conf到/etc/ansible/roles/nginx/template/default.conf.j2
修改里面的监听、host、php的内容等等
②在/etc/ansible/roles/nginx/vars/main.conf增加变量值
③在tasks里面添加init.yml
内容:
- name: disable selinux
command: '/usr/sbin/setenforce 0'
ignore_errors: true(如果关了忽略)
- name: disable firewalld
service: name=firewalld enabled=no state=stopped
④把/etc/yum.repos.d/nginx.repo复制到/etc/ansible/roles/nginx/files里面
并且创建index.php
phpinfo();
?>
⑤编写task里面的main.yml
- include: init.yml
- name: copy nginx.repo file
copy: src=nginx.repo dest=/etc/yum.repos.d
- name: yum nginx
yum: name=nginx state=latest
- name: copy index.php
copy: src=index.php dest={{root_dir}}
- name: copt template file
template: src=default.conf.j2 dest=/etc/nginx/conf.d/default.conf
notify: restart nginx
- name: start nginx
systemd: name=nginx enabled=true state=started
⑥编写/etc/ansible/roles/nginx/handles里面的main.conf文件
- name: restart nginx
service: name={{pkg}} state=restarted
⑦在ansible底下创建playbook,里面创建lnmp.yml
- name: nginx lnmp
hosts: webservers
remote_user: root
roles:
- nginx
⑧在palybook下使用:ansible-playbook lnmp.nginx去启动