我有一些任务:
---
- 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
行。