简介

基于Python开源的自动化工具,用于配置管理、部署、编排和远程执行任务,它使用SSH协议进行通信,由Paramiko(Python库)、 PyYAML和Jinja2 ( 模板化 ) 三个关键模块实现,并使用基于YAML的描述文件来定义任务和配置

特性

  • 模块化
  • 无客户端
  • 主从模式
  • 幂等性

关键参数

  1. 主机清单(Inventory):主机清单是一个YAML或INI格式的文件,用于定义受管理的主机和主机组,它指定了Ansible将在哪些主机上执行任务

  2. 模块(Module):模块是Ansible的基本执行单元,用于在目标主机上执行特定的任务,Ansible提供了丰富的模块库,包括文件操作、软件包管理、用户管理等各种功能

  3. Playbook(剧本):Playbook是一个YAML格式的文件,用于定义一系列任务和配置的顺序,它描述了Ansible在目标主机上执行的操作流程,包括主机选择、任务执行和变量设置等

  4. 角色(Role):角色是一种组织和复用任务和配置的方法,它将相关的任务、变量和文件组织在一起,以便在多个Playbook中重复使用

  5. 变量(Variable):变量用于存储和传递数据,在Playbook中可以使用变量来实现灵活的配置,变量可以在主机清单、Playbook和角色中定义,并可以通过模板或命令行参数进行动态设置

  6. Handlers:Handlers是一种特殊的任务,它用于响应其他任务的状态变化,当某个任务发生变化时,Handlers可以触发相应的操作,如重新启动服务、重新加载配置等

  7. 模板(Template):模板是一种用于生成配置文件的机制,Ansible使用jinja2模板引擎,可以在模板中使用变量和条件语句来动态生成配置文件

  8. Vault:Vault用于安全地存储敏感信息,如密码和密钥,它可以加密和解密Ansible的变量文件,以防止敏感信息泄露

开始

[root@localhost ~]# ansible localhost -m command -a 'echo hello world!'
localhost | CHANGED | rc=0 >>
hello world!

Ad-Hoc

简短地指令,指令操作模式

[root@localhost ansible]# ansible local -m ping
10.191.101.254 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

Ad-Hoc commands 一次只能处理一件事情,这即是它与 Playbooks 最大的差异

Playbook

Ansible 剧本,可以通过事先写好的剧本 (Playbooks)来让各个被控节点进行指定的动作 (Plays) 和任务 (Tasks)

[root@localhost ansible]# ansible-playbook playbooks/main.yml

PLAY [Test] *************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [10.191.101.254]

TASK [Hello world] ******************************************************************************************************************************
changed: [10.191.101.254]

TASK [Print stdout] *****************************************************************************************************************************
ok: [10.191.101.254] => {
    "msg": ""
}

PLAY RECAP **************************************************************************************************************************************
10.191.101.254             : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Play、Task与Module

  • Play:通常为某个特定的目的,例如:
    • Setup a official website with Drupal (借由 Drupal 建置官网)
    • Restart the API service (重开 API 服务)
  • Task:是要实行 Play 这个目地所需做的每个步骤,例如:
    • Install the Nginx (安裝 Nginx)
    • Kill the djnago process (强制停止 django 的行程)
  • Module:Ansible 所提供的各种操作方法,例如:
    • apt: name=vim state=present (使用 apt 套件安装 vim)
    • command: /sbin/shutdown -r now (使用 shutdown 的指令重新开机)

Ansible inventory

用于动态生成Ansible inventory的命令行工具,Ansible inventory用于定义Ansible可以管理的主机和主机组,以及与这些主机相关的变量,通过使用ansible-inventory命令,可以根据不同的数据源生成动态的Ansible inventory

  1. 查看当前主机和主机组
ansible-inventory --list
  1. 使用静态文件生成inventory,使用静态的INI格式文件来定义主机和主机组
[web_servers]
web1 ansible_host=192.168.1.10
web2 ansible_host=192.168.1.11
 
[db_servers]
db1 ansible_host=192.168.1.20
db2 ansible_host=192.168.1.21
  1. 使用动态脚本来生成更灵活的inventory,创建一个Python脚本,并实现必要的逻辑来动态生成inventory
ansible-inventory -i dynamic_inventory.py --list
  1. 使用外部数据源生成inventory,ansible-inventory可以与外部数据源集成,如AWS EC2、OpenStack,使用相关插件来配置和指定数据源
ansible-inventory -i ec2.yaml --list

ansible hosts

