注意:

使用 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"
    use_olae_only: true
    EOF
    
  6. 部署实验室环境。

    ansible-playbook create_instance.yml -e localhost_python_interpreter="/usr/bin/python3.6" -e "@instances.yml"
    

    空闲实验室环境需要额外的变量 local_python_interpreter,该变量为在 localhost 上运行的播放设置 ansible_python_interpreter。此变量是必需的,因为环境为 Python 的 Oracle Cloud Infrastructure SDK 安装 RPM 程序包,该程序包位于 python3.6 模块下。

    默认部署配置使用 AMD CPU 和 Oracle Linux 8。要使用 Intel CPU 或 Oracle Linux 9,请将 -e instance_shape="VM.Standard3.Flex"-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
    

    该命令应成功运行,显示每个播放的已更改结果。

连接至远程主机

如果播放簿成功运行,则可以使用 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: 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'
    EOF
    

    此手册在定义的播放中添加了两个任务。第一种方法是将 EPEL 系统信息库添加到 Oracle Linux 实例上的现有软件系统信息库。同时,第二个播放会将 htop 软件包安装到同一目标主机实例上。

    值得注意的参数:

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

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

    剧本成功完成,显示了一些我们可以忽略的警告。剧本以 okchanged 状态报告正确完成的任务。changed 状态表示在请求最新版本的软件包时,剧本通过添加 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 some updated text that was added later.
          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 帮助中心