I have a task with run_once:true , which must run only on the first host and I need to use that hostname into a lookup file , something like this:
name: Print facts
debug:
var: ansible_nodename
register: admin_host
- name: Set authorized key took from file
become: yes
authorized_key:
user: root
state: present
key: “{{ lookup(‘file’, ‘/git/cephprep/files/{{ admin_host }}/root/.ssh/id_rsa.pub’) }}”
Just this way it’s not working
dnmvisser
(Dick Visser)
July 28, 2022, 4:38pm
2
You can’t stack moustaches
Not working unfortunately…:
TASK [cephprep : Print facts] ************************************************************************************************************************************************************************************
task path: /git/cephprep/tasks/keyprep.yml:19
ok: [ha01] => {
“ansible_facts["nodename"]”: “ha01”
}
TASK [cephprep : Set authorized key took from file] **************************************************************************************************************************************************************
task path: /git/cephprep/tasks/keyprep.yml:24
fatal: [ha01]: FAILED! => {“msg”: “template error while templating string: unexpected ‘~’. String: {{ lookup(‘file’, ‘/git/cephprep/files/’ ~ ~ ‘/root/.ssh/id_rsa.pub’) }}”}
fatal: [ha02]: FAILED! => {“msg”: “template error while templating string: unexpected ‘~’. String: {{ lookup(‘file’, ‘/git/cephprep/files/’ ~ ~ ‘/root/.ssh/id_rsa.pub’) }}”}
fatal: [ha03]: FAILED! => {“msg”: “template error while templating string: unexpected ‘~’. String: {{ lookup(‘file’, ‘/git/cephprep/files/’ ~ ~ ‘/root/.ssh/id_rsa.pub’) }}”}
Sorry, actually this is the result:
[WARNING]: Unable to find ‘/git/cephprep/files/{‘ansible_facts[“nodename”]’: ‘ha01’, ‘failed’: False, ‘changed’: False}/root/.ssh/id_rsa.pub’ in expected paths (use -vvvvv to see paths)
dnmvisser
(Dick Visser)
July 28, 2022, 4:57pm
5
Just copy paste with the computer clipboard and not with eyeballs and fingers
Are all the tasks inside one playbook, or are different tasks in different jobs in an ansible tower workflow?
Use set_fact for within-playbook, and set_stats for creating artifacts sent back to ansible tower to be presented as extra_vars to downstream jobs in a workflow.
For within-playbook:
set_fact:
admin_host: “{{ ansible_nodename }}”
For downstream jobs in a workflow:
set_stats:
data:
admin_host: “{{ ansible_nodename }}”
If you need both you can do both. An artifact created with set_stats in a playbook cannot be used later in that same playbook as a variable. You have to use set_fact for that.
For loading your file within the playbook or downstream
name: Set authorized key took from file
become: yes
authorized_key:
user: root
state: present
key: “{{ lookup(‘file’, ‘/git/cephprep/files/’ + admin_host + ' /root/.ssh/id_rsa.pub’) }}”
NOTE that I broke up the file path and inserted the admin_host with “+” which in Python (ansible runs on Python) will concatenate strings.
I actually worked, Thanks!