/etc/ansible/hosts 是主机清单配置文件,由 ansible.cfg文件中的 inventory 变量配置,默认值为/etc/ansible/hosts,在使用ansible命令前,需要对hosts文件进行相关主机清单配置

参数名称作用说明举例
ansible_ssh_host# 用于指定被管理的主机的真实IPansible_ssh_host=192.168.1.1
ansible_ssh_port# 用于指定连接到被管理主机的ssh端口号,默认是22ansible_ssh_port=2000
ansible_ssh_user# ssh连接时默认使用的用户名ansible_ssh_user=dba
ansible_ssh_pass# ssh连接时的密码ansible_ssh_pass=test1234
ansible_sudo# sudo用户ansible_sudo=dba
ansible_sudo_pass# 使用sudo连接用户时的密码ansible_ssh_pass=test1234
ansible_sudo_exec# 如果sudo命令不在默认路径,需要指定sudo命令路径ansible_sudo_exec=/usr/bin/sudo
ansible_ssh_private_key_file# 秘钥文件路径,秘钥文件如果不想使用ssh-agent管理时可以使用此选项ansible_ssh_private_key_file=/root/key
ansible_shell_type# 目标系统的shell的类型,默认shansible_shell_type=bash
ansible_connectionSSH 连接的类型: local , ssh , paramiko,在 ansible 1.2 之前默认是 paramiko ,后来智能选择,优先使用基于 ControlPersist 的 ssh (支持的前提)ansible_connection=local
ansible_python_interpreter# 用来指定python解释器的路径,默认为/usr/bin/python 同样可以指定ruby 、perl 的路径ansible_python_interpreter=/usr/bin/python2.7
ansible_*_interpreter# 其他解释器路径,用法和ansible_python_interpreter类似,这里”*“可以是ruby或才perl等其他语言ansible_*_interpreter=/usr/bin/ruby

指定python版本

指定受控端python版本

192.168.8.101 ansible_python_interpreter=/usr/bin/python2.7

在受控端使用指定版本的python安装对应ansible module

/usr/bin/python2.7 -m pip install xxxx

Ansible Galaxy

Ansible Galaxy是一个用于共享和管理Ansible角色的平台,当使用Ansible Galaxy创建或安装角色时,它会生成一种常见的目录结构,以便更好地组织和管理角色

创建角色:使用ansible-galaxy init命令创建角色,并指定角色的名称,创建一个名为”my_role”的角色

ansible-galaxy init my_role

典型目录结构

role_name/
  ├── defaults/
  │   └── main.yml
  ├── files/
  │   └── some_file.txt
  ├── handlers/
  │   └── main.yml
  ├── meta/
  │   └── main.yml
  ├── tasks/
  │   └── main.yml
  ├── templates/
  │   └── some_template.j2
  ├── vars/
  │   └── main.yml
  └── README.md
  • defaults/:包含角色的默认变量,这些变量会被其他任务和角色使用
  • files/:包含角色使用的静态文件,如配置文件或脚本
  • handlers/:包含角色的处理程序,用于处理特定的事件或触发器
  • meta/:包含角色的元数据,如作者、依赖项和支持的平台
  • tasks/:包含角色的主要任务,即要执行的操作
  • templates/:包含角色使用的模板文件,这些文件可以根据变量动态生成内容
  • vars/:包含角色的变量文件,用于定义角色的变量值
  • README.md:角色的说明和文档

Ansible Galaxy

  1. 搜索角色,使用ansible-galaxy search命令搜索Ansible Galaxy上的角色

搜索名为”nginx”的角色

ansible-galaxy search nginx
  1. 查看角色详情,使用ansible-galaxy info命令查看角色的详细信息

查看名为”nginx”的角色的详细信息

ansible-galaxy info nginx
  1. 安装角色,使用ansible-galaxy install命令安装角色,可以通过指定角色名称和可选的版本号来安装角色

安装名为”nginx”的最新版本角色

ansible-galaxy install nginx

安装特定版本的角色

ansible-galaxy install nginx,1.0.0
  1. 使用角色,一旦安装了角色,可以使用roles关键字来指定要使用的角色
---
- name: My Playbook
  hosts: all
  roles:
      - nginx
  1. 管理角色,使用ansible-galaxy命令来管理已安装的角色
  • ansible-galaxy list命令列出已安装的角色
  • ansible-galaxy remove命令卸载角色
  • ansible-galaxy update命令更新角色

关键字

