注意:

使用 Oracle Linux Automation Engine 运行 Oracle Linux 任务

简介

借助 Oracle Linux Automation Engine,管理员可以通过一系列手册和任务,自动执行 Oracle Linux 的初始设置,并使用基础设施即代码 (IaC) 配置管理工具运行其他管理作业。

目标

在本教程中,您将学习如何:

先决条件

部署 Oracle Linux Automation Engine

注:如果在您自己的租户中运行,请阅读 linux-virt-labs GitHub 项目 README.md ,并在部署实验室环境之前完成先决条件。

  1. 在 Luna 桌面上打开一个终端。

  2. 克隆 linux-virt-labs GitHub 项目。

    git clone https://github.com/oracle-devrel/linux-virt-labs.git
    
  3. 转到工作目录。

    cd linux-virt-labs/olam
    
  4. 安装所需的集合。

    ansible-galaxy collection install -r requirements.yml
    
  5. 更新 Oracle Linux 实例配置。

    cat << EOF | tee instances.yml > /dev/null
    compute_instances:
      1:
        instance_name: "ol-control-node"
        type: "control"
      2:
        instance_name: "ol-host"
        type: "remote"
    olam_type: olae
    EOF
    
  6. 创建清单文件。

    cat << EOF | tee hosts > /dev/null
    localhost ansible_connection=local ansible_connection=local ansible_python_interpreter=/usr/bin/python3.6
    EOF
    
  7. 部署实验室环境。

    ansible-playbook create_instance.yml -i hosts -e "@instances.yml"
    

    对于 localhost,免费实验室环境需要额外的变量 ansible_python_interpreter,因为它为 Oracle Cloud Infrastructure SDK for Python 安装 RPM 软件包。根据您的 Oracle Linux 版本,此软件包的安装位置位于系统的默认 Python 模块下面。使用清单变量可避免影响在本地主机以外的主机上运行的播放。

    默认部署配置使用 AMD CPU。您可以通过在命令行上传递新的配置变量定义来更改实例的配置。

    例如:-e instance_shape="VM.Standard3.Flex"

    同样,Oracle Linux 映像的缺省版本使用在 `default_vars.yml file' 中定义的变量 os_version。可以通过在命令行上传递 Oracle Linux 主版本来修改此值。

    例如:-e os_version="9"

    重要提示:等待手册成功运行并到达暂停任务。在手册的这一阶段,Oracle Linux 安装已完成,实例已准备就绪。请注意上一个播放,其中输出其部署的节点的公共和专用 IP 地址。

编写初始设置手册

许多手册利用包含键值对的变量和变量文件,使实际的手册任务在代码保持静态时是动态的。剧本包括变量,这些变量在运行时成为剧本的一部分,剧本在运行任务时使用其值。

Oracle Linux Automation Engine 允许您在多个位置定义这些变量,每个位置都具有特定的优先级顺序。手册级变量使用 varsvars_files 指令在手册中定义。vars 指令指定变量作为播放的一部分,而 vars_files 指令包括包含变量的外部文件。开发人员可以从另一个游戏动态或静态创建这些变量,就像我们在此示例中所做的那样,该示例在运行手册之前定义了系统配置。

  1. 打开新终端,并通过 SSH 连接到 ol-control-node 系统。

    ssh oracle@<ip_address_of_instance>
    
  2. 验证 Oracle Linux Automation Engine 命令是否可用。

    ansible --version
    
  3. 创建工作项目目录。

    mkdir -p ~/ol-playbook
    
  4. 为项目创建变量目录和文件。

    mkdir ~/ol-playbook/vars
    
    touch ~/ol-playbook/vars/defaults.yml
    
  5. 将变量和值添加到文件中。

       
    cat << EOF | tee ~/ol-playbook/vars/defaults.yml > /dev/null
    ---
    username: oracle
    user_default_password: oracle
    ssh_key_file: id_rsa
    ssh_private_key_file: "{{ lookup('file', lookup('env','HOME') + '/.ssh/' + ssh_key_file + '.pub') }}"
    additional_packages: ['git']
    EOF
       
    

    此信息说明了每个变量以及我们将如何使用它:

    • username:运行播放簿时创建的 sudo 用户的名称。在本示例中,用户的名称将为 oracle
    • user_default_password:创建时 oracle 用户的默认密码。运行 sudo 命令时需要口令。
    • ssh_key_file:设置用户的 SSH 密钥对的名称。
    • ssh_private_key_file:将用户的 SSH 公共密钥复制到位于给定路径的远程用户的 authorized_key 文件。该示例使用 lookup 插件在本地用户 $HOME/.ssh/ 目录中查找公钥 id_rsa.pub
    • additional_packages:添加要以数组格式安装的任何其他软件包的名称。数组中的每个程序包都应用单引号括起来并使用逗号分隔。如果安装 container-tools 等 appstream 模块,阵列将类似于 ['git',' @container-tools:ol8']
  6. 创建剧本文件。

       
    cat << EOF | tee ~/ol-playbook/setup.yml > /dev/null
    ---
    - hosts: all
      become: yes
      vars_files:
        - vars/defaults.yml
    
      tasks:
    
      - name: Generate new ssh keypair
        community.crypto.openssh_keypair:
          path: "~/.ssh/{{ ssh_key_file }}"
          size: 2048
          comment: olam ssh keypair
        become: true
        become_user: "{{ username }}"
        delegate_to: localhost
    
      - name: Add a user account with access to sudo
        ansible.builtin.user:
          name: "{{ username }}"
          password: "{{ user_default_password | password_hash('sha512') }}"
          comment: Default Oracle user
          groups: wheel
          append: yes
          update_password: on_create
    
      - name: Set the authorized key for the user using a local public key file
        ansible.posix.authorized_key:
          user: "{{ username }}"
          state: present
          key: "{{ ssh_private_key_file }}"
    
      - name: install additional packages
        ansible.builtin.dnf:
          name: "{{ additional_packages }}"
          state: latest
    EOF
       
    

    剧本的具体任务和模块名称旨在使剧本自我记录。这些项目指示播放的地点和谁:

    • hosts: all:此行指定库存中的哪些主机将运行这些任务。
    • become: yes:指示本节中的任务在默认情况下使用 sudo 特权运行。
    • vars_files”此指令加载包含本教程的手册配置的变量文件。

安装所需的集合

ansible-core 软件包包含用于管理主机的最小模块集,这些模块组织在 ansible.builtin 集合中。集合是用于分发执行目标任务的剧本、角色、模块或插件的方法。ansible-core 需要下载并安装在内建外部所需的任何模块或集合。

由于上面的剧本使用 ansible.posix 集合,我们需要安装此集合和其他集合。要做到这一点,最简单的方法是创建一个包含所有依赖性的要求文件。

  1. 创建需求文件。

    cat << 'EOF' | tee ~/ol-playbook/requirements.yml > /dev/null
    ---
    collections:
      - name: ansible.posix
      - name: community.crypto
    EOF
    
  2. 安装集合。

    ansible-galaxy collection install -r ~/ol-playbook/requirements.yml
    

    输出显示从 Galaxy 站点检索压缩归档文件的过程,然后将其安装到 .ansible/collections. 下的起始目录中

    注:如果输出显示 ERROR: Ansible requires the locale encoding to be UTF-8; Detected None.,则表示 ansible 的区域设置不正确。通过设置以下两个环境变量来修复问题:

    export LC_ALL="en_US.UTF-8"
    export LC_CTYPE="en_US.UTF-8"
    

运行手册

在运行手册之前,我们必须为此项目创建一个清单文件,指向我们计划管理的远程 Oracle Linux 实例。

  1. 将 ol-host 的 IP 地址分配给远程系统的变量。

    通过此变量,可以更轻松地编写创建清单文件的脚本。

    export REMOTE=<ip_address_of_instance>
    
  2. 在项目目录中创建新的清单文件。

    cat << EOF | tee ~/ol-playbook/inventory > /dev/null
    [production]
    ol-host ansible_host=$REMOTE
    EOF
    
  3. 转到项目工作目录。

    cd ~/ol-playbook
    
  4. 使用即席 ping 命令测试连接。

    ansible ol-host -i ~/ol-playbook/inventory -m ping -u opc
    
    • -u:传递 ssh 连接的用户名。在免费实验室环境中,我们使用 opc 用户,即在 Oracle Cloud Infrastructure (OCI) 中的 Oracle Linux 实例上提供的默认用户。通过在提示符下键入 yes 以继续,批准 ECDSA 密钥指纹。

    该命令会成功运行,结果与所示结果类似。

    输出示例:

    ol-host | SUCCESS => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        },
        "changed": false,
        "ping": "pong"
    }
    
  5. 运行剧本。

    ansible-playbook -i inventory setup.yml -u opc
    

    该命令应成功运行,并显示每个播放的 changed 结果。

连接至远程主机

如果播放簿成功运行,则可以使用 username 变量中定义的用户连接到远程系统。

  1. 通过 SSH 连接到 ol-host 系统。

    ssh oracle@$REMOTE
    

    如果更改了 ssh_key_file 变量的值,则需要将 `-i' 选项传递给 ssh,并指向指定对的私钥文件。

    示例:

    ssh -i ~/.ssh/<local_ssh_private_key> <username>@<ip_address_of_host>
    
  2. 验证所请求的软件包的安装。

    登录后,您可以验证该手册是否已安装 git 软件包。

    git --version
    
  3. 从远程主机断开连接。

    exit
    

