复盘内容:链接指南
查看ansible命令文档
shansible-doc -s systemd遇到复制VIM丢失bug------文章参考
产生原因:vi/vim中没有进入编辑模式,所以复制文本的时候,遇到o,i等进入编辑模式的字母时,之后的文本才会复制进去,所以之前的文本就看不到了。
解决方案:粘贴的时候,先进入编辑模式
一、剧本
何为剧本:
playbook 文件,用于长久保存并且实现批量管理,维护,部署的文件. 类似于脚本存放命令和变量
剧本yaml格式,yaml格式的文件:空格,冒号.
剧本未来我们批量管理,运维必会的内容.
| ans剧本 | ans ad-hoc | |
|---|---|---|
| 共同点 | 批量管理,使用模块 | 批量管理,使用模块 | 
| 区别 | 重复调用 | 不是很方便,不容易重复 | 
| 应用建议(应用场景) | 部署服务,多个步骤的任务 | 测试模块,临时性任务 | 
案例:脚本书写格式

            
            
              yaml
              
              
            
          
          ---
- hosts: all
  tasks:
    - name: 01 打开冰箱门
      shell: echo 1 >>/tmp/bingxiang.log
    - name: 02 把大象放入冰箱
      shell: echo 2 >>/tmp/bingxiang.log
    - name: 03 关上冰箱的门
      shell: echo 3 >>/tmp/bingxiang.log
        
            
            
              sh
              
              
            
          
          #书写剧本 注意以.yml或.yamt结尾 01.show.yml
#执行脚本 
mv /etc/ansible/hosts .
#-i 指定主机清单文件,如果不写默认调用/etc/ansible/hosts
ansible-playbook -i hosts 01.show.yml
        执行的时候有奶牛:
可以删除软件或修改ansible.cfg配置进行关闭 #nocows =1去掉注释即可
书写Ans playbook注意事项:
- 同一个层级的内容对齐的0
 
- 不同层级的通过2个空格对齐
 - 不能使用tab键
 
二、剧本案例
1、案例01: 创建目录并分发文件
创建目录/server/files/etc/hosts文件并且发送过去/server/files
            
            
              yaml
              
              
            
          
          ---
- hosts: all
  tasks:
    - name: 01 创建目录/server/files
      file: 
        path=/server/files 
        state=directory
    - name: 02 分发文件
      copy: 
        src=/etc/hosts 
        dest=/server/files
        2、案例02:分发软件包,安装软件包,启动服务
zabbix-agent软件包(下载)---》 安装软件包---》配置(略)---》启动开机自启动
            
            
              yaml
              
              
            
          
          ---
- hosts: all
  takes: 
    - name: 01 软件包下载
      get_url: 
        url: https://mirrors.aliyun.com/zabbix/zabbix/6.0/rhel/7/x86_64/zabbix-agent-6.0.13-release1.el7.x86_64.rpm
        dest: /tmp/
        validate_certs: no
    - name: 02 安装软件包
       yum:
        name:/tmp/zabbix-agent-6.0.13-release1.el7.x86_64.rpm
        state=insatlled
    - name: 03 配置 
       debug:
        msg: "进行配置zabbix-agent"
    - name: 04 启动
       systemd:
        name: zabbix-agent
        enabled: yes
        state: started
        
            
            
              sh
              
              
            
          
          ansible all -m shell -a 'ps -ef | grep zabbix'
        不能使用-m command。在 Ansible 的命令模块中,你需要以单个字符串的形式指定要执行的命令,而不能使用管道符号 |。
3、案例03:nfs服务
- nfs服务端:在backup上部署nfs服务,共享/backup-nfs目录,all_squash,匿名用户:nfsnobody
 - nfs客户端:web挂载 /ans-upload目录挂载nfs服务端共亭的/backup-nfs(永久挂载)
 
写剧本必备-列出流程
服务端流程:
- 部署nfs-utils,rpcbind
 
- 修改配置文件
 
- 创建共享目录并改所有者
 
- 启动服务rpcbind,nfs(注意顺序)
 
客户端流程:
- 安装nfs-utils2.
 - 挂载与永久挂载
 
            
            
              yaml
              
              
            
          
          ---