Ansible 是一个非常强大的自动化运维工具,它使用 YAML 格式的 Playbooks 来描述配置和任务,使得自动化任务变得清晰和易于管理。在 Ansible 中,有一些关键词和概念是经常使用的,下面列出了一些常见的关键词及其简单介绍:

  1. hosts: 定义目标主机,可以是单个主机名、IP 地址,也可以是主机组。例如,all, webservers, db_servers
  2. tasks: Playbook 中的基本构建单元,用来执行具体的操作,如安装软件包、修改配置文件、重启服务等。
  3. playbooks: YAML 文件,包含一系列的任务,用于描述一组主机上的自动化操作序列。Playbooks 是 Ansible 的主要配置文件。
  4. modules: Ansible 提供的可执行代码片段,用于执行特定的任务。例如,apt, yum, file, command, shell 等模块。
  5. handlers: 用于响应事件的特殊任务,比如在配置文件改变后重启服务。只有当被触发时,handler 才会被执行。
  6. roles: 将相关的任务、文件、模板和变量组织在一起的目录结构,用于实现模块化和重用。
  7. facts: Ansible 收集的关于远程主机的信息,如操作系统、内核版本、网络接口等。可以通过变量访问这些信息,例如 ansible_os_family, ansible_distribution, ansible_all_ipv4_addresses
  8. variables: 用于存储和传递信息的容器,可以在 Playbooks 和 Tasks 中使用。例如,my_var, ansible_ssh_host
  9. tags: 用于标记 Playbook 中的 tasks 或 plays,可以用于控制哪些任务在执行时被包含或跳过。
  10. when: 控制条件,用于指定某个 task 在满足特定条件下才执行。
  11. become: 用于执行需要更高权限的任务,相当于 sudo 或 su 的功能。可以通过 become: yessudo: yes 来启用。
  12. include_tasks: 用于在 Playbook 中包含另一个任务列表文件,实现任务的复用和模块化。
  13. import_playbook: 在当前 Playbook 中导入并执行另一个 Playbook。
  14. delegate_to: 用于将任务委托给另一台主机执行,而不是当前主机。
  15. rescue: 当一个任务失败时,执行 rescue 模块中的任务,用于错误处理。
  16. always: 无论前面的任务是否成功,总是执行 always 模块中的任务,常用于清理操作。
  17. loop: 用于迭代执行任务,可以基于列表或其他可迭代对象。
  18. block: 将多个任务组合在一起,用于一起应用 when, rescue, always 控制语句。
  19. register: 将任务输出注册到一个变量中,以便后续任务使用。
  20. with_items: 旧的迭代语法,已经被 loop 替换,但在一些老的 Playbooks 中仍然可见。

Module

command

command模块是个可以在远端上执行指令的指令模组(Commands Modules),但它不支持变数(变量)和  < ,  >,  |,  ;  和  & 等运算,若有这类请需求改用shell模块

  • chdir:指定要在远程主机上执行命令的工作目录
  • creates:指定一个文件路径,如果该文件存在,则命令将不会执行
  • executable:指定要执行的命令的可执行文件路径,例如/bin/bash
  • removes:指定一个文件路径,如果该文件不存在,则命令将不会执行
  • warn:默认为yes,如果设置为no,则不会在命令失败时发出警告
  • stdin:将命令的标准输入设置为指定的字符串
  • stdin_add_newline:默认为yes,如果设置为no,则不会在stdin末尾添加换行符
  • strip_empty_ends:默认为yes,如果设置为no,则不会去掉命令输出中的空行
  • cmd:要在远程主机上执行的命令

shell

shell模块用于在远程主机上执行Shell命令

  • chdir:指定要在远程主机上执行命令的工作目录
  • creates:指定一个文件路径,如果该文件存在,则命令将不会执行
  • executable:指定要执行的命令的可执行文件路径,例如/bin/bash
  • removes:指定一个文件路径,如果该文件不存在,则命令将不会执行
  • warn:默认为yes,如果设置为no,则不会在命令失败时发出警告
  • stdin:将命令的标准输入设置为指定的字符串
  • stdin_add_newline:默认为yes,如果设置为no,则不会在stdin末尾添加换行符
  • strip_empty_ends:默认为yes,如果设置为no,则不会去掉命令输出中的空行
  • cmd:要在远程主机上执行的Shell命令

> 和 | 有什么异同

在 Ansible 中,shell 模块和其他模块一样,可以接受多行字符串作为参数值。当需要传递一个多行的命令或者脚本时,可以使用 >| 来定义这些多行字符串。这两种方式的主要区别在于如何处理空白字符(空格、制表符)和如何对文本进行折叠。

使用 | (Pipe) 符号

