如何获得角色中当前主机的IP地址?
我知道您可以获取主机所属的组列表以及主机的主机名,但我无法找到获取IP地址的解决方案.
您可以使用{{inventory_hostname}}和使用组来获取主机名{{group_names}}
我尝试过像{{ hostvars[{{ inventory_hostname }}]['ansible_ssh_host'] }}
和ip="{{ hostvars.{{ inventory_hostname }}.ansible_ssh_host }}"
我的用例如下:
我有一个模板文件,我想从该模板创建2个不同的文件,变量由每个文件的不同变量集填充.
例如,假设我想模拟包含该行的文件:
mkdir -p {{myTemplateVariable}}
Run Code Online (Sandbox Code Playgroud)
我想找到一个正确的方法来让这个变量填充"File1"和"File2".就像是 :
- name: template test 1
template:
src=myTemplateFile
dest=result1
- name: template test 2
template:
src=myTemplateFile
dest=result2
Run Code Online (Sandbox Code Playgroud)
我可以为第一个模板指定要使用的变量是a ="File1",对于第二个模板,b ="File2".
有时我需要测试一些我在ansible角色中使用的jinja2模板.这样做最简单的方法是什么?
例如,我有一个模板(test.j2):
{% if users is defined and users %}
{% for user in users %}{{ user }}
{% endfor %}
{% endif %}
Run Code Online (Sandbox Code Playgroud)
和vars(在group_vars/all中):
---
users:
- Mike
- Smith
- Klara
- Alex
Run Code Online (Sandbox Code Playgroud) 我想以递归方式复制目录并将所有.j2文件作为模板呈现在那里.为此,我目前使用以下行:
- template: >
src=/src/conf.d/{{ item }}
dest=/dest/conf.d/{{ item|replace('.j2','') }}
with_lines: find /src/conf.d/ -type f -printf "%P\n"
Run Code Online (Sandbox Code Playgroud)
现在我正在寻找一种从该目录中删除非托管文件的方法.例如,如果我从/src/conf.d/我想要Ansible删除文件/模板也将其删除/dest/conf.d/.
有办法做到这一点吗?我试着摆弄rsync --delete,但在那里我遇到了模板的问题,它们的后缀.j2被删除了.
我从设置模块收到以下数据:
"ansible_nodename": "3d734bc2a391",
"ansible_os_family": "RedHat",
"ansible_pkg_mgr": "yum",
"ansible_processor": [
"AuthenticAMD",
"AMD PRO A10-8700B R6, 10 Compute Cores 4C+6G"
],
"ansible_processor_cores": 1,
"ansible_processor_count": 1,
"ansible_processor_threads_per_core": 1,
Run Code Online (Sandbox Code Playgroud)
我想检索第一个值ansible_processor并在Jinja2模板中使用它.
如果我使用{{ ansible_processor }}它,它给了我两个价值观:
"AuthenticAMD",
"AMD PRO A10-8700B R6, 10 Compute Cores 4C+6G"
Run Code Online (Sandbox Code Playgroud)
但我只想要第一个.
我有我的目录结构
??? digitalocean
??? README.md
??? play.yml
??? roles
??? bootstrap_server
? ??? tasks
? ??? main.yml
??? create_new_user
? ??? tasks
? ??? main.yml
??? update
? ??? tasks
? ??? main.yml
??? vimserver
??? files
? ??? vimrc_server
??? tasks
??? main.yml
Run Code Online (Sandbox Code Playgroud)
当我在角色下创建用户时create_new_user,我将用户名硬编码为
---
- name: Creating a user named username on the specified web server.
user:
name: username
state: present
shell: /bin/bash
groups: admin
generate_ssh_key: yes
ssh_key_bits: 2048
ssh_key_file: .ssh/id_rsa
- name: Copy .ssh/id_rsa from …Run Code Online (Sandbox Code Playgroud) 我正在生成配置文件,我希望它们是缩进的.我从一个简单的python程序调用时正确渲染的Jinja2模板开始.当我从ansible调用它时,除了循环的第一行之外,我将获得2个额外的空格.生成像YAML和python这样的东西真的很痛苦.我已经把注释行作为for块的第一行来解决这个问题......
这是一个非常简单的YAML生成器示例:
剧本电话:
- name: generate bgp vars file, put in includes directory
local_action: template src={{ role_dir }}/templates/bgp_vars.j2 dest={{ incvar_dir }}/bgp_vars.yaml
run_once: true
Run Code Online (Sandbox Code Playgroud)
模板部分:
dc_route_reflectors:
{% for dc in SH_dcs %}
# dc is "{{ dc }}"
{{ dc }}:
{% for host in groups[bgpgroupname] if dc == hostvars[host].MYDC %}
- "{{ hostvars[host].MAIN_MYADDR }}"
{% endfor %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
渲染输出:
dc_route_reflectors:
# dc is "pnp"
pnp:
- "10.100.16.3"
- "10.100.32.3"
# dc is "sgs"
sgs:
- "10.8.0.3"
- "10.8.16.3" …Run Code Online (Sandbox Code Playgroud) 有没有办法将Ansible模板呈现出来?我试图找到一个解决方案但它看起来像临时文件是唯一的方法.
我正在尝试使用jinja2通过ansible模板循环字典来创建大量数据源但是收到此错误 [{'msg': "AnsibleUndefinedVariable: One or more undefined variables: 'dict object' has no attribute 'value'", 'failed': True}]}
当运行调试任务时,它确实得到了正确的值,所以我觉得我的问题出在模板本身,但我一直无法弄清楚我做错了什么.
Ansible任务
- name: debug dictionary
debug: msg="{{ item.value.db_url }}"
with_dict: databases
- name: copy tomcat config files
template: src="{{ item.src }}" dest="{{ item.dest }}"
with_items:
- { src: 'context.xml.j2', dest: '/opt/tomcat/conf/context.xml'}
notify: restart tomcat
with_dict: databases
Run Code Online (Sandbox Code Playgroud)
Ansible字典
databases:
db1:
db_resource: jdbc/db1
db_maxidle: 50
db_maxconn: 350
db_maxwait: 10000
db_user: dbuser
db_pass: "{{ dbpass }}"
db_url: jdbc:postgresql://server:5432/dbname
db_driver: org.postgresql.Driver
Run Code Online (Sandbox Code Playgroud)
Jinja2模板
{% for items in databases …Run Code Online (Sandbox Code Playgroud) 我vars在我的ansible playbook中有以下内容我得到了以下结构
domains:
- { main: 'local1.com', sans: ['test.local1.com', 'test2.local.com'] }
- { main: 'local3.com' }
- { main: 'local4.com' }
Run Code Online (Sandbox Code Playgroud)
并且在我的内部有以下内容 conf.j2
{% for domain in domains %}
[[acme.domains]]
{% for key, value in domain.iteritems() %}
{% if value is string %}
{{ key }} = "{{ value }}"
{% else %}
{{ key }} = {{ value }}
{% endif %}
{% endfor %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
现在,当我进入VM并查看文件时,我得到以下内容:
产量
[[acme.domains]]
main = "local1.com
sans = [u'test.local1.com', …Run Code Online (Sandbox Code Playgroud)