ansible的脚本-----playbook剧本

ansible的脚本-----playbook剧本

playbook组成部分:

1、tasks任务:包含要在目标主机上执行的操作,使用模块定义这些操作。每个任务都是一个模块的调用

2、variables变量:存储和传递数据,变量可以自定义,可以在playbook当中定义为全局变量,也可以外部传参

3、Templates模板:用于生成配置文件。模板是包含占位符的文件,占位符由ansible在执行时转化为变量值

4、handlers处理器:当需要有变更的时候,可以执行触发器

5、Roles角色:是一种组织和封装playbook的,允许把相关的任务,变量,模板和处理器组织成一个可复用的单元

playbook的条件判断:

when是一个比较常见的应用场景,实现满足条件即执行,不满足条件即跳过的任务

when是满足条件即执行,不满足不执行

循环:

ansible有多种循环模式,

with_items:循环遍历

with_list:列表分组循环

with_together:列表对应的列,数据结合的方式循环

with_nested:相当于双重循环,第一层定义了循环的次数,第二层表示第一层的每个元素会循环几次

实例模板:

要先vim /etc/ansible/hosts让他们主机之间ping的通

再写一个yml的配置文件

#this is our first playbook

- name: first play

  gather_facts: false

  hosts: 192.168.233.20

  remote_user: root

  tasks:

   - name: ping test

     ping:

   - name: close selinux

     command: '/sbin/setenforce 0'

     ignore_errors: True

   - name: close firewalld

     service: name=firewalld state=stopped

   - name: install httpd

     yum: name=httpd

   - name: start httpd

     service: enabled=true name=httpd state=started

   - name: editon index.html

     shell: echo "this is httpd" > /var/www/html/index.html

     notify: restart httpd

  handlers:

   - name: restart httpd

     service: name=httpd state=restarted

ansible的脚本-----playbook剧本_第1张图片

ansible的脚本-----playbook剧本_第2张图片

检查yml的语法是否正确

运行脚本

指定任务从哪一步开始

ansible的脚本-----playbook剧本_第3张图片

切换用户实验:

要先vim /etc/ansible/hosts让他们主机之间ping的通

再写一个yml的配置文件

#this is our first playbook

- name: first play

#一个name就是一个任务名,名字可以不写

  gather_facts: false

#是否收集目标主机的系统信息,false就是不收集

  hosts: 192.168.233.20

#执行的目标主机是20

  remote_user: dn

  become: yes

#切换用户

  become_user: root

#在目标主机执行的用户

  tasks:

   - name: ping test

     ping:

   - name: close selinux

     command: '/sbin/setenforce 0'

     ignore_errors: True

   - name: close firewalld

     service: name=firewalld state=stopped

   - name: install httpd

     yum: name=httpd

   - name: start httpd

     service: enabled=true name=httpd state=started

   - name: editon index.html

     shell: echo "this is httpd" > /var/www/html/index.html

     notify: restart httpd

  handlers:

   - name: restart httpd

     service:name=httpd state=restarted

ansible的脚本-----playbook剧本_第4张图片

打开配置文件,71行取消注释

指定用户,输入密码

也可以不在脚本里声明用户,在命令行输入用户

ansible的脚本-----playbook剧本_第5张图片

声明和引用变量,以及外部传参变量实验:

#this is second playbook!

#声明和引用变量,以及外部传参变量

- hosts: 192.168.233.20

  remote_user: root

  vars:

    groupname: guoqi

    username: wangdefu

  tasks:

   - name: create group

     group:

       name: "{{ groupname }}"

       system: yes

       gid: 111

   - name: create user

     user:

       name: "{{ username }}"

       uid: 1011

       group: "{{ groupname }}"

       shell: /sbin/nologin

   - name: copy file

     copy:

       content: "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address']}}"

#获取目标主机的IP地址,然后打印,复制到目标文件

       dest: /opt/ky32.txt

ansible的脚本-----playbook剧本_第6张图片

ansible的脚本-----playbook剧本_第7张图片

"{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address']}}"

包含所有主机变量的字典

inventory_hostname:目标的主机名

ansible_default_ipv4:获取目标主机名

['ansible_default_ipv4']['address']:索引

ansible的脚本-----playbook剧本_第8张图片

ansible的脚本-----playbook剧本_第9张图片

用-e往ansible-playbook里面传参数

ansible的脚本-----playbook剧本_第10张图片

条件判断实验:

#this is when test

- hosts: all

#可以用主机的IP地址,也可以使用组名,也可以用all

  remote_user: root

  tasks:

   - name: test when

     debug:

       msg: '位置判断'

     when: ansible_default_ipv4.address == '192.168.233.20'

(做这些之前要先在/etc/ansible/hosts里面把其他的IP地址删掉)

ansible的脚本-----playbook剧本_第11张图片

取反

#this is when test

- hosts: all

#可以用主机的IP地址,也可以使用组名,也可以用all

  remote_user: root

  tasks:

   - name: test when

     debug:

       msg: '位置判断'

#echo $a echo ok echo 123 debug=echo msg:输出的内容,用于脚本的调试,在正式脚本中要去除

     when: ansible_default_ipv4.address != '192.168.233.20'

ansible的脚本-----playbook剧本_第12张图片

实验安装nginx和httpd:

20安装nginx

30安装httpd

- hosts: all

  remote_user: root

  tasks:

   - name: nginx

     yum: name=nginx

   - name: nginx info

     debug:

       msg: "安装nginx"

ansible的脚本-----playbook剧本_第13张图片

(两个选一个用)

ansible的脚本-----playbook剧本_第14张图片

循环

- hosts: 192.168.233.30

  remote_user: root

  gather_facts: false

  tasks:

   - debug:

       msg: "{{ item }}"

     with_items: [a,b,c,d]