- hosts: nfs
  tasks: 
    - name: 01 部署nfs-utils,rpcbind
      yum: 
        name: nfs-utils
        state: installed
    - name: 02 修改配置文件
      lineinfile:
        path: /etc/exports
        line: "/backup-nfs/ 111.229.205.0/24(rw)"
        create: true
    - name: 03 创建共享目录并且修改权限
      file: 
        path: /backup-nfs/
        state: directory
        owner: nfsnobody
        group: nfsnobody
    - name: 04-1 依次启动服务rpc
      systemd: 
        name: rpcbind
        enabled: yes
        state: started
    - name: 04-2 依次启动服务nfs
      systemd: 
        name: nfs
        enabled: yes
        state: started
- hosts: web
  tasks: 
  - name: 01 部署nfs-utils,rpcbind
    yum: 
      name: nfs-utils
      state: installed
  - name: 02 永久挂载
    mount:
      src: 43.137.51.152:/backup-nfs/
      path: /data/
      fstype: nfs
      state: mounted
        三、Ansible中的变量
变量无处不在,在ans中大部分地方都可以定义变量.
比较常用的创建变量的地方:剧本中,类似于功能,共用的变量文件.
| 可以定义变量的地方 | 说明 | 
|---|---|
| 在剧本文件中定义 | 比较常用。仅仅限于当前的play使用, | 
| register变量(注册变量) | ip= hostname -I,实现脚本中反引号的功能,可以获取命令结果 | 
| 变量文件,根据主机清单分分组进行定义变量 | 如果多个剧本,使用相同的变量,大型的剧本roles | 
| inventory主机清单中定义变量 | 未来可以用于批量修改主机使用,其他很少用了 | 
| 命令号中 | 几乎不用 | 
| facts变量 | 一般用于获取主机基本信息:ip,主机名,系统(centos/ubuntu)如果不需要可以关闭,用于加速剧本的执行 | 
3.1、剧本中的变量
在剧本play中定义变量应用:
- 仅仅在当前play生效.
 - 一般用来存放路径,用户名,ip地址,类似于之前使用的脚本.
 - 注意引号使用.
 
使用变量的时候如果变量是某个选项的开头,则变量引用的时候需要加上双引号.
            
            
              yaml
              
              
            
          
          #dir就是变量,变量的内容:右边的内容
- hosts: all
  vars:
    dir: /oldboy/lidao/upload/
  tasks:
    - name: mkdir
      file:
        path: "{{ dir }}"
        state: directory
        面试常问:使用变量的时候如果变量是某个选项的开头,则变量引用的时候需要加上双引号.
3.2、共用变量-变量文件
            
            
              yaml
              
              
            
          
          [root@m01 /server/scripts/playbook]# cat 05.vars.yml
- hosts: all
  vars_files: ./vars.yml
  tasks:
    - name: file
      file:
        path: "{{ dir  }}/{{ user }}-{{ file }}"
        state: touch
        3.3、共用变量-根据主机组使用变量
group_vars根据主机清单的分组去匹配
            
            
              yaml
              
              
            
          
          group_vars/
  lb/vars.yml #存放lb组的变量
  web/vars.yml #存放web组的变量
  data/vars.yml #存放xxx组的变量
  all/vars.yml #所有主机共用的变量
未来一般使用all分组即可,把所有变量存放在一起,供剧本使用
        
            
            
              yaml
              
              
            
          
          user: www
nfs_dir: /nfs_backup
web_mount_dir: /web_nfs
nfs_server: 172.16.1.41
rsync_pass: 1
        3.4、facts变量
运行剧本的时候ans会收集每个主机的本信息,这些信息形成的变量叫做facts变量,
facts变量setup模块获取
3.5、register变量注册变量
本质上就是用来实现脚本中的反引号功能
用户通过命令获取的内容都存放到Register变量
            
            
              yaml
              
              
            
          
          - hosts: all
  tasks:
   - name: get date
     shell: date +%F
     register: result
   - name: print result 变量内容
     debug:
       msg: "register变量的全部内容是:{{result.stderr }}"
            "register变量的精确的内容是:"{{result.stdout}}"
        json形式数据.------》key: value
register变量result.
result.stdout==std standard output 标准输出.