概念介绍

幂等性

以结果为导向,如果目标主机已经做过操作了,Ansible 不会再做一遍

有些模块有幂等性的参数,例如 commandcreates removes

命令

# 使用 -s 查看模块的基本功能
ansible -s ping 

# 检查语法
ansible-playbook --syntax-check /testdir/ansible/test.yml

模块

文件类

fetch

从受控主机上拿文件到 ansible 主机

使用示例

ansible ecs -m fetch -a "src=/etc/fstab dest=."
file
copy

示例

ansible test70 -m copy -a "src=/testdir/copytest dest=/opt/"

# 拷贝文本内容到远程主机
ansible ecs -m copy -a "content="aaa\nbbb\n" dest=/root/ip_list"

# force 表示,如果远程主机已经有同名的文件,则不进行覆盖
ansible ecs -m copy -a "content="aaa\nbbb\nccc" dest=/root/ip_list force=no"

# 如果有同名文件,则先备份文件,再拷贝
ansible test70 -m copy -a "src=/testdir/copytest dest=/opt/ backup=yes"
Blockinfile

可以在文本文件中添加一段文字

示例

ansible ecs -m blockinfile -a 'path=/root/ip_list block="houmingming@mMacBook-Pro mark"'

# #{mark} 表示BEGIN 和 END
ansible ecs -m blockinfile -a 'path=/root/ip_list block="houmingming@mMacBook-Pro mark" marker="#{mark} service is start"'

也可以将文件插入到最上边或结尾,或者是用正则表达式匹配后插入到指定位置

也可以判断文件是否存在,如果不存在的话创建文件

lineinfile

类似 sed 命令

用于在源文件中插入、删除、替换行,也支持正则表达式匹配和替换

示例

# 添加一行内容
ansible -i inventory demo -m lineinfile -a 'path=/root/.ssh/authorized_keys line="ssh-rsa AAy2CHBhV tiops-login-key"'

# 删除某一行内容
ansible -i inventory demo -m lineinfile -a "dest=/root/.ssh/authorized_keys regexp='(.*)houmingming@MacBook-Pro.local' state=absent"

# 替换内容
ansible -i inventory demo --limit 10.1.1.1 -m replace -a "path=/etc/sysconfig/tcconfig regexp='BW=500mbps' replace='BW=100mbps'"

可以结合 insertbeforeinsertafter 插入到指定行的前面或后面

示例如下

- name: test inlinefile
  hosts: localhost
  gather_facts: false
  tasks:
    - lineinfile:
        path: "a.txt"
        line: "LINE2"
        insertbefore: '^para.*2'
        
# insertbefore 和 insertafter 指定正则表达式时,如果匹配到了多行,默认选中最后一个匹配行
# 如果要指定选中第一次匹配的行,则指定参数 `firstmatch=yes`


# 替换内容示例
- name: test inlinefile
  hosts: localhost
  gather_facts: false
  tasks:
    - lineinfile:
        path: "a.txt"
        line: "demo1"
        regexp: '^para.*2'
    - lineinfile:
        path: "a.txt"
        line: "hello line"
        regexp: '^hello'
        insertbefore: '^para.* 1'

# 用 `regexp` 替换时,可以实现幂等性
find

就像 find 模块一样

replace

可以用正则表达式替换文本中的字符串

命令类

command

不识别 shell 的管道符、重定向等

ansible -i inventory demo -m command -a 'systemctl start keepalived'

shell
script

可以在远程主机上执行 Ansible 主机上的脚本,注意,脚本是不用复制到远程主机上的

debug

系统类

hostname
- name: set hostname
  hosts: drbd
  gather_facts: false
  vars:
    hostnames:
      - host: 172.19.10.110
        name: new1
      - host: 172.19.10.111
        name: new2
  tasks:
    - name: set hostname
      hostname:
        name: "{{item.name}}"
      when: item.host == inventory_hostname
      loop: "{{hostnames}}"
cron
service

可以管理远程主机的服务

user
group
authorized_key

分发 key 的模块,经常使用,使用示例如下

- name: config ssh connection
  hosts: ecs
  gather_facts: false
  tasks:
    - authorized_key:
        key: "{{lookup('file', '~/.ssh/id_rsa.pub')}}"
        state: present
        user: root
        
# root 表示放到目标主机 root 用户下
# present 表示如果对方文件中已有完全相同的公钥信息时,不写入,否则进行写入

lookup() 或 query()

lookup() 是 ansible 的一个插件,可用于外部读取数据,这里的外部定义比较广泛

lookup 后面跟括号和参数,具体参数使用如下

  1. file:从磁盘读取文件
    即使 hosts 写了远端的服务器,也只能读取本地文件
- name: debug fileglob
  hosts: ecs
  gather_facts: false
  tasks:
    - name: task2
      debug:
        msg: "file connect: {{lookup('file','/etc/hosts')}}"
  1. fileglob:通过通配符匹配本地端的文件名,不可以同配目录,不会递归通配,如果要查询目标主机的文件,可使用 find 模块
- name: debug fileglob
  hosts: ecs
  gather_facts: false
  tasks:
    - name: task1
      debug:
        msg: "filenames: {{lookup('fileglob','/etc/*.conf')}}"
  1. redis:从 redis 中读取
  2. pipe:可以在本地端执行命令,并从结果中读取数据
  3. 从 ansible 变量中读取
  4. 从 ansible 列表中读取
  5. 从 ansible 字典中读取

具体从哪些 “外部” 读取,可以参考这个链接 https://docs.ansible.com/ansible/latest/plugins/lookup.html#plugin-list

query()

query 是 ansible 2.5 添加的新功能,写法和 lookup 类似,运行时会自动调用 lookup 插件,并且总是以列表方式返回,不需要加上 wantlist=True 参数

包管理模块

yum_repository
yum

可以安装包、卸载包或升级

功能

tags

如果有一段很长的 playbook,但某次运行时,只希望执行部分功能,可以用 tags 解决