#声明变量item,playbook的内置变量,with_items,会把item的值,遍历>列表当中的a,b,c,d

ansible的脚本-----playbook剧本_第15张图片

ansible的脚本-----playbook剧本_第16张图片

定义两个列表,但是会一块遍历打印出来

- hosts: 192.168.233.30

  remote_user: root

  gather_facts: false

  tasks:

   - debug:

       msg: "{{ item }}"

     with_items:

      - [a,b,c,d]

      - [1,2,3,4]

#声明变量item,playbook的内置变量,with_items,会把item的值,遍历>列表当中的a,b,c,d

#虽然我声明的列表是两个,但是with_items还是把两个列表当成整体进行

遍历

ansible的脚本-----playbook剧本_第17张图片

分组打印:

- hosts: 192.168.233.40

  remote_user: root

  gather_facts: false

  tasks:

   - debug:

       msg: "{{ item }}"

     with_list:

      - [a,b,c,d]

      - [1,2,3,4]

ansible的脚本-----playbook剧本_第18张图片

ansible的脚本-----playbook剧本_第19张图片

遍历循环在主机上创建文件实验:

ansible的脚本-----playbook剧本_第20张图片

ansible的脚本-----playbook剧本_第21张图片

双重循环实验:

- hosts: 192.168.233.40

  remote_user: root

  gather_facts: false

  tasks:

   - debug:

       msg: "{{ item }}"

     with_nested:

      - [a,b,c,d]

      - [1,2,3,4]

#列表里面的元素定义了循环的次数,第二层列表相当于内循环

ansible的脚本-----playbook剧本_第22张图片

一键yum安装tree sl nginx httpd vsftpd dhcp软件:

- name: play1

  hosts: 192.168.233.40

  gather_facts: false

  tasks:

    - name: yum

      yum: name= {{item}}

      with_list:

        - tree

        - sl

        - nginx

        - httpd

        - vsftpd

        - dhcp

ansible的脚本-----playbook剧本_第23张图片

创建test1 2 3,然后把源主机的test1 2 3发给目标主机 再给一个判断的实验:

ansible的脚本-----playbook剧本_第24张图片

两个都可以用

ansible的脚本-----playbook剧本_第25张图片

Templates模块:

Jinja模板架构,通过模板可以实现向模板文件传参(python转义)把占位符参数传到配置文件中去

生成一个目标文本文件,传递变量到需要的配置文件当中(web开发)

声明占位符之后,往httpd里面塞东西实验:

- hosts: all

  remote_user: root

  vars:

    - package: httpd

    - service: httpd

  tasks:

    - name: install httpd

      yum: name={{package}}

    - name: install configure file

      template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf

      notify:

        - restart httpd

    - name: cfreate root_dir

      file:

        path: /etc/httpd/htdocs

        state: directory

    - name: start httpd

      service: name={{service}} enabled=true state=started

  handlers:

    - name: restart httpd

     service: name={{service}} state=restarted

ansible的脚本-----playbook剧本_第26张图片

最下面的service要和上面的service对齐

httpd.conf.j2在文件当中配置的是占位符(声明的变量)

/etc/ansible/hosts 配置了主机的占位符名称和j2文件中的占位符一致(定义参数:占位符的参数的参数声明好)

playbook当中,用template模块来把参数传给目标的主机的配置文件

nginx实验:

端口号改成8080

root目录改成/opt/nginx/html

(其他步骤与http一样)

ansible的脚本-----playbook剧本_第27张图片

tags模块:

标签模块:标签模块,可以在playbook当中为任务设定标签(tags),我们在运行playbook时可以通过指定任务标签,来实现只运行设定的标签任务

例如:

- name

 tags:

   debug

--start-at-task=‘wdf’

任务标签的种类:

always:不管你是否指定了运行标签,任务都会执行

never:即使运行了指定标签,该任务也不会执行

debug:调试任务

setup:收集主机信息

自定义标签:

per_tasks:指定标签之前的任务

post_tasks:运行指定标签之后的任务

ansible的脚本-----playbook剧本_第28张图片

ansible的脚本-----playbook剧本_第29张图片ansible的脚本-----playbook剧本_第30张图片

ansible的脚本-----playbook剧本_第31张图片

Roles模块:

roles又称为角色

ansible层次化,结构化的组织playbook,使用了rolse(角色)

可以根据层次结构,自动装载变量文件,task,以及handlers等等

roles:分别把变量 文件 任务 模块以及处理器,放在单独的目录当中,使用rolse模块来一键调用这些文件

roles:

-------web-------总目录,角色

files  存放copy和sript模块调用的文件

templates  存放j2的模板文件

tasks 包含任务的目录

--------main.yml  角色运行的任务

handlers包含处理器的目录

---------main.yml

vars 存放变量的目录

---------main.yml

defaults 包含默认变量的目录

----------main.yml

meta包含元信息的目录

-----------main.yml

site.yml用来调用所有的配置文件

安装三个服务:

http

mysql

php

 

ansible的脚本-----playbook剧本_第32张图片

ansible的脚本-----playbook剧本_第33张图片

ansible的脚本-----playbook剧本_第34张图片

ansible的脚本-----playbook剧本_第35张图片

ansible的脚本-----playbook剧本_第36张图片

ansible的脚本-----playbook剧本_第37张图片

ansible的脚本-----playbook剧本_第38张图片

ansible的脚本-----playbook剧本_第39张图片

ansible的脚本-----playbook剧本_第40张图片

ansible的脚本-----playbook剧本_第41张图片

然后在20主机查看httpd、nginx、mysql

你可能感兴趣的:(ansible)