添加资料档案库

Oracle Linux 为部署关键任务应用提供了一个安全、可扩展且可靠的平台。添加额外的系统信息库用于安装新的 Oracle 产品或第三方应用程序。Oracle Linux 提供了用于处理这些附加系统信息库预配的补充软件包。

Oracle Linux YUM 服务器提供了有关 Oracle 提供的众多系统信息库的详细信息。

  1. 将这些附加任务添加到现有剧本文件。

    cat << EOF | tee -a setup.yml > /dev/null
      - name: Add the EPEL repository
        ansible.builtin.dnf:
          name: oracle-epel-release-el8
          state: present
        when:
          - ansible_distribution == 'OracleLinux'
          - ansible_facts['distribution_major_version'] == '8'
    
      - name: Add the EPEL repository
        ansible.builtin.dnf:
          name: oracle-epel-release-el9
          state: present
        when:
          - ansible_distribution == 'OracleLinux'
          - ansible_facts['distribution_major_version'] == '9'
    
      - name: Install the htop utility package
        ansible.builtin.dnf:
          name: htop
          enablerepo: ol8_developer_EPEL
          state: present
        when:
          - ansible_distribution == 'OracleLinux'
          - ansible_facts['distribution_major_version'] == '8'
    
      - name: Install the htop utility package
        ansible.builtin.dnf:
          name: htop
          enablerepo: ol9_developer_EPEL
          state: present
        when:
          - ansible_distribution == 'OracleLinux'
          - ansible_facts['distribution_major_version'] == '9'
    EOF
    

    此手册在定义的游戏中添加了多个任务。第一个集将 EPEL 系统信息库添加到 Oracle Linux 实例上的现有软件系统信息库。同时,第二组 play 将 htop 软件包安装到同一目标主机实例上。

    值得注意的参数:

    • state: present:确保引用的软件包已在系统上或使用 dnf 进行安装。
    • enablerepo:仅在当前任务持续时间内启用特定系统信息库(如果禁用)。
  2. 重新运行剧本以执行其他任务。

    ansible-playbook -i inventory setup.yml -u opc
    

    手册已成功完成,在运行期间显示一些警告。您现在可以忽略这些警告,因为它们不会影响当前的手册。手册报告正确完成的任务,状态为 okchangedchanged 状态指示手册在请求最新版本的软件包时通过添加 htop 软件包或更新 dnf 高速缓存来修改主机,而不仅仅是检查是否存在。ok 指示任务的完成,不需要执行任何操作。

  3. 验证系统信息库和软件包的安装。

    ssh oracle@$REMOTE which htop
    
  4. 运行 htop 命令。

    ssh oracle@$REMOTE -t htop
    

    SSH 命令的 -t 选项强制进行 TTY 分配,因为 htop 需要交互式 shell。

  5. 通过键入 q 退出 htop 程序。

