date: 2021-01-22title: ansible模块使用 #标题
tags: ansible模块 #标签
categories: ansible # 分类
记录一些常用的模块用法,不太详细,只是在以后忘记语法时翻出来看看。
ansible常用指令
serial——滚动更新
默认情况下,Ansible将尝试并行管理playbook中所有的机器。对于滚动更新用例,可以使用serial关键字定义Ansible一次应管理多少主机:
- name: test playhosts: webserversserial: 2 # 也可以写百分比,但如果是三个机器,写 serial: "50%",则一次只能在一台机器上执行。gather_facts: Falsetasks:- name: task onecomand: hostname- name: task twocommand: hostname
在上面的例子中,如果我们在“WebServers”组中有4个主机,后面2个主机等到前面2个主机执行完后执行:
PLAY [webservers] ****************************************TASK [task one] ******************************************changed: [web2]changed: [web1]TASK [task two] ******************************************changed: [web1]changed: [web2]PLAY [webservers] ****************************************TASK [task one] ******************************************changed: [web3]changed: [web4]TASK [task two] ******************************************changed: [web3]changed: [web4]PLAY RECAP ***********************************************web1 : ok=2 changed=2 unreachable=0 failed=0web2 : ok=2 changed=2 unreachable=0 failed=0web3 : ok=2 changed=2 unreachable=0 failed=0web4 : ok=2 changed=2 unreachable=0 failed=0
—list-hosts
查看playbok中的执行主机列表,ansible命令也支持 —list-hosts 选项。
$ ansible-playbook -i hosts test.yml --list-hosts
查看每个成员所在的分组
一个IP可能在多个分组中。
$ ansible all -a "echo {{group_names|to_json}}" # to_json为解决unicode问题
查看分组列表
也就是一共多少分组。
$ ansible x.x.x.x -a "echo {{groups|list|to_json}}" # x.x.x.x是ansible包含的任意一个主机IP,也可以写 all
查看所有分组以及下面的主机
$ ansible-inventory --list
-C 测试执行效果
仅仅是测试,并不会真正的执行。
$ ansible-playbook -i hosts -C test.yml