当使用 | 符号时,Ansible 会将下一行开始的文本作为多行字符串,直到下一个 | 符号出现或 YAML 文件结束。使用 | 时,所有缩进都会被忽略,只保留相对缩进。这意味着在 | 下方写的任何文本都将保持原样,除了最左侧的缩进会被移除。例如:

shell: |
  echo "This is line one."
  echo "This is line two with extra tabs\t\tand spaces. "

在这个例子中,echo 命令后面的空白字符会被保留,而最左侧的缩进(通常是两个空格或一个制表符)会被移除。

使用 > 符号

当使用 > 符号时,Ansible 会像使用 | 一样创建一个多行字符串,但是它会对文本进行折叠,移除所有的前导缩进,并且将连续的空白字符压缩成一个空格。例如:

shell: >
  echo "This is line one."
  echo "This is line two with extra tabs\t\tand spaces. "

在这个例子中,所有的前导缩进会被移除,而且连续的空白字符(包括空格和制表符)会被压缩成一个空格。

stat

stat 模块用于获取文件或路径的状态信息

  • path(必需):要检查状态的文件或路径
  • follow:如果路径是符号链接,是否跟随链接获取链接指向的文件的状态,默认为 no,不跟随链接
  • get_checksum:是否获取文件的校验和,默认为 no
  • checksum_algorithm:用于计算校验和的算法,仅当 get_checksum 为 yes 时有效,可选的值有 md5sha1sha224sha256sha384 和 sha512,默认为 md5
  • get_md5get_sha1get_sha224get_sha256get_sha384get_sha512:分别指定是否获取特定类型的校验和,这些选项会覆盖 get_checksum 和 checksum_algorithm
  • follow_ancestors:如果路径不存在,是否跟随祖先路径,默认为 no
  • file_type:用于检查文件类型的选项,可选的值有 filedirectorysymlinkhard 和 socket,可以指定多个类型,以逗号分隔
  • file_gidfile_group:用于检查文件所属组的选项,可以指定组 ID 或组名
  • file_uidfile_owner:用于检查文件所有者的选项,可以指定用户 ID 或用户名
  • path_stat:指定一个变量名,将状态信息存储在该变量中,而不是默认的 stat 变量
  • follow_mode:是否跟随路径获取模式,默认为 yes