添加、更新和删除文件和目录

  1. 通过将以下内容添加到现有播放簿文件来创建目录和文件。

       
    cat << EOF | tee -a setup.yml > /dev/null     
    
      - name: Create an example directory (if it does not already exist)
        ansible.builtin.file:
          path: "/home/{{ username }}/example"
          state: directory
          mode: '0755'
        become_user: "{{ username }}"
    
      - name: Create an empty file
        ansible.builtin.file:
          path: "/home/{{ username }}/example/test.txt"
          state: touch
          # mode: u=rw,g=r,o=r
        become_user: "{{ username }}"
    EOF
       
    

    此手册在定义的播放中添加了两个任务。第一个在远程用户的起始目录中创建名为 example 的新目录,第二个在新创建的 example 目录中创建名为 test.txt 的空文件。

    值得注意的其他参数:

    • state:ansible.builtin.file 模块支持以下参数: absentdirectoryfilehardlinktouch 。这些任务使用 directory (如果目录路径尚不存在)和 touch (如果尚不存在,则创建空文件)。
    • mode:为创建的对象设置文件系统权限。使用命令行时,可以使用八进制 0644 或符号 u=rw,g=r,o=r 模式。如果省略 mode: 参数,则会应用系统缺省模式。
    • become_user: "":使用 Oracle Linux Automation Engine 特权升级功能执行任务。在以前的教程中,我们介绍了 become: 特权升级功能,以 root 用户身份运行任务。此示例说明如何使用类似功能以其他用户身份执行任务。我们将用户设置为变量 "",在 vars/defaults.yml 文件中将其预定义为 oracle 用户。因此,此任务以 oracle 用户身份运行,并继承该用户的缺省值。
  2. 运行剧本以执行其他任务。

    ansible-playbook -i inventory setup.yml -u opc
    
  3. 确认远程主机上存在新目录和文件。

    ssh oracle@$REMOTE ls -al example
    

    输出确认创建新目录和空文件。请注意,test.txt 文件的字节数为零, oracle 用户拥有该文件。

  4. 添加多个文件。

    在系统设置期间,您可能需要在一个目录中创建多个文件。您可以将一个目录中的多个文件创建为单个原子操作,而不是使用单个任务。

       
    cat << EOF | tee -a setup.yml > /dev/null     
    
      - name: Add multiple files
        ansible.builtin.file:
          path: "/home/{{ username }}/example/{{ item }}"
          state: touch
        with_items:
        - file01.txt
        - file02.txt
        - file03.txt
        - file04.txt
        become_user: "{{ username }}"
    EOF
       
    

    此任务使用循环从列表中创建多个空文件。

    • path::定义远程系统上写入文件的位置。在运行时,Oracle Linux Automation Engine 将 `` 变量替换为 with_items 参数中的每个 item
    • with_items::此参数指示在运行此任务期间要循环的 items 的列表。虽然此示例仅使用四个文件名,但您可以根据需要创建列表。
  5. 运行剧本以执行其他任务。

    ansible-playbook -i inventory setup.yml -u opc
    
  6. 确认远程主机上存在新目录和文件。

    ssh oracle@$REMOTE ls -al example
    

    输出显示原始 test.txt 文件和新文件。

  7. 向文件中添加单行内容。

       
    cat << 'EOF' | tee -a setup.yml > /dev/null     
    
      - name: Insert some text into the test.txt file
        ansible.builtin.lineinfile:
          path: "/home/{{ username }}/example/test.txt"
          line: This is a test
          create: True
          owner: "{{ username }}"
          group: "{{ username }}"
          mode: '0644'
    
      - name: Add an extra line after the line just inserted
        ansible.builtin.lineinfile:
          path: "/home/{{ username }}/example/test.txt"
          regexp: '^a test'
          insertafter: 'This is a test'
          line: This is an additional test.
          create: True
          owner: "{{ username }}"
          group: "{{ username }}"
          mode: '0644'
    
      - name: Get the contents of the test.txt file
        ansible.builtin.command: cat ~/example/test.txt
        register: command_output
        become_user: "{{ username }}"
    
      - name: Print the results of the cat command
        ansible.builtin.debug:
          msg: "{{ command_output }}"
    
      - name: Print only the lines added to the text file
        ansible.builtin.debug:
          msg: "{{ command_output.stdout_lines }}"
    EOF
       
    
    • 前两个任务使用 ansible.builtin.lineinfile 在文件中添加和更新单行。

    • 其余任务显示用于确认更改的方法。手册首先使用 ansible.builtin.command 将更新的文件的内容输出到 stdout,并将其保存在 register 变量中。然后,它使用 ansible.builtin.debug 模块将该内容打印到屏幕,作为手册输出的一部分。第二个调试任务演示了将输出限制为上一任务中 JSON 输出的特定部分的方法。

  8. 运行剧本以执行其他任务。

    ansible-playbook -i inventory setup.yml -u opc
    

    手册中的最后一个任务使用 debug 模块打印文件的内容。

  9. 将多行内容添加到文件中。

       
    cat << EOF | tee -a setup.yml > /dev/null     
    
      - name: Add two lines into test.txt
        ansible.builtin.blockinfile:
          path: "/home/{{ username }}/example/test.txt"
          insertafter: 'This is some updated text that was added later.'
          block: |
            "Welcome to {{ ansible_hostname }}"
            "Last updated on {{ ansible_date_time.iso8601 }}"
    
      - name: Create a new file and insert content into it
        ansible.builtin.copy:
          content: |
            === The text below was added by Oracle Linux Automation Engine ==========
    
            Hello from the ansible.builtin.copy module.
            This task is an example of inserting multiple lines into a text file.
            You can insert more lines if you want.
    
            === The text above was added by Oracle Linux Automation Engine ===========
          dest: "/home/{{ username }}/example/testing.txt"
          mode: '0644'
        become_user: "{{ username }}"
    EOF
       
    
  10. 运行剧本以执行其他任务。

    ansible-playbook -i inventory setup.yml -u opc
    
  11. 确认文件中存在两个新行。

    ssh oracle@$REMOTE cat example/test.txt
    

    输出显示添加的内容,并根据剧本在运行时针对远程主机自动收集事实来解释任务的变量值。

  12. 确认新文件的创建和我们的内容的添加。

    ssh oracle@$REMOTE cat example/testing.txt
    
  13. 删除文件和目录。

    除了创建文件和目录以及添加文本外,Oracle Linux Automation Engine 还可以删除这些项。让我们删除此手册创建的目录和所有文件,使系统保持与我们启动时相同的状态。这些任务首先使用设置为 absentstate: 参数删除文件列表,然后删除目录。第二个任务处理在一个步骤中删除文件和目录。尽管如此,我们还是首先介绍了 Oracle Linux Automation Engine 功能的其他演示任务。

        
    cat << EOF | tee -a setup.yml > /dev/null     
    
      - name: Delete multiple files
        ansible.builtin.file:
          path: '{{ item }}'
          state: absent
        with_items:
          - "/home/{{ username }}/example/test.txt"
          - "/home/{{ username }}/example/file01.txt"
          - "/home/{{ username }}/example/file02.txt"
          - "/home/{{ username }}/example/file03.txt"
          - "/home/{{ username }}/example/file04.txt"
          - "/home/{{ username }}/example/testing.txt"
    
      - name: Recursively remove directory
        ansible.builtin.file:
          path: "/home/{{ username }}/example"
          state: absent
    EOF
        
    

    可以使用显示的第二个任务以递归方式删除目录和任何内容。如果您只想删除特定文件,则第一个任务(单独删除文件)可用。如果要同时删除文件和文件以及目录,则第二个任务更高效。

  14. 运行剧本以执行其他任务。

    ansible-playbook -i inventory setup.yml -u opc
    
  15. 检验是否删除了指定的目录。

    ssh oracle@$REMOTE ls
    

    缺少输出可确认指定的目录和本教程期间创建的文件不再存在。

后续步骤

恭喜您在本课程已经学到这里了。本教程介绍了 Oracle Linux Automation Engine 如何实现 Oracle Linux 上的常规任务自动化,包括安装软件包、创建、更新和删除文件和目录,以及向 Oracle Linux 添加用户帐户。我们还演示了如何利用 Oracle Linux Automation Engine 的 ansible.builtin.debug 模块在执行 Playbook 时向终端显示信息。凭借这些技能,您可以开始冒险并撰写剧本。

更多学习资源

浏览 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 渠道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心