zoukankan      html  css  js  c++  java
  • ansible-playbook

    1. playbook基础语法
    - 由ymal语言编写,遵循ymal标准
    - 同一行中,#号之后的内容表示注释
    - 同一列表中的元素应该保持相同的缩进
    - playbook由一个或者多个play组成
    - play中hosts、variables、roles、tasks等对象的表示方法都是键值中间以":"分隔表示
    - 所有的ymal文件开头都是由---,这是ymal格式的一部分,表明一个文件的开始
    
    2. playbook的构成
    - targets:定义将要执行playbook的的远程主机组
    - variables:定义执行playbook时需要使用的变量
    - tasks:定义将要在远程主机上执行的任务列表
    - handler:定义task执行完成以后需要调用的任务
    
    - -f 并发进程数量,默认是5
    - hosts 行的内容是一个或者多个组或者主机,以逗号分隔
    - remote_user 就是账号名
    - tasks 
        //每一个play包含了一个task列表(任务列表)
        //一个task在其所对应的主机上(通过host pattern匹配所有主机)执行完毕之后,下一个task才会执行,
        //在一个play中,所有hosts会获取相同的任务指令,这是play的一个目的所在,也就是将一组选出的hosts映射到task,执行相同的操作
    
    3. playbook执行结果
    - 使用ansible-playbook运行playbook文件,得到输出内容为json格式,并且由不同颜色组成,便于识别
    ## 一般而言:绿色代表执行成功;***代表系统状态发生改变;红色代表执行失败
    

    安装httpd,修改默认首页,开启自启

    ---
    - hosts: all
      remote_user: root
      tasks:
        - yum: name=httpd state=installed
        - replace: path=/etc/httpd/conf/httpd.conf regexp="(^Listen ).*" replace="1 8080"
        - shell: echo "123456">/var/www/html/index.html
        - service: name=httpd enabled=yes state=started
        - shell: netstat -utnlp
    
    4. playbook语法进阶
    • 变量
    ---
    - hosts: all
      remote_user: root
      vars:
        - name: wang5  //定义变量(测试这里name加-或者不加都可以执行成功)
      tasks:
        - user: name={{name}} group=wheel uid=2000   //引用变量要在{{ }}中
        - shell: echo 123456|passwd --stdin {{name}}
    
    ## 用user模块的password参数也可以给用户设置密码,但是需要使用过滤器加密一下才能使用
    ---
    - hosts: all
      remote_user: root
      vars:
        - name: wang6
      tasks:
        - user:
            name: "{{name}}"
            group: wheel
            password: "{{'123456' | password_hash('sha512')}}"  //sha512是系统默认的加密方式,可以在/etc/login.dfs最后一行查看
    ## 使用password: 123456可以到/ect/passwd下查看密码是明文的是不能使用的,上述加密之后可以再查看passwd文件中该用户的密码就是加密的了
    
    5. ansible-playbook对错误的处理
    - 默认情况判断$?,如果值不为0,则停止执行;但是某些情况我们需要忽略错误继续执行
    - 忽略错误的两种方式:
    // 第一种 
    shell: 执行的命令|| true   
    // 第二种
    shell: 执行的命令
    ignore_errors: True
    
    6. handlers触发器和notify动作

    意思可以理解为,先定义handlers,然后使用notify: 调用handlers的name名字来做标记,最后执行一次handlers里的动作

    • -name先起一个名字
    • 模块 然后写执行的具体动作
    - 用于当关注的资源发生变化时采取一定操作
    - notify这个动作可用于在每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,取而代之仅在所有的变化发生完成之后一次性的执行指定操作
    - 在notify中列出的操作称为handler,也即notify中调用handler中定义的操作
    
    ---
    - hosts: all
      remote_user: root
      tasks:
        - yum: name=httpd state=installed
        - replace: path=/etc/httpd/conf/httpd.conf regexp="(^Listen ).*" replace="1 8080"
        - shell: echo "123456">/var/www/html/index.html
          notify: restart_httpd   //调用下方handlers的名字
      handlers:
        - name: restart_httpd   //起名字
          service: name=httpd enabled=yes state=started 
    ## handlers可以在继续定义名字,然后起不同的模块写法是相同的
    
    7. registrer 记录的意思,可以理解为接收返回的对象
    • 有时候我们需要判断前一个命令执行的结果,根据结果处理后边的操作,这时就需要register模块来保存前一个命令的返回状态,在后边进行调用
    ---
    - hosts: all
      remote_user: root
      vars:
        - name: wang6
      tasks:
        - shell: id {{wang6}}
          register: result  //result可以自定义,不仅仅接收的是$?返回值,可以用result.stdout调用标准输出的值
    
    8. when判断
    • 某些时候我们需要在满足特定条件后再触发某一项操作,或在特定条件下终止某个行为,这个时候就需要条件判断,远程中系统变量facts变量作为when的条件,这些facts可以通过setup模块查看
    ---
    - hosts: all
      remote_user: root
      vars:
        - name: wang7
      tasks:
        - shell: id {{name}}
          ignore_errors: true   //不存在会报错,就不会往下执行了,这里忽略错误
          register: result    //result接收对象
        - shell: useradd {{name}}
          when: result.stdout != 0   //当不等于0时,也就是用户不存在,就创建用户
    
    9. with_items 标准循环
    • 是playbook的标准循环,用与迭代一个字典或者列表,通过{{item}}获得每次迭代的值
    - 创建多用户
    ---
    - hosts: all
      remote_user: root
      tasks:
        - shell: useradd {{item}}   
          with_items: ["lisi1","lisi2","lisi3","lisi4"]  //循环列表,列表元素用逗号隔开
    
    - 创建多用户,并且用户有不同的属性
    ---
    - hosts: all
      remote_user: root
      tasks:
        - user: name={{item.name}} group={{item.group}} password={{'123456'|password_hash("sha512")}}
          with_items:
             - {name: "li1",group: 'root'}
             - {name: "li2",group: 'root'}
             - {name: "li3",group: 'wheel'}
             - {name: "li4",group: 'wheel'}
    
    10. with_nested 嵌套循环
    ---
    - hosts: all
      remote_user: root
      vars:
        un: [1,2,3]
        id: [a,b,c]
      tasks:
        - shell: echo {{item}}
          with_nested :
            - "{{un}}"
            - "{{id}}"
    
    11. tags给指定任务定义一个调用标识
    12. include和roles
    include 引用文件
    roles 引用项目
    
    13.debug 调试
    - 检测语法: --syntax-check
    - 测试运行: -C  //大写C
    - 显示受到影响的主机: --list-hosts
    - 显示工作的task: --list-tasks
    - 显示将要运行的tags: --list-tags
    
    When nothing seems to help, I go look at a stonecutter hammering away at his rock, perhaps a hundred times without as much as a crack showing in it. Yet at the hundred and first blow it will split in two, and I know it was not that blow that did it, but all that had gone before. -- Jacob Riis
  • 相关阅读:
    Java基础——数组复习
    JavaScript 笔记总结
    HTML总结
    css代码添加背景图片常用代码
    Java 并发包之线程池综述
    Java 并发之Concurrent 包综述
    AQS 框架之 Lock 接口
    AQS 框架之 LockSupport 线程阻塞工具类
    JAVA 锁之 Synchronied
    ThreadLocal 线程本地变量
  • 原文地址:https://www.cnblogs.com/xhwy-1234/p/12163830.html
Copyright © 2011-2022 走看看