ansible --- 4. playbook
一. playbook格式
Usage: ansible-playbook [options] playbook.yml [playbook2 ...]
(代码执行格式)
optons: -C, --check #白跑,执行但是不会有结果
--list-hosts #列出符合的主机
-f FORKS, --forks=FORKS #做并发
--syntax-check #检查语法
-k, --ask-pass #输入密码
补充:
① vi 的快捷操作
yy 复制一行
# yy 复制多行
p 粘贴
dd 删除一行
# dd 删除多行
d$ 从当前位置删除到结尾
②echo的操作
echo `date +%F`
echo $(date +%F)
a=10
echo '$a'
$a
echo "$a"
10
二. setup 模块(收集某主机信息)
ansible_all_ipv4_addresses #所有的ipv4地址 ansible_all_ipv6_addresses #所有的ipv6地址 ansible_architecture #系统的架构 ansible_date_time #系统时间 ansible_default_ipv4 #默认的ipv4地址 address ip地址 alias 网卡名称 broadcast 广播地址 gateway 网关 netmask 子网掩码 network 网段 ansible_default_ipv6 #默认的ipv6地址 ansible_device_links #系统的磁盘信息 ansible_distribution #系统名称 ansible_distribution_file_variety #系统的基于公司 ansible_distribution_major_version #系统的主版本 ansible_distribution_version #系统的全部版本 ansible_dns #系统的dns 默认udp 端口53 ansible_domain #系统的域 ldap ipv4 #ipv4地址 ansible_env #系统的环境 ansible_fqdn #系统的完整主机名 ansible_hostname #系统的简写主机名 ansible_kernel #系统的内核版本 ansible_machine #系统的架构 ansible_memtotal_mb #系统的内存 ansible_memory_mb #系统的内存使用情况 ansible_mounts #系统的挂载信息 ansible_os_family #系统家族 ansible_pkg_mgr #系统的包管理工具 ansible_processor #系统的cpu ansible_processor_cores #每颗cpu的核数 ansible_processor_count #cpu的颗数 ansible_processor_vcpus #cpu的个数=cpu的颗数*每颗cpu的核数 ansible_python #系统python信息 ansible_python_version #系统python的版本 ansible_system #系统名字
三. .yaml (.yml)文件的基本格式
字典 key:value
- alex
- wusir
- yantao
- yuchao
[alex,wusir,yantao,yuchao]
-
-
横线后面必须要空格
-
严格保持对齐
-
等号前面不能有空格
1.单个的playbook
仅创建一个用户
- hosts: web remote_user: root (默认是root) tasks: - name: createuser user: name=alex20 home=/opt/alex20 uid=4000
执行时的代码为:
ansible-playbook 文件名.yml
2.多个playbook
创建一个用户 和 复制文件
- hosts: web remote_user: root tasks: - name: createuser user: name=alex20 home=/opt/alex20 uid=4000 - name: copyfile copy: src=/etc/fstab dest=/tmp/fs
执行时的代码:
ansible-playbook 文件名.yml
3.传参
优先级:
-e > playbook > hosts
①第一种方式
把要创建的用户名 在执行文件时传入
- hosts: web tasks: - name: create{{user}} user: name={{user}}
执行时的代码: ansible-playbook -e user=wusir20 p3.yml
②第二种方式
修改 hosts 配置文件 加入 user
hosts文件中:
[web] 192.168.226.[101:102] user=alex30 192.168.226.104 user=alex100
在playbook 文件中:
- hosts: web
tasks:
- name: create{{user}}
user: name={{user}}
直接执行playbook文件:
ansible-playbook 文件名.yml
③第三种方式
修改hosts配置文件:
[web:vars]
user=alex31
在playbook 文件中内容如上
直接执行playbook文件:
ansible-playbook 文件名.yml
④第四种方式
修改playbook文件
- hosts: web vars: - user: alex32 tasks: - name: create{{user}} user: name={{user}}
直接执行playbook文件:
ansible-playbook 文件名.yml
⑤第五种方式
修改 playbook文件
- hosts: web tasks: - name: yum yum: name=bc #下载bc计算组件 - name: sum shell: echo 11+22|bc register: user # 注册成变量,返回结果为后面使用
- name: create{{user.stdout}} user: name=alex{{user.stdout}}
直接执行playbook文件:
ansible-playbook 文件名.yml
4.tags(标签,只执行带标签的代码)
在playbook 中加入标签
- hosts: web tasks: - name: install yum: name=redis - name: copyfile copy: dest=/etc/redis.conf src=/etc/redis.conf tags: copy - name: start service: name=redis state=started
执行时的代码(仅运行标签所在的一项): ansible-playbook -t copy p7.yml
5.handlers(改变时 触发 某一项)
在 playbook 文件中加 notify;和 handlers
- hosts: web tasks: - name: install yum: name=redis - name: copyfile copy: dest=/etc/redis.conf src=/etc/redis.conf tags: copy notify: restart #改变时触发 - name: start service: name=redis state=started handlers: #触发项 - name: restart service: name=redis state=restarted
执行时的代码(仅运行标签所在的一项):
ansible-playbook -t copy p7.yml
6.template 模块(基于jinja2)
可以进行动态替换
用法,作用和copy一样
①绝对路径
利用收集的信息
在playbook 文件中
- hosts: web tasks: - name: install yum: name=redis - name: copyfile template: dest=/etc/redis.conf src=/etc/redis.conf #将copy直接替换 tags: copy notify: restart - name: start service: name=redis state=started handlers: - name: restart service: name=redis state=restarted
在 redis.conf 文件中(利用收集的信息保证安全)
执行时的代码(仅运行标签所在的一项): ansible-playbook -t copy p7.yml
copy完成之后就引用了收集的信息
②相对路径
mv redis.conf{,.j2} = mv redis.conf redis.conf.j2
- hosts: web tasks: - name: install yum: name=redis - name: copyfile template: dest=/etc/redis.conf src=redis.conf.j2 tags: copy notify: restart - name: start service: name=redis state=started handlers: - name: restart service: name=redis state=restarted
在当前目录下创建一个templates的目录,
把要copyd的文件放在 templates 文件下
就可以使用相对路径
执行时的代码(仅运行标签所在的一项): ansible-playbook -t copy p7.yml
7.when (类似于python 中的 if)
- hosts: web tasks: - name: copyfile copy: content="大弦嘈嘈如急雨" dest=/tmp/a.txt when: ansible_distribution_major_version=="7" #利用收集的信息 - name: copyfile copy: content="小弦切切如私语" dest=/tmp/a.txt when: ansible_distribution_major_version=="6"
执行时的代码: ansible-playbook p7.yml
- hosts: web tasks: - name: copyfile copy: content="大弦嘈嘈如急雨" dest=/tmp/a.txt when: user=="4" - name: copyfile copy: content="小弦切切如私语" dest=/tmp/a.txt when: user=="3"
执行时的代码:
ansible-playbook -e user=4 p3.yml
只执行第一项
8.with_items (类似于python中的 while)
①.循环
创建多个用户
- hosts: web tasks: - name: createuser user: name={{item}} with_items: - alex50 - wusir50 - taibai50
执行时的代码: ansible-playbook p7.yml
创建多个用户 和 多个组(创建完用户再创建组)
- hosts: web tasks: - name: createuser user: name={{item}} with_items: - alex51 - wusir51 - taibai51 - name: creategroup group: name={{item}} with_items: - alex60 - wusir60 - taibai60
执行时的代码: ansible-playbook p7.yml
②嵌套循环
创建用户并添加属组
- hosts: web tasks: - name: crateuser user: name={{item.name}} group={{item.group}} with_items: - {"name":alex52,"group":alex60} - {"name":wusir52,"group":wusir60} - {"name":taibai52,"group":taibai60}
执行时的代码: ansible-playbook p7.yml
九. roles (角色)
- 目录结构清晰
- 可以相互调用 - import_tasks: roles/nginx/tasks/install.yml
- 备份方便
①
roles/nginx/ ├── files -- 静态文件 │ └── c.txt ├── handlers -- 触发的任务 │ └── main.yml ├── tasks -- 任务(必须的) │ ├── copyfile.yml │ ├── install.yml │ ├── main.yml │ └── start.yml ├── templates -- 动态文件,需要传递参数 │ └── nginx.conf └── vars -- 变量 └── main.yml
查找顺序: - 主文件看到roles,就回去roles目录下面找对应的目录 - 先去tasks目录里面找main.yml文件,如果遇到import_task则加载任务 - 如果遇到了template,则去templates目录里面找文件 - 如果遇到了copy,则去files目录里面找文件 - 如果遇到了变量,则去vars目录里面找main.yml文件 - 如果遇到了notify,则去handlers目录里面找main.yml文件
②
③启动
十.补充( 回忆 nginx+uwsgi)
第一种方式 uwsgi的配置 http = 0.0.0.0:8000 nginx的配置 proxy_pass http://127.0.0.1:8000; pkill -9 uwsgi 杀掉uwsgi的进程
第二种方式 uwsgi的配置 socket = 0.0.0.0:8000 nginx的配置 include /etc/nginx/uwsgi_params; uwsgi_pass 127.0.0.1:8000;
第三种方式 uwsgi的配置 socket = /data/mysite/mysite.socket nginx的配置 include /etc/nginx/uwsgi_params; uwsgi_pass unix:/data/mysite/mysite.socket;