zoukankan      html  css  js  c++  java
  • ansible中的playbook(剧本)

    playbook 剧本

    一、操作都是幂等的

      即操作过后就不会操作了

    ymal

      配置文件

    格式为:

      字典:

      key: value  (冒号后面必须有空格)

      列表

      -

    playbook的格式

    Usage: ansible-playbook [options] playbook.yml [playbook2 ...]
    
    -C    --check    #白跑,执行代码但不会有结果
    
    --list-hosts        #列出符合的主机
    
    -f FORKS    --forks=FORKS    #做并发
    
    --syntax-check    #检查语法
    
    -k    --ask-pass    #输入密码

    了解了playbook的命令的格式接下来看看怎么使用吧

      首先新建一个文件里面写咱们的代码,文件结尾为.yml的文件

    touch    pb.yml
    vim    pb.yml

      单个的playbook的实例文件如下,冒号后面要加空格

      创建一个用户,用户名为IT01,家目录为/opt/IT01,用户id为4000

    - hosts: all    #指定要执行的主机组
       remote_user: root    #指定执行的用户,默认是root
       tasks:    #任务列表
       - name: createuser    #任务名字,必须要有
          user: name=IT01 home=/opt/IT01 uid=4000    #指定要使用的模块以及模块参数

      多个playbook的实例文件内容如下

      一个任务名称为createuser,一个任务名称为copyfile。playbook有幂等性不管执行多少次,得到的结果都是一样的可以在原有的基础上可以再写一个任务

    - hosts: all
      remote_user: root
      tasks:
      - name: createuser
        user: name=IT01 home=/opt/IT01 uid=4000
     - name:copyfile
       copy: src=/etc/fstab dest=/tmp/fs

      接下来就有新的问题了如果我原来早先的机器是这样做,现在公司又来了一批新机器不设置用户为IT01,要设置成IT02,我是不是还要打开这个playbook再来一遍呢。太繁琐了,所以就需要用到传参了,比如:

    - hosts: all
      tasks:
      - name: create{{user}}
        user: name={{user}}
    
    然后在执行这个playbook的时候用 -e 指定上面代码中需要的user
    
    ansible-playbook -e user=IT02 pb.yml

       上面是传参的第一种方式,关于playbook的传参有5种方式,首先我们需要打开 /etc/ansible/hosts 文件

    vi /etc/ansible/hosts

    然后找到上次咱们分组的地方

    改成下面这样的:

    然后执行

    ansible-playbook pb.yml

    下面是介绍第三种传递参数的方法

    还是在/etc/ansible/hosts 文件,只是改成这样的

    再去执行上面的playbook命令运行pb.yuml文件

    下面是第四种方法,是在写bp.yml文件的时候写入到文件中去:

    - hosts: web
      vars:  #默认是root,可以省略
      - user: IT02
      tasks:
      - name: create{{user}}
        user: name={{user}}

    第五种传递参数的方法:

    如果我们想让Linux做数学计算怎么办呢?我们需要安装一个叫bc的包,正好我们用playbook安装下

    - hosts: all
      tasks:
      - name: yum
        yum: name=bc
      - name: sum
        shell: echo 11+22|bc
        register: user
      - name: echo
        shell: echo {{user.stdout}} > /tmp/echo.txt #将结果写入到文件
      - name: create{{user.stdout}}
        user: name=IT{{user.stdout}}

    接下来就是五种传递参数的方式的优先级

    -e > playbook > hosts

    在执行playbook的时候我们会看到这样一条提示

    TASK [Gathering Facts]

    实质上这个是在收集信息,我们可以使用下面的命令来看收集的都有什么信息

    ansible cache -m setup | more
    
    以及他所收集的一些重要的信息
    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 #系统名字

    接下来就是,如果我们之前执行过的命令因为幂等会有跳过不会再次执行但是即便是那样也会觉得很别扭比如我们写的有yum安装的命令和copy的命令,但是后面我们需要执行下playbook中的copy怎么办呢???那么就引出了我们的

      tags标签

      比如有如下一个playbook的文件:

    - hosts: all
      tasks:
      - name: install
        yum: name=redis
    
      - name: copyfile
        copy: dest=/etc/redis.conf src=/etc/redis.conf
        tags: copy       #我们可以是使用tags定义一个标签并取上名字
    
      - name: start
        service: name=redis state=started

      那么我们如果只是需要copy文件的命令的时候就直接使用 -t 加上标签名就执行了

    ansible-playbook -t copy pb.yml

      那么问题又来比如我们像上面一样把主控机的redis.conf文件修改后copy到被控机上了然后我们需要重启redis服务还需我们打开文件修改再运行什么的,或者还要手动重启redis,有么有一种方法可以直接在文件改变了就自动重启呢???就是下面的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

      当执行了copy命令后会触发去执行handlers下面的代码

      template可以动态的传递参数,可以在setup中获取

      绝对路径的写法

    - hosts: all
      tasks:
      - name: install
        yum: name=redis
      - name: copyfile
        template: 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

      当然相对的还有个相对路径的写法

    - hosts: all
      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的目录,就可以使用相对路径了

    如何在playbook中写判定语句

    用 when

    - hosts: all
      tasks:
      - name: copyfile
        copy: content="大弦嘈嘈如急雨" dest=/tmp/a.txt
        when: ansible_distribution_major_version=="7"    #如果系统的主版本是7那么执行上面的代码
      - name: copyfile
        copy: content="小弦切切如私语" dest=/tmp/a.txt
        when: ansible_distribution_major_version=="6"    #如果系统的主版本是6那么执行上面的代码

    如何在playbook中写循环语句

    使用with_items就可以做到循环,是一个列表

    - hosts: all
      tasks:
      - name: createuser
        user: name={{item}}
        with_items:
        - IT01
        - IT02
        - IT03
    
    循环出来的元素都是写item是固定的写法

    我是创建用户可以这样写每个机器上都创建三个用户,但是我不满足现状我想在创建用户的同时可以指定组名该怎么写呢???这样就用到了嵌套循环,具体写法如下

    - 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}
    
    这种就是一个列表中套了三个字典

      

  • 相关阅读:
    域渗透[WinRM]
    域渗透[DCSync]利用
    LLMNR中间人及WPAD劫持
    274. H-Index
    75. Sort Colors
    46. Permutations
    31. Next Permutation
    subsets
    86. Partition List
    82. Remove Duplicates from Sorted List II
  • 原文地址:https://www.cnblogs.com/guchenxu/p/10827660.html
Copyright © 2011-2022 走看看