在Ansible任务中添加命令行数据



我有一些任务:

---
- name: Ansible multiple replace data in file {{ path_agentd_conf }}
replace:
path: "{{ item.path }}"
regexp: "{{ item.regexp }}"
replace: "{{ item.replace }}"
with_items:
- {path: "{{ path_agentd_conf }}", regexp: "Server=127.0.0.1", replace: "Server={{ ip_zabbix_server }}"}
- {path: "{{ path_agentd_conf }}", regexp: "ServerActive=127.0.0.1", replace: "ServerActive={{ ip_zabbix_server }}"}
- {path: "{{ path_agentd_conf }}", regexp: "Hostname=Zabbix server", replace: "Hostname={{ ansible_hostname }}"}
- {path: "{{ path_agentd_conf }}", regexp: "# HostMetadata=", replace: "HostMetadata=73dc46da7abd1908951478965ca5b5be"}

路径/etc/ansible/roles/zabbix/zabbix-agent/agent/roles/agent/defaults/main.yml

中也有变量
---
# defaults file for agent
dir_download: /home/
path_agentd_conf: /etc/zabbix/zabbix_agentd.conf
url_zabbix: https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.0-1+ubuntu20.04_all.deb
deb_zabbix: zabbix-release_6.0-1+ubuntu20.04_all.deb
ip_zabbix_server: 95.111.111.111

我的第一个目标是,使用命令行,当我开始剧本和改变行ip_zabbix_server:IP,例如ansible-playbook start.yaml -ip 55.55.55.55和这个IP应该取代IP95.111.111.111

其次,在73dc46da7abd1908951478965ca5b5be之后的- {path: "{{ path_agentd_conf }}", regexp: "# HostMetadata=", replace: "HostMetadata=73dc46da7abd1908951478965ca5b5be"}行命令行中添加一些世界lxd mysq

- {path: "{{ path_agentd_conf }}", regexp: "# HostMetadata=", replace: "HostMetadata=73dc46da7abd1908951478965ca5b5be lxd mysq"}

我不知道它是否可行?我知道,例如在bash中,当我们在bash脚本中使用变量$1 $2等时,这是可能的。

你能帮帮忙吗?谢谢你!

如果我没理解错的话,你是想修改这个" default ";

考虑到变量的顺序,你可能知道,命令行优先于已经定义在角色,角色,任务,默认值等中的内容。

所以,为了得到这个结果你需要像这样运行剧本:

ansible-playbook start.yaml -e "ip_zabbix_server=55.55.55.55"

基本上应该类似于bash,但要加上参数-e |——extra-vars

对于第二部分,我不确定,但我会尝试是否可以将其设置为变量,并以类似的方式执行。

我的第一个目标是,使用命令行,当我开始playbook和更改行ip_zabbix_server

这是覆盖默认角色变量的一个非常常见的场景。您可以查看在哪里为所有可能的解决方案放置变量。

但是在您的特定情况下,要从命令行重写,您可以使用extra-vars:

ansible-playbook start.yaml --extra-vars ip_zabbix_server=55.55.55.55

第二,是在- {path: "{{ path_agentd_conf }}", regexp: "# HostMetadata=", replace: "HostMetadata=73dc46da7abd1908951478965ca5b5be"}

行中从命令行添加

这个比较棘手,有两个原因:

  • 你已经硬编码了任务内的字典列表,这使得很难(不是说不可能)覆盖
  • 直接在命令行上传递一长串字典并不是真正的用户友好(但可能)。

我下面的建议不是唯一的解决方案,你可以根据你的确切需求进行调整(参见上面关于变量优先级的链接)。

首先在roles/agent/defaults/main.yml添加一个新的默认变量:

my_replace_list:
- {path: "{{ path_agentd_conf }}", regexp: "Server=127.0.0.1", replace: "Server={{ ip_zabbix_server }}"}
- {path: "{{ path_agentd_conf }}", regexp: "ServerActive=127.0.0.1", replace: "ServerActive={{ ip_zabbix_server }}"}
- {path: "{{ path_agentd_conf }}", regexp: "Hostname=Zabbix server", replace: "Hostname={{ ansible_hostname }}"}
- {path: "{{ path_agentd_conf }}", regexp: "# HostMetadata=", replace: "HostMetadata=73dc46da7abd1908951478965ca5b5be"}

然后修改你的任务,使用var:

- name: Ansible multiple replace data in file {{ path_agentd_conf }}
replace:
path: "{{ item.path }}"
regexp: "{{ item.regexp }}"
replace: "{{ item.replace }}"
with_items: "{{ my_replace_list }}"

我们就处于与上面的zabbix服务器ip完全相同的情况,并且可以在命令中使用额外的变量覆盖列表。这里最简单的方法是在单独的文件中声明var,例如my_list_override.yaml

my_replace_list:
- {path: "/toto", regexp: "from", replace: "to"}
- {path: "/titi", regexp: "a", replace: "b"}

你可以很容易地使用这个文件来覆盖你的变量:

ansible-playbook start.yaml --extra-vars @/path/to/my_list_override.yml
现在,如果你真的想在命令行上直接传递这个变量,这是可能的,但你必须以正确的json形式传递它,这可能不是最用户友好的方法:
ansible-playbook start.yaml 
--extra-vars '{"my_replace_list":[{"path":"/toto","regexp":"from","replace":"to"},{"path":"/titi","regexp":"a","replace":"b"}]}'

谢谢大家!

我刚刚从文件/etc/ansible/roles/zabbix/zabbix-agent/agent/roles/agent/defaults/main.yml中删除了ip_zabbix_server: 95.217.188.202行,然后在行中添加变量{{ ip }}

- {path: "{{ path_agentd_conf }}", regexp: "Server=127.0.0.1", replace: "Server={{ ip }}"}
- {path: "{{ path_agentd_conf }}", regexp: "ServerActive=127.0.0.1", replace: "ServerActive={{ ip }}"}

和之后,我使用命令ansible-playbook agent.yml --extra-vars ip=77.77.77.77将77.77.77.77添加到Server=127.0.0.1"ServerActive=127.0.0.1行。

相关内容

  • 没有找到相关文章

最新更新