ansible-playbook快速入门填坑

参考另外一篇文章

http://blog.51cto.com/weiweidefeng/1895261

 when条件 参考http://blog.51cto.com/breezey/1757593

安装目录:

    程序:
        ansible
        ansible-playbook 
        ansible-doc
    配置文件:
        /etc/ansible/ansible.cfg
    主机清单:
        /etc/ansible/hosts 
    插件目录:
        /usr/share/ansible_plugins/

ansible playbook

   roles/{mysql,nginx,..}/ 目录结构

defaults   默认寻找路径
tasks      此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用;
files      存储由copy或script等模块调用的文件
templates  存储由template模块调用的模板文本;
handlers   notify调用部分,此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行“包含”调用;
vars       roles内变量存放路径,此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行“包含”调用;
meta 此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用;
ansible.cfg 覆盖/etc/ansible/ansible.cfg的相同配置,如下配置在nginx目录下,作用是:添加一个ansible查找role的路径,这样ansible-playbook运行时可以识别到路径


运行playbook,使用ansible-playbook命令

    (1) 检测语法
        ansible-playbook  --syntax-check  /path/to/playbook.yaml
    (2) 测试运行
        ansible-playbook -C /path/to/playbook.yaml
            --list-hosts
            -list-tasks
            --list-tags
    (3) 运行
        ansible-playbook  /path/to/playbook.yaml
            -t TAGS, --tags=TAGS
            --skip-tags=SKIP_TAGS
            --start-at-task=START_AT
1.任务:tasks   main.yml  主要执行的操作
---
-name install nginx
yum: name=nginx state=present #yum安装软件
-name start service nginx
service: name=nginx state=restarted #service重启
2.变量:Variables
  第一种、自定义变量
    ---
    - hosts: all
 vars:
        key: aaa
        kkk: bbb
     tasks:
      - name display vars
       debug: msg='{{key}}--->{{kkk}}'  
  第二种 自定义变量 通过文件
#vars.yml
    ---
    - hosts: all
     vars_files:
      - var.file  
     tasks:
      - name display vars
       debug: msg='{{key}}--->{{kkk}}'  
     #var.yml
---
     key: 111
     kkk: 222
第三种 第一个task结果的值传递给第二个task register    
    ---
    - hosts: all
     tasks:
      - name register vars
        shell: hostname
       register: info #shell里的hostname值传给info
      - name display vars
       debug: msg='{{info.stdout}}' #info是个字典,取key为stdout的值
第四种 循环执行任务 with_items
    4.1 一层for循环
    ---
    - hosts: all
     tasks:
      - name debug
       debug: msg='{{item.key}},,,{{item.valu}}'
       with_items:
        - {key: "aa",value: "bb"}
        - {key: "cc",value: "dd"}
    4.2 嵌套循环 for for..
     ...
       debug: msg='{{item[0]}} , {{item[1]}}'
       with_nested:
        - ["a","b"]
        - ["A","B","C"]
3.模板:Templates    nginx.conf.j2 (*.j2结尾)
文本文件,内部嵌套有模板语言脚本(使用Jinja2模板语言编写)
4.角色:roles    main.yml

以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等目录;

5.执行入口yml
---
- hosts: all
 gather_facts: no
roles:
- nginx #这里填写目录,比如nginx目录 mysql目录等

inventory 静态文件

#host-------------这一行不在如下文件内
---
- hosts all
  remote_user: root #远程ssh主机认证用户
  gather_facts no #执行ansible时,不收集远端主机信息,执行速度会加快
  vars:
    nginx_ports:80
  vars_files:
    - "b.yml" #音乐var文件,当前路径

  ansible -i  (hosts文件或hosts目录) 

inventory 动态文件

  动态inventory的意思是所有的变量可以从外部获取,也就是说我们可以从CMDB以及zabbix系统拉取所有的主机信息然后使用ansible进行管理。

cat  inverti.py
#!/usr/bin/env python
# coding=utf-8
import json
host1ip = ['192.168.1.15']
host2ip = ['192.168.1.110']
group = 'test11'
group2 = 'test22'
hostdata = {group:{"hosts":host1ip},group2:{"hosts":host2ip}}
print json.dumps(hostdata,indent=4)

  执行命令

[root@vagrant-centos65 opt]# ansible -i inverti.py all  -a 'uptime' -k
SSH password: 
192.168.1.15 | SUCCESS | rc=0 >>
 07:25:27 up  3:56,  3 users,  load average: 0.00, 0.00, 0.00
192.168.1.110 | SUCCESS | rc=0 >>
 07:25:27 up 7 min,  3 users,  load average: 0.00, 0.02, 0.00
原文地址:https://www.cnblogs.com/kevincaptain/p/9993732.html