Ansible 替换centos镜像源

---
- name: config yum repo and install software
  hosts: new
  gather_facts: false
  tasks: 
    - name: backup origin yum repos
      shell: 
        cmd: "mkdir bak; mv *.repo bak"
        chdir: /etc/yum.repos.d
        creates: /etc/yum.repos.d/bak

    - name: add os repo and epel repo
      yum_repository: 
        name: "{{item.name}}"
        description: "{{item.name}} repo"
        baseurl: "{{item.baseurl}}"
        file: "{{item.name}}"
        enabled: 1
        gpgcheck: 0
        reposdir: /etc/yum.repos.d
      loop:
        - name: os
          baseurl: "https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/$basearch"
        - name: epel
          baseurl: "https://mirrors.tuna.tsinghua.edu.cn/epel/$releasever/$basearch"

    - name: install pkgs
      yum: 
        name: lrzsz,vim,dos2unix,wget,curl
        state: present

第一个任务是将/etc/yum.repos.d下的所有repo文件备份到bak目录中,使用了两个参数,chdir参数表示执行shell模块之前先切换到/etc/yum.repos.d目录下,creates参数表示bak目录存在时则不执行shell模块。

根据baseurl: 替换相应的版本

第二个任务是使用yum_repository模块配置yum源,该模块可添加或移除yum源。相关常用参数如下:
(1).name: 指定repo的名称,对应于repo文件中的[name]
(2).description: repo的描述信息,对应于repo文件中的name: xxx
(3).baseurl: 指定该repo的路径
(4).file: 指定repo的文件名,不需要加上.repo后缀,会自动加上
(5).reposdir: repo文件所在的目录,默认为/etc/yum.repos.d目录
(6).enabled: 是否启用该repo,对应于repo文件中的enabled
(7).gpgcheck: 该repo是否启用gpgcheck,对应于repo文件中的gpgcheck
(8).state: present表示保证该repo存在,absent表示移除该repo

在示例中使用了一个loop循环来添加两个repo:os和epel。

yum模块是RHEL系列的包管理器,如果是Ubuntu,则无法使用。其实,还有一个更为通用的包管理器模块package,它可以自动探测目标节点的包管理器类型并使用它们去管理软件。大多数时候使用package来替代yum或替代apt-install等不会有什么问题,但有些包名在不同操作系统上是不一样的(如libyaml-dev、libyaml-devel),所以还是小心使用package模块。

到现在,也许你已经发现了,有些任务在逻辑上是有关联关系的,比如上面示例中备份repo文件和添加repo,我觉得它们应该作为一个整体,但它们毕竟是两个任务,我们只能分开书写。