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}

这种就是一个列表中套了三个字典

 

 

  

 

posted @ 2019-05-07 19:54  五仁儿  阅读(2130)  评论(0编辑  收藏  举报