当前位置: 首页 > news >正文

Ansible常用模块介绍

在 Linux 中,我们可以通过 ansible-doc -l 命令查看到当前 ansible 都支持哪些模块;

通过 ansible-doc -s <模块名> 又可以查看该模块有哪些参数可以使用。 

官网文档:​​https://docs.ansible.com/ansible/latest/collections/index_module.html​​

Ansible常用模块

  1. ping模块
  2. raw模块
  3. yum模块
  4. apt模块
  5. pip模块
  6. synchronize模块
  7. template模块
  8. copy模块
  9. fetch模块
  10. user 模块与group模块
  11. service 模块
  12. get_url 模块
  13. file模块
  14. ​​unarchive模块​​
  15. cron模块
  16. pause模块
  17. wait_for模块
  18. command、shell、script 模块
  19. fail模块
  20. debug模块
  21. stat模块
  22. get_url模块
  23. mount模块
  24. sysctl 模块
  25. systemd 模块
  26. lineinfile模块
  27. blockinfile模块
  28. first_found 模块

1、ping模块

检查指定节点机器是否还能连通,用法很简单,不涉及参数,主机如果在线,则回复pong 

ansible 10.1.1.113 -m ping

[root@localhost ~]# ansible erp -m ping
192.168.10.6 | SUCCESS => {"changed": false, "ping": "pong"
}
192.168.10.7 | SUCCESS => {"changed": false, "ping": "pong"
}

2、raw模块

执行原始的命令,而不是通过模块子系统。在任何情况下,使用shell或命令模块是合适的。给定原始的参数直接通过配置的远程shell运行。可返回标准输出、错误输出和返回代码。此模块没有变更处理程序支持。 

这个模块不需要远程系统上的Python,就像脚本模块一样。此模块也支持Windows目标。

