【问题标题】:Why does ansible parse contents of blockinfile? [closed]为什么ansible会解析blockinfile的内容? [关闭]
【发布时间】:2021-03-25 05:53:08
【问题描述】:

...最后结果证明我所有的调试尝试都得到了问题并且我的文件不同步。正如下面所说,最初的问题是缺少引号,然后我一直在搞乱并删除了 block: 和管道字符之间的空格。我会留下这个,因为如果其他人对 blockinfile 有一些问题,它可能会有所帮助......

我正在尝试使用 ansible 来设置一些覆盆子。一切正常,直到我尝试添加静态 IP。任务是(主机和任务

- name: Sett opp boom / shake
  hosts: boomshake
  tasks:
  
  (... a number of tasks that works fine ...

- name: Set up static ip
  become: yes
  blockinfile:
    path: /etc/dhcpcd.conf
    marker: "# ANSIBLE MANAGED - static ip {mark}"
    block:|
        interface=eth0
        static ip_address=xxx.yyy.zzz.{{lastoct}}/26
        static routers=xxx.yyy.zzz.1
        static domain_name_servers=xxx.yyy.zzz.106,8.8.8.8
  tags: network

Lastoct 是为 hosts 文件中的每个树莓派设置的变量。

当我运行它时,我得到:

Syntax Error while loading YAML.
  found unexpected end of stream
  (...)
The offending line appears to be:
        static domain_name_servers=10.10.1.106,10.10.1.110,8.8.8.8
                                  ^ here
There appears to be both 'k=v' shorthand syntax and YAML in this task. Only one syntax may be used.

所以 ansible 正在解析它应该逐字插入文件中的块的内容。我怎样才能阻止这种情况发生?

在我的调试尝试中,我删除了 =s,但后来我得到了

Syntax Error while loading YAML.
  found unexpected end of stream (...)
The offending line appears to be:
  tags: network
  ^ here

所以这是 yaml 中块的语法我不正确的东西。

在centos7上使用ansible 2.9.17

【问题讨论】:

  • block:| => block: |(在上面的语法高亮代码中可以清楚地看到空格缺失)。同时,如果您报告 yaml 解析错误而没有提供生成它的整个 yaml 文件,这里的每个人都可能会错过实际问题。制作这个MCVE

标签: ansible yaml


【解决方案1】:

你在 {mark} 之后缺少 " 。试试下面的 .yml 它肯定可以工作。

  [rohtash@172 blockinfile]$ cat new1.yml 
    - hosts: localhost
      connection: local
      gather_facts: no
      tasks:
      - name: Set up static ip
        become: yes
        blockinfile:
          path: dhcpcd.conf
          marker: "# ANSIBLE MANAGED - static ip {mark}"
          block: |
              interface=eth0
              static ip_address=xxx.yyy.zzz.{{lastoct}}/26
              static routers=xxx.yyy.zzz.1
              static domain_name_servers=xxx.yyy.zzz.106,8.8.8.8
        tags: network
      
      
    [rohtash@172 blockinfile]$ ansible-playbook new1.yml -e 'lastoct=10'
    
    PLAY [localhost] ******************************************************************************************************************************************************************************
    
    TASK [Set up static ip] ***********************************************************************************************************************************************************************
    changed: [localhost]
    
    PLAY RECAP ************************************************************************************************************************************************************************************
    localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

【讨论】:

  • 发现不错,但很遗憾还是没用
  • static domain_name_servers=10.10.1.106,10.10.1.110,8.8.8.8 为什么你的错误显示这个并且你的块包含静态 domain_name_servers=xxx.yyy.zzz.106,8.8.8.8 标签:网络跨度>
  • 因为我在复制脚本时匿名了 IP,但在粘贴错误消息时忘记了它。
  • 你能告诉我你的 blockinfile 任务和我的 new1.yml blockinfile 任务之间的确切区别吗?因为,我也给你发送了它的 ansible-playbook 运行命令输出,它给出的输出改变意味着没有错误。如果任务的参数和内容,一切都相同,并且在我的 ansible 设置上它工作正常,而在你的设置上它给出错误,这是不可能的。
【解决方案2】:

还有更多的问题。可能最重要的一个是 marker 字符串的引号没有关闭。接下来,缺少关键字 hosts: 并且缺少关键字 task:。如果你修复它,例如

- name: Set up static ip
  hosts: localhost
  become: true
  vars:
    lastoct: 101
  tasks:
    - blockinfile:
        path: test-dhcpcd.conf
        marker: "# ANSIBLE MANAGED - static ip {mark}"
        block: |
          interface=eth0
          static ip_address=xxx.yyy.zzz.{{ lastoct }}/26
          static routers=xxx.yyy.zzz.1
          static domain_name_servers=xxx.yyy.zzz.106,8.8.8.8
      tags: network

给予

shell> cat test-dhcpcd.conf 
# ANSIBLE MANAGED - static ip BEGIN
interface=eth0
static ip_address=xxx.yyy.zzz.101/26
static routers=xxx.yyy.zzz.1
static domain_name_servers=xxx.yyy.zzz.106,8.8.8.8
# ANSIBLE MANAGED - static ip END

【讨论】:

  • 很好发现,但很遗憾说它没有帮助(主机和任务关键字在文件中更靠前,如果我删除了有问题的一些任务正在工作)而且我仍然得到右引号也出现同样的错误
  • 很抱歉听到这个消息。没有minimal reproducible example,我无能为力。尝试隔离问题。
猜你喜欢
  • 2021-11-27
  • 2016-03-28
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 2021-10-02
  • 2015-09-17
  • 1970-01-01
相关资源
最近更新 更多