Ansible 常用模块学习

1. 远端执行模块:command vs shell

  • 相同点:

    • 功能相似,都是在远端运行shell命令
    • 如果要在 Windows 环境运行,需要使用对应 win_commandwin_shell 模块
  • 不同点:

    • shell 将命令打包,通过 /bin/sh 的远程模式运行
    • command 解析命令参数,然后在远端执行,因此无法使用 管道("|") 定向符 (">" "<") 以及 ";" 和 "&"
  • 用例:使用 commandshell 执行同一语句 cat /home/root/testfile

#!/usr/local/bin/ansible-playbook
---
- hosts: all
  tasks:
    - name: 1.1 command
      command: cat /home/root/testfile
      register: cmd_out
      
    - name: 1.2 see command output
      debug: var=cmd_out

    - name: 2.1 shell
      shell: cat /home/root/testfile
      register: shell_out

    - name: 2.2 see shell output
      debug: var=shell_out

观察输出:

# command 输出
{
    'stderr_lines': [], 
    u'changed': True, 
    u'end': u'2018-12-24 00:06:51.393299', 
    'failed': False, 
    u'stdout': u'feng baobao is like immortal', 
    # ========== ↓ Attention ↓ ==========
    u'cmd': [u'cat', u'/home/root/testfile'], 
    # ========== ↑ Attention ↑ ==========
    u'rc': 0, 
    u'start': 
    u'2018-12-24 00:06:51.283211', u'stderr': 
    u'', 
    u'delta': 
    u'0:00:00.110088', 'stdout_lines': [u'feng baobao is like immortal']
}
# shell 输出
{
    'stderr_lines': [], 
    u'changed': True, 
    u'end': u'2018-12-24 00:06:58.119163', 
    'failed': False, 
    u'stdout': u'feng baobao is like immortal', 
    # ========== ↓ Attention ↓ ==========
    u'cmd': u'cat /home/root/testfile', 
    # ========== ↑ Attention ↑ ==========
    u'rc': 0, 
    u'start': u'2018-12-24 00:06:58.007352', 
    u'stderr': u'', 
    u'delta': u'0:00:00.111811', 'stdout_lines': [u'feng baobao is like immortal']}"

几无区别,除了 cmd 项中,command输出是一个list,每个元素为命令的split;而shell输出是将命令作为一个string传递给远端shell

  • 思考: 由此看来,shell 理当比 command 模块更强大,那么 command 模块单独存在的意义是什么?
  • 还有“同类”: script & raw
    • script: 将本地脚本传递到远端,然后在远端机器执行该脚本
    • raw:
      • 类似 command 但是可以使用管道(网上的说法,但貌似不全面)
      • 官方解释,该模块可以运行 "low-down and dirty SSH command",并不需要依赖python和ansible模块功能
      • 限制: 建议只在少数情况下使用,如对远端进行安装python操作
    • 此二者不需要远端安装 python

References:

2. 文件操作模块

模块 功能
file 文件/文件夹/链接 进行 创建/删除/修改权限 操作
copy 将 本地或远端文件 拷贝到 远端路径
template copy 升级版,可以对按 jinja2 规则的模板文件进行构建,并拷贝到远端目录中
assemble 将一个路径中的所有文件按照字符串顺序聚合起来

file 模块示例:

    tasks:
      - name: 创建
        file:
          path: /home/root/testfile
          state: touch # 创建文件需要用 touch, 创建文件夹用 directory, 删除用 absent
      
      - name: 链接
        file:
          src: /home/root/filetolink
          dest: /home/root/testlink
          state: link
    
      - name: 修改权限属性等
        file: 
          path: /home/root/testfile
          owner: foo
          group: foo
          mode: 0644

copy 模块示例:

    tasks:
      - name: 将本地 /srv/myfiles/foo.conf 拷贝到远端 /etc/foo.conf
        copy:
          src: /srv/myfiles/foo.conf
          dest: /etc/foo.conf
          owner: foo
          group: foo
          mode: 0644
      
      - name: 将远端 /srv/myfiles/foo.conf 拷贝到远端 /etc/foo.conf
        copy:
          src: /srv/myfiles/foo.conf
          dest: /etc/foo.conf
          owner: foo
          group: foo
          remote_src: yes
          mode: 0644

References:

文件拉取 fetch vs slurp

copytemplate 将本地文件传送到远端不同, fetch 命令从远端将文件拉取到本地。

slurp 模块用于拉取远端文件的 base64 码。
fetch 示例:

# Store file into /tmp/fetched/host.example.com/tmp/somefile
- fetch:
    src: /tmp/somefile
    dest: /tmp/fetched
    
# Specifying a destination path
- fetch:
    src: /tmp/uniquefile
    dest: /tmp/special/
    flat: yes # 不覆盖已有文件

References:

4. How to EXIT playbook: fail & meta: end_play

fail 模块
可用于标记任务失败,仅影响当前 inventory_hostname, 其他节点仍可继续进行后续步骤。

meta 模块
该模块可执行一些特殊命令,这些命令能影响playbook的内部执行或执行状态:

  • flush_handler:刷新 handler
  • refresh_inventory:某些动态加载 host 需要在此刷新
  • noop:无用
  • clear_facts:清除当前 inventory 收集的facts
  • clear_host_errors:清除 inventory 的 fail 状态
  • end_play:结束整个 playbook
  • reset_connection:重新设置链接 (从官方用例来看,可以更改远程登录的用户)

尴尬的是,目前没发现能够仅影响1台主机令其结束任务,其他主机依旧进行任务的方式。或许可以尝试 meta 模块的 refresh_inventory

5. 配置文件相关 ini_file vs with_ini

ini_file 模块

用于管理远端配置文件。可以 增、删、改 远端配置文件的配置项。

远端配置文件需满足一定格式,如

[section1]
option1=value1
option2=value2

[section2]
option1=value2
option2=value1

section 不可重复;同一 section 下的 option 亦不可重复。

模块使用方式:

- name: 修改远端 /etc/conf 文件,使其 [drinks] 下的 fav 值为 lemonade (如果不存在option或section,则加上这个配置项),且权限模式为 0600,并备份原始文件
  ini_file:
    path: /etc/conf
    section: drinks
    option: fav
    value: lemonade
    mode: 0600
    backup: yes

- name: 删除远端 /etc/anotherconf 文件中 [drinks] 下的 temperature 配置项
  ini_file:
    path: /etc/anotherconf
    section: drinks
    option: temperature
    state: absent

with_ini

其实是 lookup 的子模块,用于读取本地的文件。 with_ini 可以读取本地配置文件。示例如下:

- debug: msg="User in integration is {{ lookup('ini', 'user section=integration file=users.ini') }}"

- debug: msg="User in production  is {{ lookup('ini', 'user section=production  file=users.ini') }}"

- debug: msg="user.name is {{ lookup('ini', 'user.name type=properties file=user.properties') }}"

- debug:
    msg: "{{ item }}"
  with_ini:
    - value[1-2]
    - section: section1
    - file: "lookup.ini"
    - re: true

目前没发现读取远端配置文件的模块。解决方法都是 fetch 目标配置文件到本地来解析。

References:

AnsibleDoc-Lookup-ini

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容