- name: Bootstrap a legacy python 2.4 hostraw: yum -y install python-simplejson- name: Bootstrap a host without python2 installedraw: dnf install -y python2 python2-dnf libselinux-python- name: Run a command that uses non-posix shell-isms (in this example /bin/sh doesn't handle redirection and wildcards together but bash does)raw: cat < /tmp/*txtargs:executable: /bin/bash- name: safely use templated variables. Always use quote filter to avoid injection issues.raw: "{{package_mgr|quote}} {{pkg_flags|quote}} install {{python_simplejson|quote}}"

3、yum模块

这个模块是RedHat / CentOS作为远端节点的OS的时候,用的最多的。Yum是啥就不多说了,RedHat / CentOS包管理工具 

使用`yum’软件包管理器管理软件包,其选项有: 

– config_file:yum的配置文件 (optional) 

– disable_gpg_check:关闭gpg_check (optional) 

– disablerepo:不启用某个源 (optional) 

– enablerepo:启用某个源(optional) 

– name:要进行操作的软件包的名字,默认最新的程序包,指明要安装的程序包,可以带上版本号,也可以传递一个url或者一个本地的rpm包的路径 

– state:状态(present,absent,latest),表示是安装还卸载 

   present:默认的,表示为安装 

   latest: 安装为最新的版本 

   absent:表示删除 

- name: Install the latest version of Apacheyum:name: httpdstate: latest- name: Install Apache >= 2.4yum:name: httpd>=2.4state: present- name: Install a list of packages (suitable replacement for 2.11 loop deprecation warning)yum:name:- nginx- postgresql- postgresql-serverstate: present- name: Install a list of packages with a list variableyum:name: "{{ packages }}"vars:packages:- httpd- httpd-tools- name: Remove the Apache packageyum:name: httpdstate: absent- name: Install the latest version of Apache from the testing repoyum:name: httpdenablerepo: testingstate: present- name: Install one specific version of Apacheyum:name: httpd-2.2.29-1.4.amzn1state: present- name: Upgrade all packagesyum:name: '*'state: latest- name: Upgrade all packages, excluding kernel & foo related packagesyum:name: '*'state: latestexclude: kernel*,foo*- name: Install the nginx rpm from a remote repoyum:name: http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpmstate: present- name: Install nginx rpm from a local fileyum:name: /usr/local/src/nginx-release-centos-6-0.el6.ngx.noarch.rpmstate: present- name: Install the 'Development tools' package groupyum:name: "@Development tools"state: present- name: Install the 'Gnome desktop' environment groupyum:name: "@^gnome-desktop-environment"state: present- name: List ansible packages and register result to print with debug lateryum:list: ansibleregister: result- name: Install package with multiple repos enabledyum:name: sosenablerepo: "epel,ol7_latest"- name: Install package with multiple repos disabledyum:name: sosdisablerepo: "epel,ol7_latest"- name: Download the nginx package but do not install ityum:name:- nginxstate: latestdownload_only: true

4、apt模块

这个模块是ubuntu作为远端节点的OS的时候,用的最多的。Apt是啥就不多说了,Ubuntu/Debian的包管理工具。 

– deb: 用于安装远程机器上的.deb后缀的软件包(optional) 

– install_recommends:这个参数可以控制远程电脑上是否只是下载软件包,还是下载后安装,默认参数为true,设置为false的时候只下载软件包,不安装 

– update_cache: 当这个参数为yes的时候等于apt-get update(optional) 

– name: apt要下载的软件包名字,支持name=git=1.6 这种制定版本的模式 

– clean:运行等效的 apt-get clean 以清除检索到的包文件的本地存储库。它从 /var/cache/apt/archives/ 和 /var/cache/apt/archives/partial/ 中删除除锁定文件之外的所有内容。默认为 false ,可选 true

– autoclean: 清除本地存储库中无法再下载的已检索包文件。默认为 false ,可选 true

– state:状态(present,absent,latest),表示是安装还卸载 

   present:默认的,表示为安装 

   lastest: 安装为最新的版本 

   absent:表示删除

# 在安装foo软件包前更新然后安装foo
- apt: name=foo update_cache=yes
# 移除foo软件包
- apt: name=foo state=absent
# 安装foo软件包
- apt: name=foo state=present
# 安装foo 1.0软件包
- apt: name=foo=1.00 state=present
# 安装nginx最新的名字为squeeze-backport发布包,并且安装前执行更新
- apt: name=nginx state=latest default_release=squeeze-backports update_cache=yes
# 只下载openjdk-6-jdk最新的软件包,不安装
- apt: name=openjdk-6-jdk state=latest install_recommends=no
# 安装所有软件包到最新版本
- apt: upgrade=dist
# 更新apt-get的list
- apt: update_cache=yes
# 3600秒后停止update_cache
- apt: update_cache=yes cache_valid_time=3600# 安装远程节点上的/tmp/mypackage.deb软件包
- apt: deb=/tmp/mypackage.deb

5、pip模块

用于管理Python库依赖项,为了使用pip模块,必须提供参数name或者requirements 

– chdir: 执行pip命令前cd进入的目录 

– name:要安装的Python库的名称或远程包的URL。 

– requirements:一个pip requirements.txt文件的路径,它应该是远程系统的本地文件,如果使用chdir选项,则可以将文件指定为相对路径。 

– version:指定的Python库的安装版本。 

– extra_args:额外的参数传递给pip。 

– executable:显式可执行文件或可执行文件的路径名,用于为系统中安装的特定版本的Python运行pip。 例如pip-3.3,如果系统中安装了Python 2.7和3.3,并且想要为Python 3.3安装运行pip。 它不能与“virtualenv”参数一起指定(在2.1中添加)。 默认情况下,它将采用适用于python解释器的版本。 pip3在python 3上,pip2或pip在python 2上。 

– virtualenv:要安装到的virtualenv目录的可选路径。 它不能与’executable’参数一起指定(在2.1中添加)。 如果virtualenv不存在,则将在安装软件包之前创建它。 可选的virtualenv_site_packages,virtualenv_command和virtualenv_python选项会影响virtualenv的创建。 

– virtualenv_command:用于创建虚拟环境的命令或路径名。 例如pyvenv,virtualenv,virtualenv2,~/bin /virtualenv,/usr/local/bin/virtualenv。 

– virtualenv_python:用于创建虚拟环境的Python可执行文件。 例如python3.5,python2.7。 未指定时,将使用用于运行ansible模块的Python版本。 当virtualenv_command使用pyvenv或-m venv模块时,不应使用此参数。 

– state:状态(present,absent,latest, forcereinstall),表示是安装还卸载 

   present:默认的,表示为安装 

   lastest: 安装为最新的版本 

   absent:表示删除 

   forcereinstall:“forcereinstall”选项仅适用于可ansible 2.1及更高版本。

# 安装bottle python包。
- pip:name: bottle# 在0.11版安装bottle python包。
- pip:name: bottleversion: 0.11# 使用远程协议(bzr +,hg +,git +,svn +)安装MyApp。 您不必在extra_args中提供'-e'选项。
- pip:name: svn+http://myrepo/svn/MyApp#egg=MyApp# 使用远程协议(bzr +,hg +,git +)安装MyApp。
- pip:name: git+http://myrepo/app/MyApp# 从本地压缩包安装MyApp
- pip:name: file:///path/to/MyApp.tar.gz# 将bottle安装到指定的virtualenv中,继承全局安装的模块
- pip:name: bottlevirtualenv: /my_app/venvvirtualenv_site_packages: yes# 使用Python 2.7将bottle安装到指定的virtualenv中
- pip:name: bottlevirtualenv: /my_app/venvvirtualenv_command: virtualenv-2.7# 在用户主目录中安装bottle。
- pip:name: bottleextra_args: --user# 安装指定的python requirements
- pip:requirements: /my_app/requirements.txt# 在指定的virtualenv中安装指定的python requirements。
- pip:requirements: /my_app/requirements.txtvirtualenv: /my_app/venv# 安装指定的python requirements和自定义pip源URL
- pip:requirements: /my_app/requirements.txtextra_args: -i https://example.com/pypi/simple# 专门为Python 3.3安装bottle,使用'pip-3.3'可执行文件。
- pip:name: bottleexecutable: pip-3.3# 安装 bottle,如果已安装,强制重新安装
- pip:name: bottlestate: forcereinstall

6、synchronize模块 

使用rsync同步文件,将主控方目录推送到指定节点的目录下,其参数如下:

– src: 要同步到目的地的源主机上的路径; 路径可以是绝对的或相对的。如果路径使用”/”来结尾,则只复制目录里的内容,如果没有使用”/”来结尾,则包含目录在内的整个内容全部复制 

– dest:目的地主机上将与源同步的路径; 路径可以是绝对的或相对的。

– archive:是否采用归档模式同步,即以源文件相同属性同步到目标地址,默认开启

– dest_port :目标接受的端口,ansible配置文件中的 ansible_ssh_port 变量优先级高于该 dest_port 变量

– checksum:是否效验

– compress:开启压缩,默认为开启

– copy_links:同步的时候是否复制连接

– delete:删除源中没有而目标存在的文件(即以推送方为主),默认no

– dirs:以非递归的方式传输目录

– existing_only:Skip creating new files on receiver.

– group:Preserve group

– links:Copy symlinks as symlinks.

– mode:rsync 同步的方式 PUSH\PULL,默认push,一般用于从本机向远程主机上传文件,pull 模式用于从远程主机上取文件。 

– recursive :是否递归 yes/no

– rsync_opts:通过传递数组来指定其他rsync选项。

– rsync_path:服务的路径,指定 rsync 命令来在远程服务器上运行。这个参考rsync命令的--rsync-path参数,--rsync-path=PATH # 指定远程服务器上的rsync命令所在路径信息

– rsync_timeout:指定 rsync 操作的 IP 超时时间,和rsync命令的 --timeout 参数效果一样,单位为秒

– set_remote_user:put user@ for the remote paths. If you have a custom ssh config to define the remote user for

– --exclude=.Git  忽略同步.git结尾的文件

# 将控制机器上的src同步到远程主机上
- hosts: nginxremote_user: roottasks:- name: push nginx file synchronize:src: /data/nginx-config/dest: /etc/nginx/archive: nomode: pushdelete: yesrecursive: yesrsync_timeout: 300 rsync_opts:- "--exclude=.git"tags:- push_files- name: nginx service reloadshell: /opt/openresty/nginx/sbin/nginx -s reloadtags:- nginx_reload

7、template模块

基于模板方式生成一个文件复制到远程主机(template使用Jinjia2格式作为文件模版,进行文档内变量的替换的模块。它的每次使用都会被ansible标记为”changed”状态。) 

– backup: 如果原目标文件存在,则先备份目标文件 。默认值:no

– src:在ansible控制器上的Jinja2格式化模板的路径。 这可以是相对或绝对的路径。 

– dest:将模板渲染到远程机器上的位置。 

force:是否强制覆盖,默认为yes 

– owner:目标文件属主 

– group:目标文件属组 

– mode:目标文件的权限模式,模式可以被指定为符号模式(例如,u + rwx或u = rw,g = r,o = r)。

# Example from Ansible Playbooks
- template:src: /mytemplates/foo.j2dest: /etc/file.confowner: bingroup: wheelmode: 0644# 同样的例子,但使用等效于0644的符号模式
- template:src: /mytemplates/foo.j2dest: /etc/file.confowner: bingroup: wheelmode: "u=rw,g=r,o=r"

8、copy模块

在远程主机执行复制操作文件。 

– src:要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用”/”来结尾,则只复制目录里的内容,如果没有使用”/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。 

– content:用于替代”src”,可以直接设定指定文件的值 

– dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录 

– remote_src:<布尔值,Choices: yes | no >,影响 src 是否需要转移或已经远程存在。如果no,它将src在ansible 本地控制服务器上搜索,如果yes它将src在托管(远程)节点上搜索。

– directory_mode:递归的设定目录的权限,默认为系统默认权限 

– force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes 

– others:所有的file模块里的选项都可以在这里使用

# Example from Ansible Playbooks
- copy:src: /srv/myfiles/foo.confdest: /etc/foo.confowner: foogroup: foomode: 0644# 与上述同样的例子,但是使用等价于0644的符号模式
- copy:src: /srv/myfiles/foo.confdest: /etc/foo.confowner: foogroup: foomode: u=rw,g=r,o=r# 另一个符号模式示例,添加一些权限并删除其他
- copy:src: /srv/myfiles/foo.confdest: /etc/foo.confowner: foogroup: foomode: u+rw,g-wx,o-rwx# 修改文件名
- copy:src: /srv/myfiles/foo.confdest: /srv/myfiles/foo.conf-bakremote_src: yes

9、fetch模块

它用于从远程机器获取文件,并将其本地存储在由主机名组织的文件树中。 

– src:远程系统上要获取的文件。 这必须是一个文件,而不是一个目录。 后续版本可能会支持递归提取。 

– dest:保存文件的目录。 例如,如果dest目录是/backup,在主机host.example.com上命名为/ etc/profile的src文件将被保存到/backup/host.example.com/etc/profile。 

– flat:只下载目标文件到本地路径中。在使用参数为flat的时候,如果dest的后缀名为/,那么就会保存在目录中,然后直接保存为文件名;当dest后缀不为/的时候,那么就会直接保存为dest路径结尾的文件名。

# 将文件存储到/tmp/fetched/host.example.com/tmp/somefile中
- fetch:src: /tmp/somefiledest: /tmp/fetched# 直接指定路径
- fetch:src: /tmp/somefiledest: /tmp/prefix-{{ inventory_hostname }}flat: yes# 指定目标路径
- fetch:src: /tmp/uniquefiledest: /tmp/special/flat: yes

10、group与user 模块

user模块是请求的是useradd, userdel, usermod三个指令,goup模块请求的是groupadd, groupdel, groupmod 三个指令。

group模块

– gid:指定用的gid。 

– name:指定用户名。 

– state:是创建还是删除。(present,absent) 

– system:如果是,则表示创建的组是系统组。

# Example group command from Ansible Playbooks
- group:name: somegroupstate: present
user模块

– home:指定用户的家目录,需要与createhome配合使用。 

– groups:指定用户的属组。 

– uid:指定用的uid。 

– password:指定用户的密码。 

注意:指定password参数时,不能使用明文密码,因为后面这一串密码会被直接传送到被管理主机的/etc/shadow文件中,所以需要先将密码字符串进行加密处理。然后将得到的字符串放到password中即可。 

echo “123456” | openssl passwd -1 -salt (</dev/urandomtr−dc‘[:alnum:]′|head−c32)−stdin(</dev/urandomtr−dc‘[:alnum:]′|head−c32)−stdin14P4PlFuE4P4PlFuEur9ObJiT5iHNrb9QnjaIB0 

– name:指定用户名。 

– createhome:是否创建家目录 yes|no。 

– system:是否为系统用户。 

– remove:当state=absent时,remove=yes则表示连同家目录一起删除,等价于userdel -r。 

– state:是创建还是删除。(present,absent) 

– shell:指定用户的shell环境。 

– generate_ssh_key:是否为相关用户生成SSH密钥。 这不会覆盖现有的SSH密钥。 

– ssh_key_bits:可选择指定要创建的SSH密钥中的位数。 

– ssh_key_passphrase:设置SSH密钥的密码。 如果没有提供密码,SSH密钥将默认没有密码。 

– ssh_key_file:指定SSH密钥文件名(可选)。 如果这是一个相对的文件名,那么它将是相对于用户的主目录。 

– ssh_key_type:指定要生成的SSH密钥的类型(可选)。 可用的SSH密钥类型将取决于目标主机上的实现。

# 使用bash shell添加用户“james”,将组“管理员”和“开发人员”附加到用户组
- user:name: jamesshell: /bin/bashgroups: admins,developersappend: yes# 删除用户'johns'
- user:name: johndstate: absentremove: yes# 在~/.ssh/id_rsa中为用户jsmith创建一个2048位的SSH密钥
- user:name: jsmithgenerate_ssh_key: yesssh_key_bits: 2048ssh_key_file: .ssh/id_rsa

11、service 模块

用于管理服务,记得针对Centos7就不要使用这个模块了。 

– arguments:给命令行提供一些选项 

– enabled:是否开机启动 yes|no, 要求状态(state)和启用(enabled)中至少有一个。 

– name:必选项,服务名称 

– runlevel:运行级别 

– sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟 

– state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)

# 启动服务httpd,如果不运行
- service:    name: httpdstate: started# 停止服务httpd,如果运行
- service:    name: httpdstate: stopped# 启用服务httpd的示例操作,而不使用运行状态
- service:    name: httpdenabled: yes

12、get_url 模块

该模块主要用于从http、ftp、https服务器上下载文件(类似于wget),主要有如下选项: 

– sha256sum:下载完成后进行sha256 check; 

– timeout:下载超时时间,默认10s 

– url:下载的URL 

– url_password、url_username:主要用于需要用户名密码进行验证的情况 

– dest:将文件下载到哪里的绝对路径。如果dest是目录,则使用服务器提供的文件名,或者如果没有提供,将使用远程服务器上的URL的基本名称。 

– headers:以格式“key:value,key:value”为请求添加自定义HTTP标头。

- name: Download foo.confget_url:url: http://example.com/path/file.confdest: /etc/foo.confmode: 0440- name: Download file with custom HTTP headersget_url:url: http://example.com/path/file.confdest: /etc/foo.confheaders: 'key:value,key:value'- name: Download file with check (sha256)get_url:url: http://example.com/path/file.confdest: /etc/foo.confchecksum: sha256:b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c

13、file模块

file模块主要用于远程主机上的文件操作,file模块包含如下选项: 

– force:需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no 

– group:定义文件/目录的属组 

– mode:定义文件/目录的权限 

– owner:定义文件/目录的属主 

– path:必选项,定义文件/目录的路径 

– recurse:递归的设置文件的属性,只对目录有效 

– src:要被链接的源文件的路径,只应用于state=link的情况 

– dest:被链接到的路径,只应用于state=link的情况 

– state: 

   directory:如果目录不存在,创建目录 

   file:即使文件不存在,也不会被创建 

   link:创建软链接 

   hard:创建硬链接 

   touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间 

   absent:删除目录、文件或者取消链接文件

# 更改文件所有权,组和模式。 当使用八进制数指定模式时,第一个数字应始终为0。
- file:path: /etc/foo.confowner: foogroup: foomode: 0644# touch创建文件,使用符号模式设置权限(相当于0644)
- file:path: /etc/foo.confstate: touchmode: "u=rw,g=r,o=r"# touch创建文件,添加/删除一些权限
- file:path: /etc/foo.confstate: touchmode: "u+rw,g-wx,o-rwx"# 创建一个目录,如果它不存在
- file:path: /etc/some_directorystate: directorymode: 0755

14、unarchive模块

用于解压文件,模块包含如下选项: 

– copy:在解压文件之前,是否先将文件从本地 'master' 复制到远程主机,默认为yes。若为no,则要求目标主机上压缩包必须存在。此选项与remote_src互斥。 

– creates(path):如果指定的绝对路径(文件或目录)已经存在,则将不会运行此步骤。 

– dest:远程主机上的一个路径,即文件解压的绝对路径。 

– keep_newer( yes | no): 不要替换比存档中的文件更新的现有文件。

– group:解压后的目录或文件的属组 

– owner:解压后文件或目录的属主

– remote_src:设置为yes指示已归档文件已在远程系统上,而不是在Ansible控制器本地。此选项与copy互斥。

– list_files:如果为yes,则会列出压缩包里的文件,默认为no,2.0版本新增的选项 

– mode:解压后文件的权限 

– src (path / required):

  • 如果​​remote_src=no​​(默认),则为要复制到目标服务器的存档文件的本地路径;可以是绝对的或相对的。
  • 如果为remote_src=yes,则目标服务器上要解压缩的现有存档文件的路径。
  • 如果​​remote_src=yes​​​和​​src​​​包含​​://​​,则远程计算机将首先从URL下载文件。(版本2.0)。仅在简单情况下,要完全下载支持,请使用get_url模块。

- name: 将foo.tgz解压缩到/var/lib/foo中unarchive:src: foo.tgzdest: /var/lib/foo- name: 解压远程计算机上已存在的文件unarchive:src: /tmp/foo.zipdest: /usr/local/binremote_src: yes- name: 解压文档需要下载的文件(2.0中添加)unarchive:src: https://example.com/example.zipdest: /usr/local/binremote_src: yes

15、cron 模块

Ansible cron模块主要用于添加、删除、更新操作系统的crontab任务计划 

cron模块使用详解:

  • name:任务计划名称
  • cron_file:替换客户端该用户的任务计划的文件
  • minute:分(0-59, * ,*/2)
  • hour:时(0-23, * ,*/2)
  • day:日(1-31, * ,*/2)
  • month:月(1-12, * , */2)
  • weekday:周(0-6或1-7, *)
  • job:任何计划执行的命令,state要等于present
  • backup:是否备份之前的任务计划
  • user:新建任务计划的用户
  • state:指定任务计划present、absent

(1)基于cron模块,创建crontab任务计划,例如:让所有的后端服务器在每天的00:00点从172.25.70.250主机上用ntpdate同步实践,任务名称为:Ntpdate server for sync time,一定要注意这个定时服务,一定要在172.25.70.250配置好ntp服务器 

ansible all -m cron -a "minute=0 hour=0 day=* month=* weekday=* name='Ntpdate server for sync time' job='ntpdate 172.25.70.250'"

(2)backup=yes,表示开启备份,备份文件会存放在客户端/tmp/目录下面 

ansible 172.25.70.1 -m cron -a "minute=0 hour=0 day=* month=* weekday=* name='Ntpdate server for sync time' backup=yes job='ntpdate www.lcl.com'"

(3)删除crontab任务计划 

ansible all -m cron -a "name='Ntpdate server for sync time' state=absent"

16、pause 模块

在playbook执行的过程中暂停一定时间或者提示用户进行某些操作

常用参数:

  • minutes:暂停多少分钟
  • seconds:暂停多少秒
  • prompt:打印一串信息提示用户操作

示例:

- name: wait on user inputpause: prompt="Warning! Detected slight issue. ENTER to continue CTRL-C a to quit" - name: timed waitpause: seconds=30

17、wait_for 模块

在playbook的执行过程中,等待某些操作完成以后再进行后续操作

常用参数:

  • connect_timeout:在下一个任务执行之前等待连接的超时时间
  • delay:等待一个端口或者文件或者连接到指定的状态时,默认超时时间为300秒,在这等待的300s的时间里,wait_for模块会一直轮询指定的对象是否到达指定的状态,delay即为多长时间轮询一次状态。
  • host:wait_for模块等待的主机的地址,默认为127.0.0.1
  • port:wait_for模块待待的主机的端口
  • path:路径,只有当这个文件存在时,下一任务才开始执行,即等待该文件创建完成
  • state:等待的状态,即等待的文件或端口或者连接状态达到指定的状态时,下一个任务开始执行。当等的对象为端口时,状态有started,stoped,即端口已经监听或者端口已经关闭;当等待的对象为文件时,状态有present或者started,absent,即文件已创建或者删除;当等待的对象为一个连接时,状态有drained,即连接已建立。默认为started
  • timeout:wait_for的等待的超时时间,默认为300秒

示例:

- wait_for: port=8080 state=started     #等待8080端口已正常监听,才开始下一个任务,直到超时
- wait_for: port=8000 delay=10    #等待8000端口正常监听,每隔10s检查一次,直至等待超时
- wait_for: host=0.0.0.0 port=8000 delay=10 state=drained    #等待8000端口直至有连接建立
- wait_for: host=0.0.0.0 port=8000 state=drained exclude_hosts=10.2.1.2,10.2.1.3    #等待8000端口有连接建立,如果连接来自10.2.1.2或者10.2.1.3,则忽略。
- wait_for: path=/tmp/foo    #等待/tmp/foo文件已创建
- wait_for: path=/tmp/foo search_regex=completed    #等待/tmp/foo文件已创建,而且该文件中需要包含completed字符串
- wait_for: path=/var/lock/file.lock state=absent    #等待/var/lock/file.lock被删除
- wait_for: path=/proc/3466/status state=absent        #等待指定的进程被销毁
- local_action: wait_for port=22 host="{{ ansible_ssh_host | default(inventory_hostname) }}" search_regex=OpenSSH delay=10    #等待openssh启动,10s检查一次

18、command 模块和shell

用于在各被管理节点运行指定的命令 

shell和command的区别:shell模块可以特殊字符,而command是不支持

1、command模块

在远程主机上执行命令,模块包含如下选项:

– creates:一个文件名,当该文件存在,则该命令不执行

– free_form:要执行的linux指令

– chdir:在执行指令之前,先切换到该目录

– removes:一个文件名,当该文件不存在,则该选项不执行

– executable:更改用于执行命令的shell(bash,sh),该执行路径必须是一个绝对路径

- name: return motd to registered varcommand: cat /etc/motdregister: mymotd- name: Run the command if the specified file does not exist.command: /usr/bin/make_database.sh arg1 arg2 creates=/path/to/database# 您还可以使用“args”表单提供选项。
- name: This command will change the working directory to somedir/ and will only run when /path/to/database doesn't exist.command: /usr/bin/make_database.sh arg1 arg2args:chdir: somedir/creates: /path/to/database
2、shell模块

切换到某个shell执行指定的指令,参数与command相同:

- name: Execute the command in remote shell; stdout goes to the specified file on the remote.shell: somescript.sh >> somelog.txt- name: Run a command that uses non-posix shell-isms (in this example /bin/sh doesn't handle redirection and wildcards together but bash does)shell: cat < /tmp/*txtargs:executable: /bin/bash

19、script模块

  • 作用:在远程主机运行本地的脚本;
  • 调用格式:
-m script -a "/PATH/TO/SCRIPT_FILE";
  • 参数:
    ​​​creates​​​:如果其后跟的文件存在,则不执行脚本;
    ​​​removes​​:如果其后跟的文件存在,则执行脚本;

  • 示例:在 ​​Ansible​​ 主机上编写脚本,然后推送至被控端运行;
[root@xuzhichao ~]# cat file1.sh
#!/bin/bash
cat /etc/passwd | awk -F: '{print $1,$2}'[root@ops ~]# ansible 192.168.20.22 -m script -a 'removes=/etc/passwd /root/file1.sh'
192.168.20.22 | CHANGED => {"changed": true, "rc": 0, "stderr": "Shared connection to 192.168.20.22 closed.\r\n", "stderr_lines": ["Shared connection to 192.168.20.22 closed."], "stdout": "root x\r\nbin x\r\ndaemon x\r\nadm x\r\nlp x\r\nsync x\r\nshutdown x\r\nhalt x\r\nmail x\r\noperator x\r\ngames x\r\nftp x\r\nnobody x\r\nsystemd-network x\r\ndbus x\r\npolkitd x\r\nsshd x\r\npostfix x\r\nchrony x\r\nxu x\r\nwang x\r\nwang1 x\r\nwang3 x\r\nwang4 x\r\nwang5 x\r\nzabbix x\r\nxu2 x\r\ntcpdump x\r\ndhcpd x\r\nrpc x\r\nrpcuser x\r\nnfsnobody x\r\nwww x\r\ntss x\r\nnginx x\r\nsaslauth x\r\nnscd x\r\nnslcd x\r\nxu1 x\r\nxu10 x\r\n", "stdout_lines": ["root x", "bin x", "daemon x", "adm x", "lp x", "sync x", "shutdown x", "halt x", "mail x", "operator x", "games x", "ftp x", "nobody x", "systemd-network x", "dbus x", ]
}

  • 示例:一个批量修改root密码的例子:
# cat alter.sh 
#---------------------------------------------------
#!/bin/bash
##modify passwd##
echo 'root:1234567890' |chpasswd
if [ $? -eq 0 ]
thenecho "Change password for root OK!!!"
elseecho "Change password for root failure!!!"
fi#####################################################
# cat modify_all_password.yml 
---
- hosts: alluser: rootgather_facts: Truetasks:- name: Modify root passwd in all clientscript: /etc/ansible/roles/alter.sh

然后执行:

ansible-playbook modify_all_password.yml

ansible-playbook可以跟很多参数,可以使用--help查看

20、fail 模块

用于终止当前playbook的执行,通常与条件语句组合使用,当满足条件时,终止当前play的运行。可以直接由failed_when取代。

选项只有一个:

  • msg:终止前打印出信息

示例:

- fail: msg="The system may not be provisioned according to the CMDB status."when: cmdb_status != "to-be-staged"

21、debug 模块

该模块 用于在调试中输出信息,对于调试变量或表达式非常有用,而不必停止播放本。与'when:'指令一起调试很有用。Windows目标也支持此模块。

  • msg:调试输出的消息
  • var:将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出
  • verbosity:debug的级别(默认是0级,全部显示)

示例:

---
- hosts: testgather_facts: F   #开启debugvars:war: "ps -ef | grep tomcat | grep -v grep | awk '{print $2}'"tasks:- name: stop tomcatshell: nohup /bin/bash /tmp/stop_tomcat.sh&ignore_errors: Trueregister: tomcat_out  #定义变量存储返回的结果- name: show 结果       #定义输出结果的taskdebug: var=tomcat_out verbosity=0    #这样写不光输出命令结果,还返回相关调试信息,只输出执行结果则使用 tomcat_out.stdout。- name: back warshell: cp /home/admin/taobao-tomcat-production-7.0.59.3/deploy/ROOT.war /tmp/- name: remove romate dirfile: path=/home/admin/taobao-tomcat-production-7.0.59.3/deploy/ROOT state=absent- name: remove romate warfile: path=/home/admin/taobao-tomcat-production-7.0.59.3/deploy/ROOT.war state=absent- name: copy warcopy: src=/home/admin/.jenkins/jobs/NET-hangfa/workspace/aecc_purchase_portal_web/xx.war  dest=/home/admin/taobao-tomcat-production-7.0.59.3/deploy/ROOT.war owner=admin group=wheel mode=0644- name: start tomcatshell: nohup sh /home/admin/taobao-tomcat-production-7.0.59.3/bin/startup.sh &- name: tomcataliveshell: "{{war}}"register: check- name: showdebug: var=check.stdout verbosity=0    #check.stdout 显示出的信息会看的更清晰点

22、stat模块

获取远程文件状态信息,包括atime,ctime,mtime,md5,uid,gid等信息

# ansible 10.0.90.25 -m stat -a "path=/etc/sysctl.conf"
10.0.90.25 | SUCCESS => {"changed": false, "stat": {"atime": 1459270210.5650001, "checksum": "a27c7ce2e6002c37f3cb537ad997c6da7fd76480", "ctime": 1441217442.5749998, "dev": 2051, "exists": true, "gid": 0, "gr_name": "root", "inode": 1181554, "isblk": false, "ischr": false, "isdir": false, "isfifo": false, "isgid": false, "islnk": false, "isreg": true, "issock": false, "isuid": false, "md5": "c97839af771c8447b9fc23090b4e8d0f", "mode": "0644", "mtime": 1413471211.0, "nlink": 1, "path": "/etc/sysctl.conf", "pw_name": "root", "rgrp": true, "roth": true, "rusr": true, "size": 1150, "uid": 0, "wgrp": false, "woth": false, "wusr": true, "xgrp": false, "xoth": false, "xusr": false}
}

##显示所有的ansible默认变量信息

ansible web -m setup

23、get_url模块

实现在远程主机下载指定URL到本地,支持sha256sum文件校验

例如:

#ansible host1 -m get_url -a "url=http://www.baidu.com dest=/tmp/index.html mode=0440 force=yes"
172.16.29.193 | success >> {"changed": true,"checksum": "8bc43056c39fbb882cf5d7b0391d70b6e84096c6","dest": "/tmp/index.html","gid": 0,"group": "root","md5sum": "324aa881293b385d2c0b355cf752cff9","mode": "0440","msg": "OK (unknown bytes)","owner": "root","secontext": "unconfined_u:object_r:user_tmp_t:s0","sha256sum": "","size": 93299,"src": "/tmp/tmp3WI5fE","state": "file","uid": 0,"url": "http://www.baidu.com"
}

24、mount 模块:远程主机分区挂载

#ansible host1 -m mount -a "name=/mnt/data src=/dev/sd0 fstype=ext3 opts=ro state=present"

25、sysctl 模块:远程linux主机sysctl配置模块

sysctl: name=kernel.panic value=3 sysctl_file=/etc/sysctl.conf checks=before reload=yes
以下是定义在yml格式文件中的例子:
- sysctl: name=net.ipv4.tcp_rmem 'value=4096        87380   16777216' state=present
- sysctl: name=net.ipv4.tcp_wmem 'value=4096        65536   16777216' state=present
- sysctl: name=net.ipv6.conf.lo.disable_ipv6 value=1 state=present

26、systemd 模块

​​Examples​​​​​​

- name: Make sure a service unit is runningansible.builtin.systemd:state: startedname: httpd- name: Stop service cron on debian, if runningansible.builtin.systemd:name: cronstate: stopped- name: Restart service cron on centos, in all cases, also issue daemon-reload to pick up config changesansible.builtin.systemd:state: restarteddaemon_reload: yesname: crond- name: Reload service httpd, in all casesansible.builtin.systemd:name: httpd.servicestate: reloaded- name: Enable service httpd and ensure it is not maskedansible.builtin.systemd:name: httpdenabled: yesmasked: no- name: Enable a timer unit for dnf-automaticansible.builtin.systemd:name: dnf-automatic.timerstate: startedenabled: yes- name: Just force systemd to reread configs (2.4 and above)ansible.builtin.systemd:daemon_reload: yes- name: Just force systemd to re-execute itself (2.8 and above)ansible.builtin.systemd:daemon_reexec: yes- name: Run a user service when XDG_RUNTIME_DIR is not set on remote loginansible.builtin.systemd:name: myservicestate: startedscope: userenvironment:XDG_RUNTIME_DIR: "/run/user/{{ myuid }}"

27、lineinfile模块

官方文档: ​​https://docs.ansible.com/ansible/latest/collections/ansible/builtin/lineinfile_module.html#ansible-collections-ansible-builtin-lineinfile-module​​

Ensure a particular line is in a file, or replace an existing line using a back-referenced regular expression 确保特定的行在文件中,或使用反向引用正则表达式替换现有的行

变量

注释

regexp 

string

added in 1.7 of ansible.builtin

要在文件的每一行中查找的文字字符串。这不必匹配整行。

对于​​state=present​​,如果在文件中找到字符串,则要替换的行。只有找到的最后一行将被替换。

对于​​state=absent​​,如果字符串在行中,则要删除的行。

如果文字表达式不匹配,则该行将添加到文件中以与​​insertbefore​​​或​​insertafter​​设置保持一致。

与​​backrefs​​​和互斥​​regexp​​。

insertafter 

string

与 一起使用​​state=present​​。

如果指定,将在指定正则表达式的最后一次匹配之后插入该行。

如果需要第一个匹配项,请使用(firstmatch=yes)。

有一个特殊值可用;​​EOF​​用于在文件末尾插入行。

如果指定的正则表达式没有匹配项,则将使用 EOF 代替。

如果​​insertbefore​​​设置,默认值​​EOF​​将被忽略。

如果正则表达式同时传递给​​regexp​​​and ​​insertafter​​​,​​insertafter​​​则只有在没有​​regexp​​找到匹配的情况下才会生效。

不能与​​backrefs​​​或一起使用​​insertbefore​​。

insertbefore 

string

added in 1.1 of ansible.builtin

与 一起使用​​state=present​​。

如果指定,将在指定正则表达式的最后一个匹配之前插入该行。

如果需要第一个匹配项,请使用​​firstmatch=yes​​.

一个值可用;​​BOF​​用于在文件开头插入行。

如果指定的正则表达式没有匹配项,将在文件末尾插入该行。

如果正则表达式同时传递给​​regexp​​​and ​​insertbefore​​​,​​insertbefore​​​则只有在没有​​regexp​​找到匹配的情况下才会生效。

不能与​​backrefs​​​或一起使用​​insertafter​​。

line 

string

要插入/替换到文件中的行。

需要​​state=present​​.

如果​​backrefs​​​设置,则可能包含反向引用,​​regexp​​如果正则表达式匹配,则将使用捕获组扩展这些反向引用。

别名:值

backrefs 

boolean

added in 1.1 of ansible.builtin

与 一起使用​​state=present​​。

如果设置,​​line​​​可以包含在​​regexp​​匹配时填充的反向引用(位置和命名)。

该参数稍微改变了模块的操作;​​insertbefore​​​and​​insertafter​​​将被忽略,如果 与​​regexp​​文件中的任何地方都不匹配,则该文件将保持不变。

如果​​regexp​​匹配,最后匹配的行将被扩展的行参数替换。

与 互斥​​search_string​​。

group 

string

应该拥有文件/目录的组的名称,将提供给chown

mode 

raw

结果文件或目录应具有的权限。

对于那些习惯于/usr/bin/chmod 的人,请记住模式实际上是八进制数。您必须添加一个前导零,以便 Ansible 的 YAML 解析器知道它是一个八进制数(如​​0644​​​或​​01777​​​)或引用它(如​​'644'​​​或​​'1777'​​),以便 Ansible 接收一个字符串并可以自行将字符串从字符串转换为数字。

在不遵循这些规则之一的情况下给 Ansible 一个数字将最终得到一个十进制数字,这将产生意想不到的结果。

从 Ansible 1.8 开始,可以将模式指定为符号模式(例如,​​u+rwx​​​或​​u=rw,g=r,o=r​​)。

如果​​mode​​未指定且目标文件存在,则​​umask​​在为新创建的文件设置模式时将使用系统默认值。

如果​​mode​​未指定并且目标文件确实存在,则将使用现有文件的模式。

指定​​mode​​是确保使用正确权限创建文件的最佳方法。有关更多详细信息,请参阅 CVE-2020-1736。

用法:

# NOTE: Before 2.3, option 'dest', 'destfile' or 'name' was used instead of 'path'
- name: Ensure SELinux is set to enforcing modeansible.builtin.lineinfile:path: /etc/selinux/configregexp: '^SELINUX='line: SELINUX=enforcing- name: Make sure group wheel is not in the sudoers configurationansible.builtin.lineinfile:path: /etc/sudoersstate: absentregexp: '^%wheel'- name: Replace a localhost entry with our ownansible.builtin.lineinfile:path: /etc/hostsregexp: '^127\.0\.0\.1'line: 127.0.0.1 localhostowner: rootgroup: rootmode: '0644'- name: Ensure the default Apache port is 8080ansible.builtin.lineinfile:path: /etc/httpd/conf/httpd.confregexp: '^Listen 'insertafter: '^#Listen 'line: Listen 8080- name: Ensure we have our own comment added to /etc/servicesansible.builtin.lineinfile:path: /etc/servicesregexp: '^# port for http'insertbefore: '^www.*80/tcp'line: '# port for http by default'- name: Add a line to a file if the file does not exist, without passing regexpansible.builtin.lineinfile:path: /tmp/testfileline: 192.168.1.99 foo.lab.net foocreate: yes# NOTE: Yaml requires escaping backslashes in double quotes but not in single quotes
- name: Ensure the JBoss memory settings are exactly as neededansible.builtin.lineinfile:path: /opt/jboss-as/bin/standalone.confregexp: '^(.*)Xms(\d+)m(.*)$'line: '\1Xms${xms}m\3'backrefs: yes# NOTE: Fully quoted because of the ': ' on the line. See the Gotchas in the YAML docs.
- name: Validate the sudoers file before savingansible.builtin.lineinfile:path: /etc/sudoersstate: presentregexp: '^%ADMIN ALL='line: '%ADMIN ALL=(ALL) NOPASSWD: ALL'validate: /usr/sbin/visudo -cf %s# See https://docs.python.org/3/library/re.html for further details on syntax
- name: Use backrefs with alternative group syntax to avoid conflicts with variable valuesansible.builtin.lineinfile:path: /tmp/configregexp: ^(host=).*line: \g<1>{{ hostname }}backrefs: yes

一个例子:

#cat linetest.yml 
---
- hosts: webuser: rootgather_facts: flasetasks:- name: change /etc/hostslineinfile: dest=/etc/hostsline='test line 1\ntest line 2\ntest line 3\ntest line 4'

上面的例子是在/etc/hosts中添加4行,如果你只需要添加一行,line='test line 1'即可!

例子:

- name: Check if couchbase.host is already definedlineinfile:state: absentpath: "/database.properties"regexp: "^couchbase.host="check_mode: truechanged_when: false # This just makes things look prettier in the logsregister: check- name: Define couchbase.host if undefinedlineinfile:state: presentpath: "/database.properties"line: "couchbase.host=127.0.0.1"when: check.found == 0

28、blockinfile模块  – 插入/更新/删除被 marker lines 包围的文本块

官方文档:​​https://docs.ansible.com/ansible/latest/collections/ansible/builtin/blockinfile_module.html#ansible-collections-ansible-builtin-blockinfile-module​​

注意:dest后面的路径和文件名一定要存在,否则会报错。

变量

Choices/Defaults

注释

create 

boolean

Choices:

  • no ←
  • yes

如果不存在新文件,则创建该文件。 

path 

路径 / 必须的

要修改的文件。

在 Ansible 2.3 之前,此选项仅可用作destdestfilename

别名:dest, destfile, name

group 

string

应拥有文件/目录的组的名称,如将喂给 chown。

insertafter 

string

Choices:

  • EOF ←
  • *regex*

如果指定并且没有找到开始/结束​​marker​​行,则块将插入到指定正则表达式的最后一个匹配之后。

有一个特殊值可用;​​EOF​​用于在文件末尾插入块。

如果指定的正则表达式没有匹配项,​​EOF​​将被使用。

insertbefore 

string

Choices:

  • BOF
  • *regex*

如果指定并且没有找到开始/结束​​marker​​行,则块将插入到指定正则表达式的最后一个匹配之前。

有一个特殊值可用;​​BOF​​用于在文件开头插入块。

如果指定的正则表达式没有匹配项,则块将插入到文件末尾。

marker 

string

Default:

"# {mark} ANSIBLE MANAGED BLOCK"

标记线模板。

​{mark}​​​将替换为​​marker_begin​​​(default="BEGIN") 和​​marker_end​​(default="END") 中的值。

使用没有​​{mark}​​变量的自定义标记可能会导致块在后续剧本运行中重复插入。

marker_begin 

string

added in 2.5 of ansible.builtin

Default:

"BEGIN"

这将被插入​​{mark}​​到打开 ansible 块标记中。

marker_end 

string

added in 2.5 of ansible.builtin

Default:

"END"

这将被插入​​{mark}​​到关闭 ansible 块标记中。

mode 

raw

结果文件或目录应具有的权限。

对于那些习惯于/usr/bin/chmod 的人,请记住模式实际上是八进制数。您必须添加一个前导零,以便 Ansible 的 YAML 解析器知道它是一个八进制数(如​​0644​​​或​​01777​​​)或引用它(如​​'644'​​​或​​'1777'​​),以便 Ansible 接收一个字符串并可以自行将字符串从字符串转换为数字。

在不遵循这些规则之一的情况下给 Ansible 一个数字将最终得到一个十进制数字,这将产生意想不到的结果。

从 Ansible 1.8 开始,可以将模式指定为符号模式(例如,​​u+rwx​​​或​​u=rw,g=r,o=r​​)。

如果​​mode​​未指定且目标文件存在,则​​umask​​在为新创建的文件设置模式时将使用系统默认值。

如果​​mode​​未指定并且目标文件确实存在,则将使用现有文件的模式。

指定​​mode​​是确保使用正确权限创建文件的最佳方法。有关更多详细信息,请参阅 CVE-2020-1736。

block 

string

Default:

""

要在标记行内插入的文本。

如果它丢失或为空字符串,则块将被删除,就像​​state​​​被指定为 一样​​absent​​。

别名:content

用法:

- name: 在 /etc/ssh/sshd_config 插入/更新 "Match User" 配置块blockinfile:dest: /etc/ssh/sshd_configblock: |Match User ansible-agentPasswordAuthentication no
- name: 在 /etc/network/interfaces 插入/更新 eth0 configuration stanza (it might be better to copy files into /etc/network/interfaces.d/)blockinfile:dest: /etc/network/interfacesblock: |iface eth0 inet staticaddress 192.168.0.1netmask 255.255.255.0
- name: insert/update HTML surrounded by custom markers after <body> lineblockinfile:dest: /var/www/html/index.htmlmarker: "<!-- {mark} ANSIBLE MANAGED BLOCK -->"insertafter: "<body>"content: |<h1>Welcome to `ansible_hostname`</h1><p>Last updated on `ansible_date_time`.`iso8601`</p>
- name: remove HTML as well as surrounding markers      ##此文件实现将上面添加的内容删除blockinfile:dest: /var/www/html/index.htmlmarker: "<!-- {mark} ANSIBLE MANAGED BLOCK -->"content: ""
- name: insert/update "Match User" configuation block in /etc/ssh/sshd_configblockinfile:dest: /etc/hostsblock: |`item`.`name` `item`.`ip`marker: "# {mark} ANSIBLE MANAGED BLOCK `item`.`name`"with_items:- { name: host1, ip: 10.10.1.10 }- { name: host2, ip: 10.10.1.11 }- { name: host3, ip: 10.10.1.12 }

第一个例子:在/etc/hosts文件中添加3行

#cat blockinfile.yml 
---
- hosts: webuser: roottasks:- name: this is test blockinfile moduleblockinfile:dest: /etc/hostsmarker: "# {mark} this is test"block: |this is a test line 1 this is a test line 2 this is a test line 3

结果:

#cat /etc/hosts
# BEGIN this is test
this is a test line 1
this is a test line 2
this is a test line 3
# END this is test

第二个例子:创建一个index.html文件,并写入html格式内容

#cat blockinfile.yml 
---
- hosts: webuser: roottasks:- name: create a test filefile: path=/root/index.html state=touch- name: this is test blockinfile moduleblockinfile:dest: /root/index.htmlmarker: "<!-- {mark} ansible managed block -->"insertafter: "<body>"content: |<h1>welcome to `ansible_hostname`</h1><p>Last updated on `ansible_date_time`.`iso8601`</p>

结果:

#cat index.html 
<!-- BEGIN ansible managed block -->
<h1>welcome to http</h1>
<p>Last updated on 2016-05-19T03:17:35Z</p>
<!-- END ansible managed block -->

注意:上面yml文件中ansible_hostname和ansible_date_time.iso8601变量是ansible默认的系统变量,这个变量可以通过-m setup查看到!

所以上面的ansible_date_time.iso8601可以改为iso8601_basic_short(人类可读)

结果就变成了如下:因为当前时间就是#Thu May 19 11:33:29 CST 2016

<p>Last updated on 20160519T113219</p>

第三个例子:index.html已经存在,并且内容如下:

#cat index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>

创建ansible的playbook文件如下:

#cat blockinfile.yml 
---
- hosts: 10.0.90.25user: rootgather_facts: Truetasks:- name: this is test blockinfile moduleblockinfile:dest: /root/index.htmlmarker: "<!-- {mark} ansible managed block -->"insertafter: "<body>"content: |<h1>welcome to `ansible_hostname`</h1><p>Last updated on `ansible_date_time`.`iso8601_basic_short`</p>

执行之后,再查看index.html

#cat index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>
</head>
<body>
<!-- BEGIN ansible managed block -->            ###从这里开始
<h1>welcome to http</h1>
<p>Last updated on 20160519T115013</p>
<!-- END ansible managed block -->              ###在这里结束
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>

第四个例子:使用变量

#cat blockinfile.yml
---
- hosts: 10.0.90.25user: rootgather_facts: Truetasks:- name: this is test blockinfile moduleblockinfile:dest: /etc/hostsblock: |`item`.`name` `item`.`ip`marker: "# {mark} ansible managed block `item`.`name`"with_items:- { name: host1, ip: 10.10.1.10}- { name: host2, ip: 10.10.1.11}- { name: host3, ip: 10.10.1.12}

执行后,结果如下:

#cat /etc/hosts
# BEGIN ansible managed block host1
host1 10.10.1.10
# END ansible managed block host1
# BEGIN ansible managed block host2
host2 10.10.1.11
# END ansible managed block host2
# BEGIN ansible managed block host3
host3 10.10.1.12
# END ansible managed block host3

29、first_found 模块  – 返回从列表中找到的第一个文件

官方文档:​​https://docs.ansible.com/ansible/latest/collections/ansible/builtin/first_found_lookup.html​​

概要
  • 此查找检查文件和路径列表并返回找到的第一个组合的完整路径。
  • 与所有查找一样,当提供相对路径时,它将首先尝试使用当前任务的位置,然后沿着链向上到达角色/扮演/包含等的包含位置。
  • 文件列表优先于搜索的路径。例如,角色中的任务在剧本的相对路径中有一个'file1',这将被使用,角色的相对路径中的'file2'不会。
  • 此插件需要文件列表或带有文件列表的密钥 files
     才能运行_terms。
参数

范围

选择/默认值

配置

评论

 _terms

string

文件名列表。

files 

list / elements=string

默认:

[]

文件名列表。

paths 

list / elements=string

默认:

[]

查找文件的路径列表。

skip 

boolean

  • 选择:
  • no ←
  • yes

When ​​True​​​,当没有文件匹配时返回一个空列表。这在与 一起使用时很有用​​with_first_found​​​,因为返回​​with_​​​调用的空列表会导致调用任务被跳过。​​lookup​​​当通过or用作模板时​​query​​,设置skip=True将*不会*导致任务跳过。任务必须处理从模板返回的空列表。当​​False​​​和​​lookup​​​或​​query​​指定 errors='ignore'时,所有错误(包括没有找到文件,但可能还有其他错误)分别返回一个空字符串或一个空列表。当​​True​​​and ​​lookup​​​or​​query​​指定errors='ignore'时,找不到文件将返回空列表,其他潜在错误根据模板调用返回空字符串或空列表(换句话说,返回​​lookup​​​v的值​​query​​)。

例子
- name: Set _found_file to the first existing file, raising an error if a file is not foundset_fact:_found_file: "{{ lookup('first_found', findme) }}"vars:findme:- /path/to/foo.txt- bar.txt  # will be looked in files/ dir relative to role and/or play- /path/to/biz.txt- name: Set _found_file to the first existing file, or an empty list if no files foundset_fact:_found_file: "{{ lookup('first_found', files, paths=['/extra/path'], skip=True) }}"vars:files:- /path/to/foo.txt- /path/to/bar.txt- name: Include tasks only if one of the files exist, otherwise skip the taskinclude_tasks:file: "{{ item }}"with_first_found:files:- path/tasks.yaml- path/other_tasks.yamlskip: True- name: Include tasks only if one of the files exists, otherwise skipinclude_tasks: '{{ tasks_file }}'when: tasks_file != ""vars:tasks_file: "{{ lookup('first_found', files=['tasks.yaml', 'other_tasks.yaml'], errors='ignore') }}"- name: |copy first existing file found to /some/file,looking in relative directories from where the task is defined andincluding any play objects that contain itcopy:src: "{{ lookup('first_found', findme) }}"dest: /some/filevars:findme:- foo- "{{ inventory_hostname }}"- bar- name: same copy but specific pathscopy:src: "{{ lookup('first_found', params) }}"dest: /some/filevars:params:files:- foo- "{{ inventory_hostname }}"- barpaths:- /tmp/production- /tmp/staging- name: INTERFACES | Create Ansible header for /etc/network/interfacestemplate:src: "{{ lookup('first_found', findme) }}"dest: "/etc/foo.conf"vars:findme:- "{{ ansible_virtualization_type }}_foo.conf"- "default_foo.conf"- name: read vars from first file found, use 'vars/' relative subdirinclude_vars: "{{ lookup('first_found', params) }}"vars:params:files:- '{{ ansible_distribution }}.yml'- '{{ ansible_os_family }}.yml'- default.ymlpaths:- 'vars'


http://www.mrgr.cn/news/70813.html

相关文章:

  • WorkFlow源码剖析——Communicator之TCPServer(下)
  • Vue 学习随笔系列十四 -- JavaScript巧妙用法
  • 【数据结构 | C++】字符串关键字的散列映射
  • 亮眼!创新发文!双重分解+遗传优化+深度学习!CEEMDAN-Kmeans-VMD-GA-Transformer多元时序预测
  • 只有在这种环境中,PMP含金量才是最高的,其他真不用考虑了
  • 【JavaEE初阶】多线程上部
  • MobaXterm 软件及如何设置取消自动断开连接
  • 高级java每日一道面试题-2024年11月04日-Redis篇-Redis如何做内存优化?
  • C++ | Leetcode C++题解之第560题和为K的子数组
  • Vue功能菜单的异步加载、动态渲染
  • windows C#-默认约定(下)
  • JavaWeb——Web入门(8/9)- Tomcat:基本使用(下载与安装、目录结构介绍、启动与关闭、可能出现的问题及解决方案、总结)
  • Pure Adminrelease(水滴框架配置)
  • python-27-Python ORM系列之彻底搞明白ORM概念,对ORM进行封装结合FastAPI实现数据库的增删改查,联表查询等接口
  • C++学习笔记----11、模块、头文件及各种主题(二)---- 函数模板(2)
  • VirtIO实现原理(2)
  • Python酷库之旅-第三方库Pandas(207)
  • 金山云C++面试题及参考答案
  • Python学习:scipy是什么?
  • 关于cloacked-pixel-master在kali上的安装
  • C++线程
  • Java期末复习暨学校第四次上机课作业
  • 【含文档】基于ssm+jsp的校园疫情管理系统(含源码+数据库+lw)
  • NLP论文速读(NeurIPS2024)|使用视觉增强的提示来增强视觉推理
  • SQLite Where 子句
  • 从2D到3D:MoGe——微软的单目3D几何重建模型