gpt4 book ai didi

Ansible-playbook快速入门到放弃

转载 作者:我是一只小鸟 更新时间:2023-02-24 22:31:23 26 4
gpt4 key购买 nike

Ansible-playbook 快速入门到放弃 。

    隔岸红尘忙似火,当轩青嶂冷如冰.

1-简介

playbook 相当于可以把模块命令都写入到配置文件里面,这样就可以直接执行配置文件了,类似脚本.

2-playbook 初体验

编写test.yml 文件,在serviceA 主机机器上的/opt/tjt 路径下创建test.txt 文件.

                            
                              1
                            
                             ---

                            
                              2
                            
                             -
                            
                               hosts: serviceA

                            
                            
                              3
                            
                            
                                remote_user: root

                            
                            
                              4
                            
                            
                                tasks:

                            
                            
                              5
                            
                                 - name: 
                            
                              "
                            
                            
                              使用touch 命令创建test.txt文件
                            
                            
                              "
                            
                            
                              6
                            
                                   shell: 
                            
                              touch
                            
                             /opt/tjt/test.txt
                          
View Code

文件格式说明

  • 第一行需要有三个杠,hosts 参数指定了对哪些主机进行参作,如果是多台机器可以用逗号作为分隔,也可以使用主机组,在/etc/ansible/hosts里定义;
  • user 参数指定了使用什么用户登录远程主机操作;
  • tasks 指定了一个任务,其下面的name 参数同样是对任务的描述,在执行过程中会打印出来,shell 是ansible 模块名字。

编辑完成之后,使用ansible-playbook 命令执行test.yml 文件.

                          [root@localhost tjt]
                          
                            #
                          
                          
                             ansible-playbook /opt/tjt/ansible/test.yml
                          
                        

 然后到客户端上看看是否有创建test.txt 文件.

                          [root@localhost ~]
                          
                            #
                          
                          
                             ls -l /opt/tjt/test.txt
                          
                        

3-playbook 变量

通过创建用户体验playbook 的变量使用方式.

                          ---
- name: 
                          
                            "
                          
                          
                            创建test用户
                          
                          
                            "
                          
                          
                            
  hosts: 
                          
                          192.168.8.136
                          
                            
  user: root
  gather_facts: false
  vars:
     
                          
                          - user: 
                          
                            "
                          
                          
                            test
                          
                          
                            "
                          
                          
                            
  tasks:
    
                          
                          - name: 
                          
                            "
                          
                          
                            ---playbook变量----创建test用户---
                          
                          
                            "
                          
                          
                            
      user: name
                          
                          =
                          
                            "
                          
                          
                            {{ user }}
                          
                          
                            "
                          
                        

说明:

  • name:对该playbook 实现的功能做一个概述,后面执行过程中,会打印 name 变量的值 ,可以省略;
  • gather_facts:指定了在以下任务部分执行前,是否先执行setup 模块获取主机相关信息,如果需要在后面的tasks里获取setup收集到的信息,就需要把这个参数设置为True;
  • vars:指定了变量,这里声明了一个user 变量,其值为test ,需要注意的是,变量值一定要用引号引住;
  • user:提定了调用user 模块,name是user 模块里的一个参数,而增加的用户名字调用了上面user 变量的值。

执行该文件:

                          [root@localhost tjt]
                          
                            #
                          
                          
                             ansible-playbook /opt/tjt/ansible/create_user.yml
                          
                        

 到客户端上看看用户是否已创建:

                          [root@localhost ~]
                          
                            #
                          
                          
                             id test
                          
                        

4-playbook 循环

                          ---
- hosts: 
                          
                            192.168
                          
                          .
                          
                            8.136
                          
                          
                            
  user: root
  tasks:
    
                          
                          - name: 
                          
                            "
                          
                          
                            playbook---循环
                          
                          
                            "
                          
                          
                            file
                          
                          : path=/opt/tjt/{{ item }} state=
                          
                            touch
                          
                           mode=
                          
                            600
                          
                          
                            
      with_items:
        
                          
                          - 
                          
                            1
                          
                          
                            .txt
        
                          
                          - 
                          
                            2
                          
                          
                            .txt
        
                          
                          - 
                          
                            3
                          
                          .txt
                        

参数说明

  • file 模块可以对文件进行相关的操作,例如创建文件或者更改文件权限等,具体可以查看该模块的文档。
  • with_items 为循环的对象,相当于是一个数组或集合,写在下面的1.txt、2.txt 以及3.txt 是该集合的元素。而item 则表示的是遍历出来的元素,也就是说item 指代的是1.txt、2.txt 以及3.txt。
  • state 的值设置为touch 表示如果该文件不存在就进行创建。
  • path 表示文件的路径。
  • mode 设置权限。

执行该文件:

                          [root@localhost tjt]# ansible-playbook /opt/tjt/ansible/
                          
                            while
                          
                          .yml
                        