文件状态属性

  • exists:文件是否存在,返回布尔值(true 或 false
  • isdir:文件是否是目录,返回布尔值
  • isfile:文件是否是常规文件,返回布尔值
  • isreg:文件是否是普通文件,返回布尔值
  • islink:文件是否是符号链接,返回布尔值
  • uid:文件的所有者用户 ID
  • gid:文件的所有者组 ID
  • mode:文件的权限模式,以八进制表示
  • size:文件的大小(字节)
  • mtime:文件的修改时间戳

file

file模块用于管理文件和目录的属性和权限

  • path:指定要管理的文件或目录的路径
  • state:指定文件或目录的状态,可以是filedirectorylinkhardtouch
  • mode:指定文件或目录的权限模式,例如0644
  • owner:指定文件或目录的所有者
  • group:指定文件或目录的所属组
  • recurse:如果设置为yes,则递归地应用文件或目录的属性和权限
  • follow:如果设置为yes,则会跟随符号链接操作
  • force:如果设置为yes,在修改文件或目录属性时会强制执行
  • selevel:指定SELinux安全标签的级别
  • serole:指定SELinux安全标签的角色
  • setype:指定SELinux安全标签的类型
  • seuser:指定SELinux安全标签的用户

copy

copy模块用于将文件或目录复制到远程主机

  • src:指定要复制的源文件或目录的路径
  • dest:指定目标文件或目录的路径
  • backup:如果设置为yes,在复制文件之前会创建备份文件
  • force:如果设置为yes,则即使目标文件已存在,也会强制复制文件
  • mode:指定目标文件的权限模式,例如0644
  • owner:指定目标文件的所有者
  • group:指定目标文件的所属组
  • remote_src:如果设置为yes,则将在远程主机上查找源文件
  • validate:指定一个命令来验证复制的文件,如果验证命令不返回零,则会发出错误
  • follow:如果设置为yes,则会跟随源文件的符号链接进行复制
  • content:将指定的内容复制到目标文件

fetch

fetch模块用于从远程主机复制文件到控制节点

  • src:指定要复制的远程主机上的文件路径
  • dest:指定目标文件或目录的路径
  • flat:如果设置为yes,则在目标目录中只创建一个文件,而不是使用远程主机上的完整路径
  • validate_checksum:如果设置为yes,则在复制文件之前检查文件的校验和
  • md5sum_file:指定一个文件路径,用于存储远程主机上文件的校验和
  • backup:如果设置为yes,在复制文件之前会创建备份文件
  • force:如果设置为yes,则即使目标文件已存在,也会强制复制文件

debug

debug模块用于输出调试信息

  • msg:指定要输出的调试信息
  • var:指定要输出的变量的值
  • verbosity:指定输出的详细程度,可以是0(只输出关键信息)、1(默认,输出一般信息)、2(输出详细信息)等
  • debugger_on:如果设置为yes,则在输出调试信息后启用调试器

lineinfile

lineinfile模块用于在文件中搜索并替换行

  • path:指定要操作的文件的路径,
  • line:指定要插入、修改或删除的行内容
  • state:指定行的状态,可以是present(存在)、absent(不存在)、before(在指定行之前插入)、after(在指定行之后插入)等
  • regexp:指定用于搜索行的正则表达式
  • backrefs:如果设置为yes,则在替换行时可以在line中使用后向引用
  • insertafter:指定在哪一行之后插入新行
  • insertbefore:指定在哪一行之前插入新行
  • dest:指定目标文件的路径,如果设置,则会将匹配的行复制到该文件中
  • firstmatch:如果设置为yes,则只匹配第一条满足条件的行

gather_facts

gather_facts模块用于收集目标主机的系统信息。它会自动执行一系列的任务来获取主机的各种属性,如操作系统类型、版本、主机名、IP地址、CPU和内存信息等。

常见的参数选项如下:

  • gather_subset:指定要收集的子集。可以是all(默认值)、hardware、network、virtual、ohai、facter等。可以使用逗号分隔多个子集。
  • gather_timeout:指定收集信息的超时时间,单位为秒。默认为10秒。
  • filter:指定一个过滤器来选择要收集的主机。可以是一个主机模式,如web*,也可以是一个主机组名。
  • gather_timeout_msg:指定超时时打印的错误消息。
  • gather_subset:指定要收集的信息子集。
  • gather_timeout:指定收集信息的超时时间。
  • gather_timeout_msg:指定超时时的错误消息。

become

become功能允许在执行任务时切换到其他用户身份,例如root用户,以便执行需要特权的操作。

常用的参数:

  1. become: true:表示启用become功能,默认情况下为false,需要手动设置为true才能使用become功能。
  2. become_user: <username>:指定切换到的目标用户,默认为root。可以指定其他具有特权的用户。
  3. become_method: <method>:指定切换用户的方法。常见的方法包括sudo和su,默认为sudo。
  4. become_flags: <flags>:指定切换用户时附加的标志。可用于指定sudo的附加标志。
  5. become_exe: <executable>:指定用于切换用户的可执行文件。默认情况下,根据become_method自动选择适当的可执行文件。
  6. ansible_become_pass: <password>:指定become用户的密码。可以在剧本中明文指定密码,或者使用vault加密密码。

pre_tasks

pre_tasks是一组任务,这些任务会在playbook的主要任务之前执行。pre_tasks通常用于在执行主要任务之前进行一些准备工作,例如设置环境变量、安装前置依赖、检查目标主机状态等。

pre_tasks块可以在playbook的任何地方定义,通常位于playbook的顶层。它可以包含一个或多个任务,每个任务可以是一个单独的模块或一个包含多个模块的任务列表。

以下是一个使用pre_tasks的示例:

- name: Example playbook
  hosts: myhosts
  gather_facts: false
  pre_tasks:
    - name: Set environment variables
      shell: export MY_VAR=my_value
    - name: Install dependencies
      apt:
        name: my_package
        state: present
  tasks:
    - name: Main task
      # ...主要任务...

在上面的例子中,pre_tasks块包含了两个任务:设置环境变量和安装依赖。这些任务会在执行主要任务之前依次执行。

需要注意的是,pre_tasks块中的任务会在目标主机上按顺序执行,并且不受条件或循环控制的影响。如果pre_tasks中的任何任务失败,整个playbook都将失败,并且不会执行主要任务。

pre_tasks是一个可选项,根据实际需求决定是否使用。它通常用于执行一些必要的准备工作,以确保主要任务能够成功执行。

register

Ansible中的register关键字用于捕获任务(task)的输出,并将其保存到一个变量中,这样可以在后续的任务中调用这个变量。这种机制允许用户在执行特定操作后,根据操作的结果来决定如何响应,例如执行其他Ansible语句或进行条件判断等。通过使用register,可以将命令、模块或任务的输出存储到变量中,这不仅限于单个playbook内的使用,而且在不同的playbook之间也可以共享这些变量。例如,我们使用registerstat模块的结果保存到file_stat变量中:

- name: Check if file exists
  stat:
    path: /path/to/file
  register: file_stat

这将执行stat模块来检查文件是否存在,并将结果保存到file_stat变量中。然后,可以在后续任务中引用file_stat变量来获取之前任务的结果。在copy任务中使用了file_stat变量,以便根据文件是否存在来决定是否标记任务为”changed”:

- name: Create file if it doesn't exist
  copy:
    src: /path/to/source
    dest: /path/to/file
  changed_when: "'file_stat.stat.exists' == 'False'"

使用了file_stat.stat.exists来访问之前stat模块的结果中的文件存在信息。如果文件不存在,则任务被标记为”changed”。

changed_when

changed_when参数用于指定在哪些情况下标记任务为”changed”(已更改)。默认情况下,如果任何模块的返回结果中存在变化,则任务将被标记为”changed”。

为保证ansible代码的规范,在任务中需要明确是否返回对结果或条件的更改。除非任务只读取信息,否则应确保它们以以下方式返回更改:

  1. 注册结果或条件并使用changed_when子句。
  2. 使用creates或removes参数。

changed_when参数可以使用以下方式指定:

  1. 布尔值:当指定为True时,任务总是被标记为”changed”;当指定为False时,任务总是被标记为”ok”。
  2. 字符串:任务的输出将与指定的字符串进行比较。如果匹配,则任务被标记为”ok”;如果不匹配,则任务被标记为”changed”。可以使用Jinja2模板语法来引用变量。
  3. Python表达式:可以使用Python表达式来指定任务的返回结果是否应被标记为”changed”。可以使用Jinja2模板语法来引用变量。

示例:

- name: Check if file exists
  stat:
    path: /path/to/file
  register: file_stat
  
- name: Create file if it doesn't exist
  copy:
    src: /path/to/source
    dest: /path/to/file
  changed_when: "'file_stat.stat.exists' == 'False'"

首先使用stat模块检查文件是否存在,并将结果存储在file_stat变量中。然后,使用copy模块复制文件。如果文件不存在(即file_stat.stat.existsFalse),则任务被标记为”changed”,否则被标记为”ok”。

fqcn

在Ansible中,Fully Qualified Collection Name(FQCN)是一种用于指定模块、插件或动作的完整集合名称的方法。这种做法有助于避免命名冲突和提高代码的可读性。从Ansible 2.10版本开始,许多插件和模块已经迁移到了Collections上,这意味着它们现在属于特定的命名空间,如ansible.builtin 或自定义命名空间。使用FQCN可以确保操作使用的是正确的命名空间中的代码,从而避免了潜在的歧义和冲突。

例如,如果想要使用shell模块,而不是简单地写shell,应该使用其FQCN ansible.builtin.shell。同样,当引用一个集合的内容时,也可以通过FQCN来指定,如my_namespace.my _collection.my _module。此外,即使是在ansible-core中,也推荐使用FQCN来明确指出要使用的模块或插件,以避免与其他可能存在的集合发生冲突,并便于链接到模块文档。

在迁移Ansible playbook和角色时,强烈建议使用FQCN以避免意外行为。这是因为FQCN提供了一种更清晰的方式来指定使用的模块或插件的确切来源,尤其是在存在多个集合包含相同名称的模块或插件时。此外,使用FQCN还有助于保持Ansible内容的质量,通过遵循最佳实践,可以预防潜在的问题并维护一致且高效的自动化脚本。

FQCN是Ansible中一个重要的概念,它通过提供一个明确的命名空间来帮助开发者避免命名冲突,提高代码的可维护性和可读性。在编写Ansible剧本时,应当尽可能地使用FQCN来指定所需的模块、插件或动作。

示例:

- name: Hello world
  ansible.builtin.command:
    cmd: echo 'hello world'
  changed_when: false

service

service模块用于管理系统服务的状态

  • name:指定要管理的服务的名称
  • state:指定服务的状态,可以是started(启动)、stopped(停止)、restarted(重新启动)、reloaded(重新加载)等
  • enabled:如果设置为yes,则在系统启动时启用服务
  • disabled:如果设置为yes,则在系统启动时禁用服务
  • pattern:指定用于匹配服务进程的模式,可以是进程名称、进程ID等
  • arguments:指定启动服务时要传递的附加参数
  • sleep:指定在重新启动或重新加载服务之前等待的时间,以秒为单位
  • timeout:指定等待服务状态变化的超时时间,以秒为单位
  • runlevel:指定服务在哪个运行级别下启动

user

user模块用于管理系统用户,下面是一些常用的参数选项的介绍:

  • name:指定要管理的用户的用户名
  • state:指定用户的状态,可以是present(存在)、absent(不存在)、locked(锁定)等
  • uid:指定用户的用户ID
  • password:指定用户的密码,可以是明文密码,也可以是加密后的密码
  • group:指定用户所属的主组
  • groups:指定用户所属的附加组
  • shell:指定用户的默认shell
  • home:指定用户的家目录路径
  • createhome:如果设置为yes,则在创建用户时创建家目录
  • remove:如果设置为yes,则在删除用户时同时删除家目录
  • move_home:如果设置为yes,则在修改用户家目录路径时同时移动家目录
  • non_unique:如果设置为yes,则允许非唯一的用户ID

lvm

lvm模块用于管理逻辑卷管理器(LVM)

  • vg:指定要管理的卷组的名称
  • pvs:指定要创建物理卷的设备
  • lvs:指定要创建逻辑卷的卷组和逻辑卷的配置
  • state:指定卷组、物理卷或逻辑卷的状态,可以是present(存在)、absent(不存在)等
  • resizefs:如果设置为yes,则在调整逻辑卷大小后同时调整文件系统大小
  • force:如果设置为yes,则在删除逻辑卷或卷组时强制执行
  • zero:如果设置为yes,则在删除物理卷时将其填充为零
  • pvresize:如果设置为yes,则在创建或删除物理卷后调整物理卷的大小
  • fstype:指定逻辑卷上的文件系统类型

mount

Ansible的mount模块主要用于管理被控端设备的挂载,包括挂载和卸载操作。该模块的基本功能是配置文件系统的挂载点,以及与之相关的参数设置。

mount模块主要用于管理被控端设备的挂载,包括挂载和卸载操作。该模块的基本功能是配置文件系统的挂载点,以及与之相关的参数设置。

  1. state:指定挂载点的状态,可以是present(表示挂载点存在)或mounted(表示挂载点已挂载)。这是执行挂载操作时必须指定的参数之一。
  2. src:指定要挂载的设备或文件系统的路径。这个参数是必需的,用于明确挂载源的位置。
  3. path:指定设备挂载至本地的路径,即挂载点。这个参数也是必需的,用于定义挂载的目标位置。
  4. fstype:指定挂载的文件系统类型,如ext4nfs等。当statepresentmounted时,此参数是必需的。
  5. opts:挂载选项,用于指定挂载时的具体参数,如权限、同步模式等。这些选项可以根据需要进行自定义。
  6. dest:虽然在一些文档中提到,但实际上在官方文档和示例中并未明确提及此参数。它可能是一个误导信息,或者是在特定上下文中使用的非标准参数。
  7. usernamepassword:在某些情况下,如果挂载源是基于网络的共享(如NFS),可能需要提供用户名和密码来访问共享资源。这些参数用于指定访问共享时的身份验证信息。
  8. sync:指定将文件系统挂载为同步模式,确保数据立即写入磁盘,适用于需要高数据一致性的场景。

yum

yum模块用于管理CentOS或Red Hat系统上的软件包

  • name:指定要安装、卸载或更新的软件包的名称
  • state:指定软件包的状态,可以是present(存在)、absent(不存在)、latest(最新)等
  • update_cache:如果设置为yes,则在安装软件包之前会更新软件包缓存
  • disablerepo:指定要禁用的软件源
  • enablerepo:指定要启用的软件源
  • disable_gpg_check:如果设置为yes,则会禁用软件包的GPG检查
  • installroot:指定软件包的安装根目录
  • exclude:指定要排除的软件包
  • skip_broken:如果设置为yes,则会跳过损坏的软件包
  • disable_excludes:如果设置为yes,则会禁用软件包的排除规则

示例

- name: install httptd
  yum: name=httpd state=present
  
- name: start httpd
  service: name=httpd state=started

pip

pip模块用于管理Python包

  • name:指定要安装、卸载或更新的Python包的名称
  • state:指定Python包的状态,可以是present(存在)、absent(不存在)、latest(最新)等
  • executable:指定要使用的pip可执行文件的路径
  • extra_args:指定要传递给pip的额外参数
  • requirements:指定一个要安装的包的要求文件路径
  • virtualenv:指定一个虚拟环境的路径,安装包将被限制在该环境中
  • editable:如果设置为yes,则使用可编辑模式安装包
  • chdir:指定要切换到的目录,然后执行pip命令
  • umask:指定安装包时的umask值
  • proxy:指定代理服务器的URL

git

git模块用于管理Git仓库

  • repo:指定要克隆或更新的Git仓库的URL
  • dest:指定要克隆或更新的目标目录的路径
  • version:指定要检出的Git分支、标签或提交的版本号
  • accept_hostkey:如果设置为yes,则接受远程主机的SSH密钥
  • force:如果设置为yes,则强制执行克隆或更新操作
  • key_file:指定用于身份验证的SSH私钥文件的路径
  • recursive:如果设置为yes,则递归地克隆或更新Git子模块
  • clone:如果设置为yes,则会执行克隆操作;如果设置为no,则只会执行更新操作
  • depth:指定克隆仓库时的深度,即最近的提交数量
  • bare:如果设置为yes,则克隆一个裸仓库

cron

cron模块用于管理定时任务(cron jobs)

  • name:指定要管理的定时任务的名称
  • user:指定定时任务所属的用户
  • job:指定定时任务的命令
  • state:指定定时任务的状态,可以是present(存在)、absent(不存在)等
  • minute:指定定时任务执行的分钟数
  • hour:指定定时任务执行的小时数
  • day:指定定时任务执行的日期
  • month:指定定时任务执行的月份
  • weekday:指定定时任务执行的星期几
  • reboot:如果设置为yes,则定时任务将在系统重启后执行
  • special_time:指定特殊的定时任务执行时间,如@reboot(系统重启后)、@daily(每天)、@weekly(每周)等
  • job_file:指定定时任务的文件路径
  • backup:如果设置为yes,则在修改定时任务时备份原始文件
  • state_file:指定保存定时任务状态的文件路径

template

template模块用于根据模板文件生成配置文件

  • src:指定模板文件的路径
  • dest:指定生成的配置文件的路径
  • owner:指定生成的配置文件的所有者
  • group:指定生成的配置文件的所属组
  • mode:指定生成的配置文件的权限模式
  • backup:如果设置为yes,则在生成配置文件之前备份原始文件
  • validate:指定一个自定义的命令或脚本来验证生成的配置文件
  • force:如果设置为yes,则强制生成配置文件,即使目标文件已经存在
  • become:如果设置为yes,则以超级用户身份生成配置文件
  • vars:指定要传递给模板文件的变量
  • unsafe_writes:如果设置为yes,则使用不安全的写入方式生成配置文件

raw

raw是一种执行原始命令的模块。它允许在目标主机上执行未经过Ansible模块化处理的命令,以实现更灵活的操作。

raw模块的使用方法是通过在playbook中定义一个任务,并使用raw关键字指定要执行的命令。以下是一个使用raw模块的示例:

- name: Run raw command
  hosts: myhosts
  tasks:
    - name: Execute raw command
      raw: echo "Hello, world!"

raw模块的一些常见参数选项如下:

  • free_form:要执行的原始命令。可以是一个字符串,也可以是一个命令列表。
  • executable:指定要用于执行命令的可执行文件。默认值为/bin/sh。
  • chdir:指定要在其中执行命令的目录。
  • stdin:将标准输入传递给命令的内容。

需要注意的是,raw模块执行的命令在目标主机上执行时,不会像其他Ansible模块那样受到Ansible的幂等性控制。这意味着执行相同的raw命令可能会导致不同的结果,具体取决于目标主机的状态和环境。

由于raw模块是直接执行命令,因此在使用时需要谨慎,确保命令的安全性和正确性。

docker_*

docker_*模块用于管理Docker容器和镜像

  1. docker_container模块

    • name:指定要操作的容器的名称
    • image:指定要使用的镜像
    • state:指定容器的状态,可以是started(启动)、stopped(停止)、restarted(重启)、absent(删除)等
    • restart_policy:指定容器的重启策略
    • ports:指定容器的端口映射
    • volumes:指定容器的卷挂载
    • env:指定容器的环境变量
    • command:指定容器的启动命令
  2. docker_image模块

    • name:指定要操作的镜像的名称
    • source:指定要使用的镜像源
    • state:指定镜像的状态,可以是present(存在)、absent(不存在)等
    • pull:如果设置为yes,则会拉取最新的镜像
    • force:如果设置为yes,则会强制拉取镜像,即使已经存在
  3. docker_login模块

    • registry_url:指定要登录的Docker注册表的URL
    • username:指定登录的用户名
    • password:指定登录的密码
    • email:指定登录的电子邮件地址