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;
原文地址:https://www.cnblogs.com/sc-1067178406/p/10826862.html