到客户端上看看文件是否已创建:

                          [root@localhost ~]# ll /opt/tjt
                          
                            /*
                          
                          
                            .txt
                          
                        

5-playbook 条件判断

一般以setup 模块收集到的主机信息,来作为判断条件。所以在编写代码之前,我们需要先获取相应的信息,例如我要以ip 地址来作为判断条件,那么我就得先从setup 里获取主机ip的相关信息。
执行以下命令可以查看到setup 收集到的所有的facter 信息,输出的信息是JSON格式的:
                          [root@localhost tjt]# ansible serviceA -m setup
                        

 通过一个简单的创建文件的例子体验playbook 条件判断语句的使用方式,编写 when.yml 文件内容如下:

                          ---
-
                          
                             hosts: serviceA
  user: root
  gather_facts: True
  tasks:
    
                          
                          - name: 
                          
                            "
                          
                          
                            playbook---条件判断
                          
                          
                            "
                          
                          
                            
      shell: 
                          
                          
                            touch
                          
                           /opt/tjt/
                          
                            when.txt
      
                          
                          
                             when:   ansible_virbr0  .  ipv4  .  address   =  =   "192.168.122.1"            
                          
                        

参数说明

  • ansible_virbr0  是一个数组存储着网卡相关信息,ipv4 属于该数组的子元素,但是ipv4也是一个数组,而address 则是ipv4 数组的子元素,我们需要使用address 来作为判断条件,所以要访问address 就需要使用这样的格式: ansible_virbr0 . ipv4 . address ,address 表示的是键,而" 192.168.122.1 "则是值,when 为判断语句相当于if,所以其判断条件为:该键的值为" 192.168.122.1 "时就执行shell 模块里定义的语句。
  • gather_facts: True ,在远程主机运行setup 模块,并将收集的信息记录起来(等于命令ansible  all -m setup #查看系统信息),可以通过系统信息来判断是否执行。 
  • gather_facts: no ,在不需要获取机器信息时,根据信息做判断时,将其关闭,避免影响执行速度。

执行该文件:

                          [root@localhost tjt]
                          
                            #
                          
                          
                             ansible-playbook /opt/tjt/ansible/when.yml
                          
                        

 到客户端上看看文件是否已创建:

                          [root@localhost ~]
                          
                            #
                          
                          
                             ll /opt/tjt/when.txt
                          
                          
-rw-r--r--. 1 root root 0 2月  21 21:51 /opt/tjt/
                          
                            when.txt
[root
                          
                          @localhost ~]
                          
                            #
                          
                        

6-playbook 的handlers

  • 有一种情况就是执行了tasks里面的内容之后,服务器发生了变化,这时我们可能需要执行一些相关的操作。
  • 例如我们修改了某个服务的配置文件后,则需要重启一下服务,而handlers 就是完成这样的事情的,它相当于编程中的回调函数,当tasks 里的内容执行成功后,就会执行handlers 里定义的内容。
  • 类似于shell 脚本中的 && 符号,例如 cat 1.txt && rm -f 1.txt ,当 cat 1.txt 命令执行成功之后就会执行 rm -f 1.txt 命令,否则不执行。
                          ---
- name: 
                          
                            "
                          
                          
                            playbook中的handlers
                          
                          
                            "
                          
                          
                            
  hosts: serviceA
  user: root
  tasks:
    
                          
                          -
                          
                             name: copy file
      copy: src
                          
                          =/opt/tjt/handlers dest=/opt/tjt/
                          
                            handlers.txt
      notify: test handlers
  handlers:
    
                          
                          -
                          
                             name: test handlers
      shell: echo 
                          
                          
                            "
                          
                          
                            This is a test string
                          
                          
                            "
                          
                           >> /opt/tjt/ansible/handlers.txt
                        

参数说明

  • 只有copy 模块执行成功后,才会去调用下面的handlers 里定义的内容,去执行handlers 里面的shell 相关命令,这种比较适合配置文件发生更改后,重启服务的操作。
  • notify 用于指定handlers 的name 参数的值,因为handlers 可以定义多个,所以需要使用notify 来进行指定调用哪一个。

执行该文件:

                          [root@localhost tjt]
                          
                            #
                          
                          
                             ansible-playbook /opt/tjt/ansible/handlers.yml
                          
                        

 到客户端上查看文件末尾一行是否为ansible 执行的echo 写进的那一行内容.

                          [root@localhost ~]
                          
                            #
                          
                          
                             tail -n1 /opt/tjt/ansible/handlers.txt
                          
                        

7-Ansible 的roles

role是task文件、变量文件、handlers文件的集合体,这个集合体的显著特点是: 可移植性和可重复执行性.

在实际项目中,通常我们以 部署某个服务 为单元作为一个role ,然后将这些服务单元(role)放在一个roles 目录下,主playbook 文件通过调用roles目录下的role,来实现各种灵活多变的部署需求.

roles创建

创建一个role 的方法有两种:

  1. 命令mkdir 和touch 行手动创建,即需要哪个目录和文件就用「mkdir」和「touch」命令创建出来.

  2. 使用ansible-galaxy 自动初始化一个role,创建完后再删除不需要的目录.

使用「ansible-galaxy init」命令创建一个名字为role_D 的role.

                          [root@localhost roles]
                          
                            #
                          
                          
                              ansible-galaxy init role_D
                          
                          
- Role role_D was created successfully
                        

role 目录结构

  • tasks : 用于存放role_D 的主要任务,也可以添加其他task 文件,供main.yml 调用,从而实现更加复杂的部署功能。
  • handlers : 用于存放触发执行( hanlders )的任务。
  • defaults : 用于存放默认变量,优先级最低。
  • vars : 用于存放变量文件,role_D 中任务和模版里用到的变量可以在这里定义。
  • files :用于存放需要拷贝到目的主机的文件,例如,作为「copy」模块src 参数的默认根目录。
  • template : 用于存放模版文件,格式为.j2,文件内容要符合Jinja2 语法规则,通常使用「template」模块部署服务的配置文件。
  • meta : 用于存放role 依赖列表,这个知识点后面会详细阐述。
  • tests : 用于存放测试role 本身功能的playbook 和主机定义文件,在开发测试阶段比较常用。

  role 中各个目录下的main.yml 文件很重要,这是ansible 默认加载的YAML 文件.

roles 的引用&执行

可以使用「roles:」语句引用role ,根据需要在主playbook 中引用不同的role,ansible 会把role 所包含的任务、变量、handlers、依赖等加载到playbook中,按照顺序执行。

编写主playbook 文件test_role.yml:

                          ---
- name: 
                          
                            "
                          
                          
                            主playbook文件通过调用roles目录下的role
                          
                          
                            "
                          
                          
                            
  hosts: serviceA
  user: root
  gather_facts: 
                          
                          
                            false
                          
                          
                            
  roles:
    
                          
                          -
                          
                             roleB
    
                          
                          - roleA
                        

roleA 和roleB 目录结构如下:

/opt/tjt/ansible/roles/ roleA /tasks/main.yml 。

                          ---
- name: 
                          
                            "
                          
                          
                            调用-roles目录下的roleA
                          
                          
                            "
                          
                          
                            
  debug:
    msg: 
                          
                          
                            "
                          
                          
                            msg: roleA被执行
                          
                          
                            "
                          
                        

/opt/tjt/ansible/roles/ roleB /tasks/main.yml 。

                          ---
- name: 
                          
                            "
                          
                          
                            调用-roles目录下的roleB
                          
                          
                            "
                          
                          
                            
  debug:
    msg: 
                          
                          
                            "
                          
                          
                            age:: roleB被执行
                          
                          
                            "
                          
                        

执行主playbook 文件test_role.yml:

                          [root@localhost roles]
                          
                            #
                          
                          
                             ansible-playbook /opt/tjt/ansible/test_role.ym
                          
                        

如上,可以看到roleB 和roleA 分别有序执行.

检索路径

ansible 如何查找要执行的role,在不使用绝对路径的情况下(可以这么配role - role: /opt/tjt/ansible/roles/roleB),ansible 检索role 的默认路径有:

  • 执行ansible-playbook 命令时所在的当前目录
  • playbook 文件所在的目录及playbook 文件所在目录的roles 目录
  • 当前系统用户下的~/.ansible/roles 目录
  • /usr/share/ansible/roles 目录
  • ansible.cfg 中「roles_path」指定的目录,默认值为/etc/ansible/roles 目录

8-playbook 的chdir

chdir:进入指定目录,如下chdir,执行ls 命令前,先进入指定目录/opt/tjt.

                          [root@localhost roles]
                          
                            #
                          
                          
                             ansible serviceA -m command -a 'chdir=/opt/tjt ls'
                          
                        

9-playbook 的 with_items

ansible 中的循环模块有很多,with_items 最为简单常用。  。

                          ---
- name: 
                          
                            "
                          
                          
                            with_items循环遍历
                          
                          
                            "
                          
                          
                            
  shell: 
                          
                          
                            "
                          
                          
                            echo {{ item }}
                          
                          
                            "
                          
                          
                            
  register: 
                          
                          
                            "
                          
                          
                            with_items_output
                          
                          
                            "
                          
                          
                            
  with_items: [a,b,c,d]
                          
                        

 如上,with_items 可以用于迭代一个列表或字典,通过 {{ item }} 获取每次迭代的值.

  。

  。

  。

  。

隔岸红尘忙似火
当轩青嶂冷如冰
 
 
 
 

  。

最后此篇关于Ansible-playbook快速入门到放弃的文章就讲到这里了,如果你想了解更多关于Ansible-playbook快速入门到放弃的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com