ansible-doc 查询模块使用
$ ansible-doc -s script- name: Runs a local script on a remote node after transferring itscript:chdir: # Change into this directory on the remote node before running the script.cmd: # Path to the local script to run followed by optional arguments.creates: # A filename on the remote node, when it already exists, this step will *not* be run.decrypt: # This option controls the autodecryption of source files using vault.executable: # Name or path of a executable to invoke the script with.free_form: # Path to the local script file followed by optional arguments.removes: # A filename on the remote node, when it does not exist, this step will *not* be run.
优化ansible执行策略
ansible的任务执行,是并发操作,默认开启5个进程执行,可以执行-f 定义并发进程数。
ansible默认5个并发进程,如果控制主机比较多,例如20个主机,那么会并行执行5台主机,只有这5台主机全部执行完一次任务,再继续下一批的5台执行任务,如果其中一台执行完任务,那么它默认也会等待那四台主机完成,然后再5台并行执行任务,这样的话,就会影响执行效率。
如果目标主机的网络稳定性不好,开启的进程就会一直等待最后一个任务执行完成,才继续下一个任务。
在使用playbook文件中,可以指定 strategy: free,表示异步执行,尽快切换到下一台主机(只要有一台主机执行任务完成,不会等待其他主机完成后再去执行其他主机),默认为linear。
如下:
- hosts: test1become: yesbecome_user: rootbecome_method: sudogather_facts: nostrategy: free # 增加此行
接下来是模块相关的语法,可以参考下解释更详细些更全面些的博文:ansible常用模块
get_url
下载一个url,功能相当于wget。
- get_url:url: http://mirrors.aliyun.com/repo/epel-7.repo # 下载的urldest: /etc/yum.repos.d/ # 保存目录url_username: # 在需要验证时提供的用户名url_password: # 在需要进行验证时提供的密码mode: 0440 # 下载后的文件权限
service
控制服务的启停,等同于systemctl指令。
- name: Enable firewalldservice:name: firewalldstate: started # 服务的状态可选值:reloaded, restarted, started, stoppedenabled: yes # 是否开启自启,可选值:yes、no
user 和group模块
创建或删除用户、组,根据state来指定动作。
- name: create useruser:name: "{{ item}}"state: absent # present:添加用户;absent:删除用户remove: yes # 该选项只针对absent,表示是否删除用户相关的家目录。with_items: # 定义用户列表- testuser1- testuser2
如果是多个元素,比如创建用户时要指定用户所在组:
- name: create groupgroup: # group模块就在这里也展示了name: "{{ item }}"state: presentwith_items:- groupx1- groupx2- name: create useruser:name: "{{ item.name }}"group: "{{ item.group }}" # 指定用户所属组,该组必须存在state: presentwith_items: # 定义多个元素- {name: 'userx1',group: 'groupx1'}- {name: 'userx2',group: 'groupx2'}
交互式创建用户的playbook
[root@nginx ansible]# cat a.yml- name: testhosts: test1gather_facts: falsevars_prompt:- name: "user_name" # 准备接受用户名prompt: "Enter user name" # 提示语句private: no # 用户输入的信息可以显示在屏幕上- name: "user_password" # 准备接受用户密码prompt: "Enter user password" # 提示语句encrypt: "sha512_crypt" # encrypt关键字表示对用户输入的信息进行哈希, “sha512_crypt”表示使用sha512算法对用户输入的信息进行哈希confirm: yes # 提示第二次输入确认密码tasks:- name: create useruser:name: "{{user_name}}"password: "{{user_password}}"
copy 模块
copy模块用于拷贝目录或文件到受控端,若要将受控端的文件拷贝至ansible本机,则需使用 synchronize模块。
# src可以指定为ansible主机上的绝对路径,也可以直接指定文件名,但需提前将文件放置 roles/file 目录下copy:src: /usr/local/{{ item }}dest: /usr/local/with_items:- a.sh- b.sh
file模块
file模块创建目录
- name: Create directoryfile:path: "{{ item }}"state: directory # directory表示创建目录;link:创建软链接;absent:删除目录mode: 0777 # 目录权限with_items:- /usr/local/nginx- /usr/src/nginx
file模块创建软链接:
- name: “创建一个软链接”file:src: /usr/src/nginx # 源目录dest: /home/nginx # 链接目录state: linkmode: 0755
file模块也可以用来只设置权限,只需要指定path和mode两个选项即可。
unarchive解压模块
- name: "解压一个包文件"unarchive:src: /usr/local/src/nginx-1.2.4.tar.gz # 指定要解压的压缩包(可以写绝对路径,也可把包放在file目录下,直接写包名),也可以指定为一个urlcopy: no # 当指定的src为一个url时,copy选项必须为no,默认为yesdest: /usr/local/src # 解压后的路径(客户端的路径)owner: lv # 解压后的属主group: lv # 解压后的属组list_files: yes # 如果为yes,则会列出压缩包里的文件,默认为no,2.0版本新增的xmode: 0700 # 解压后的权限creates: /home # 幂等性相关设置,creates表示如果指定的目录存在,则不执行该模块
synchronize模块
此模块用于主机间互相拷贝文件或目录。
- name: 将客户端的/tmp/目录下的a.sh、b.sh拷贝至ansible主机的/data/目录下synchronize:src: /tmp/{{ item }}dest: /data/mode: pullwith_items:- a.sh- b.sh# 注意:指定的路径后面带 / 和不带 / 是有差别的# 带 / 表示此目录下的所有东西,不带 / 是指整个目录- name: 将ansible主机的/tmp目录下的所有文件和目录都拷贝至客户端的/data/目录下synchronize:src: /tmp/dest: /data/delete: yes # 默认情况下会保留 dest 端有,而 src 端没有的文件。可以通过 delete 参数设置为 yes 来删除 dest 端多余的文件。- name: 将ansible上的tmp目录拷贝至受控端上,并改名为 /dat 目录(主要是来比较 带 / 和不带 / 的区别)synchronize:src: /tmpdest: /datdelete: yes- name: 将ansible主机上的/tmp/目录下所有文件拷贝至客户端,并删除dest有,而src没有的文件>,通过rsync_opts 指定 /tmp/a/b 这个目录不拷贝到客户端synchronize:src: /tmp/dest: /data/delete: yesrsync_opts: --exclude=a/b# 当远程节点为ServerB的时候,将ServerA的文件夹传输到ServerB上:- hosts: ServerBtasks:- name: Transfer file from ServerA to ServerBsynchronize:src: /path/on/server_adest: /path/on/server_bdelegate_to: ServerA# 当远程节点为ServerA的时候,将ServerA的文件夹传输到ServerB上:- hosts: ServerAtasks:- name: Transfer file from ServerA to ServerBsynchronize:src: /path/on/server_adest: /path/on/server_bmode: pulldelegate_to: ServerB
yum模块
yum模块中的state可选值如下:
- present | installed:只是保证已经安装了所需的软件包,如果没有安装,则安装最新版本。
- latest:如果没有安装则安装最新版本,如果安装了,则更新到最新版本。
- absent | removed:删除指定的包。
默认state的值为absent。
yum模块中可以通过enablerepo(启用某个仓库),download_only(仅仅下载而不安装)、download_dir(如果设置了download_only,则可以通过此选项来指定下载目录。)
# 安装epel源- name: install epel repoyum:name: epel-releasestate: latest# 以组的形式安装- name: install "Development tools"yum:name: "@Development tools" # 以组的形式安装,相当于grouplinstallstate: present- name: upgrade all packagesyum:name: "*"state: latest# 老版本的一次指定多个软件包,需要使用循环列表,在2.11版本后,推荐使用列表来定义多个软件包- name: install packagesyum:name: "{{ item }}"state: latestwith_items:- nginx- httpd# 仅下载多个软件包,不安装- name: download_only softwareyum:name: ['nginx', 'httpd', 'redis'] # 通过列表的形式来指定多个软件包download_only: yesdownload_dir: /usr/local/src/
script模块
# 在受控机的/tmp/目录下执行ansible本机相应role目录下的file目录下的 a.sh 和 b.sh 两个脚本# 脚本路径也可以写ansible本机上的绝对路径- name: 指定目录下执行多个脚本script:cmd: '{{ item }}'args:chdir: /tmp/with_items: # 下面的两个脚本需放在相应role下的file目录中- a.sh- b.sh# 可以按照如下指定为ansible主机上的绝对路径# with_items:# - /root/ansible/c.sh# - /root/ansible/d.sh
