Ansible 是一个开源 IT 配置管理和自动化平台。它使用人类可读的 YAML 模板,因此用户可以对重复性任务进行编程以自动执行,而无需学习高级编程语言。
Ansible 是无代理的,这意味着它管理的节点不需要在其上安装任何软件。这消除了潜在的安全漏洞,并使整体管理更加顺畅。
Ansible 模块 是独立的脚本,可以在 Ansible playbook 中使用。playbook 由 play 组成,而 play 由任务组成。如果您是 Ansible 新手,这些概念可能看起来令人困惑,但是当您开始编写和更多地使用 playbook 时,它们将变得熟悉。
有一些模块经常用于自动化日常任务;这些是我们在本文中将介绍的模块。
Ansible 有三个主要文件需要您考虑
- 主机/清单文件: 包含需要管理的节点的条目
- Ansible.cfg 文件: 默认位于 /etc/ansible/ansible.cfg,它具有必要的权限提升选项和清单文件的位置
- 主文件: 一个 playbook,其中包含在清单或主机文件中列出的主机上执行各种任务的模块
模块 1:软件包管理
大多数流行的软件包管理器(例如 DNF 和 APT)都有一个模块,使您可以在系统上安装任何软件包。功能完全取决于软件包管理器,但通常这些模块可以安装、升级、降级、删除和列出软件包。相关模块的名称很容易猜到。例如,DNF 模块是 dnf_module,旧的 YUM 模块(Python 2 兼容性需要)是 yum_module,而 APT 模块是 apt_module,Slackpkg 模块是 slackpkg_module,等等。
示例 1
- name: install the latest version of Apache and MariaDB
dnf:
name:
- httpd
- mariadb-server
state: latest
这会安装 Apache Web 服务器和 MariaDB SQL 数据库。
示例 2
- name: Install a list of packages
yum:
name:
- nginx
- postgresql
- postgresql-server
state: present
这会安装软件包列表并帮助下载多个软件包。
[ 提升您的自动化专业知识。获取 Ansible 清单: 迁移到 Red Hat Ansible Automation Platform 2 的 5 个理由 ]
模块 2:服务
安装软件包后,您需要一个模块来启动它。service 模块 使您可以启动、停止和重新加载已安装的软件包;这非常方便。
示例 1
- name: Start service foo, based on running process /usr/bin/foo
service:
name: foo
pattern: /usr/bin/foo
state: started
这将启动服务 foo。
示例 2
- name: Restart network service for interface eth0
service:
name: network
state: restarted
args: eth0
这将重新启动接口 eth0 的网络服务。
模块 3:复制
copy 模块 将文件从本地或远程计算机复制到远程计算机上的某个位置。
示例 1
- name: Copy a new "ntp.conf file into place, backing up the original if it differs from the copied version
copy:
src: /mine/ntp.conf
dest: /etc/ntp.conf
owner: root
group: root
mode: '0644'
backup: yes
示例 2
- name: Copy file with owner and permission, using symbolic representation
copy:
src: /srv/myfiles/foo.conf
dest: /etc/foo.conf
owner: foo
group: foo
mode: u=rw,g=r,o=r
模块 4:调试
debug 模块 在执行期间打印语句,可用于调试变量或表达式,而无需暂停 playbook。
示例 1
- name: Display all variables/facts known for a host
debug:
var: hostvars[inventory_hostname]
verbosity: 4
这显示了清单文件中定义的主机的所有变量信息。
示例 2
- name: Write some content in a file /tmp/foo.txt
copy:
dest: /tmp/foo.txt
content: |
Good Morning!
Awesome sunshine today.
register: display_file_content
- name: Debug display_file_content
debug:
var: display_file_content
verbosity: 2
这会注册复制模块输出的内容,并且仅当您将详细程度指定为 2 时才显示。例如
ansible-playbook demo.yaml -vv
模块 5:文件
file 模块 管理文件及其属性。
- 它设置文件、符号链接或目录的属性。
- 它还删除文件、符号链接或目录。
示例 1
- name: Change file ownership, group and permissions
file:
path: /etc/foo.conf
owner: foo
group: foo
mode: '0644'
这会创建一个名为 foo.conf 的文件,并将权限设置为 0644。
示例 2
- name: Create a directory if it does not exist
file:
path: /etc/some_directory
state: directory
mode: '0755'
这会创建一个名为 some_directory 的目录,并将权限设置为 0755。
模块 6:Lineinfile
lineinfile 模块 管理文本文件中的行。
- 它确保特定行在文件中,或者使用反向引用的正则表达式替换现有行。
- 当您只想更改文件中的单行时,它非常有用。
示例 1
- name: Ensure SELinux is set to enforcing mode
lineinfile:
path: /etc/selinux/config
regexp: '^SELINUX='
line: SELINUX=enforcing
这会将 SELINUX=enforcing 的值设置为 enforcing。
示例 2
- name: Add a line to a file if the file does not exist, without passing regexp
lineinfile:
path: /etc/resolv.conf
line: 192.168.1.99 foo.lab.net foo
create: yes
这会在 resolv.conf 文件中为 IP 和主机名添加一个条目。
模块 7:Git
git 模块 管理仓库的 git checkout 以部署文件或软件。
示例 1
# Example Create git archive from repo
- git:
repo: https://github.com/ansible/ansible-examples.git
dest: /src/ansible-examples
archive: /tmp/ansible-examples.zip
示例 2
- git:
repo: https://github.com/ansible/ansible-examples.git
dest: /src/ansible-examples
separate_git_dir: /src/ansible-examples.git
这将克隆具有单独 Git 目录的仓库。
模块 8:Cli_command
cli_command 模块,首次在 Ansible 2.7 中可用,提供了一种平台无关的方式,通过 network_cli 连接 插件将基于文本的配置推送到网络设备。
示例 1
- name: commit with comment
cli_config:
config: set system host-name foo
commit_comment: this is a test
这为交换机设置主机名并以提交消息退出。
示例 2
- name: configurable backup path
cli_config:
config: "{{ lookup('template', 'basic/config.j2') }}"
backup: yes
backup_options:
filename: backup.cfg
dir_path: /home/user
这会将配置备份到不同的目标文件。
模块 9:Archive
archive 模块 创建一个或多个文件的压缩存档。默认情况下,它假定压缩源存在于目标上。
示例 1
- name: Compress directory /path/to/foo/ into /path/to/foo.tgz
archive:
path: /path/to/foo
dest: /path/to/foo.tgz
示例 2
- name: Create a bz2 archive of multiple files, rooted at /path
archive:
path:
- /path/to/foo
- /path/wong/foo
dest: /path/file.tar.bz2
format: bz2
模块 10:Command
作为最基本但最有用的模块之一,command 模块 接受命令名称,后跟以空格分隔的参数列表。
示例 1
- name: return motd to registered var
command: cat /etc/motd
register: mymotd
示例 2
- name: Change the working directory to somedir/ and run the command as db_owner if /path/to/database does not exist.
command: /usr/bin/make_database.sh db_user db_name
become: yes
become_user: db_owner
args:
chdir: somedir/
creates: /path/to/database
结论
Ansible 中有大量模块可用,但这十个是最基本和最强大的模块,您可以用于自动化作业。随着您的需求变化,您可以通过在命令行中输入 ansible-doc <module-name> 或参考 官方文档 来了解其他有用的模块。
6 条评论